xref: /AOO41X/main/sfx2/source/doc/objcont.cxx (revision 49bd4d4b0041a732963ad6f2f737c048ee2652b5)
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
operator >(const util::DateTime & i_rLeft,const util::DateTime & i_rRight)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>
GetPreviewMetaFile(sal_Bool bFullContent) const119 SfxObjectShell::GetPreviewMetaFile( sal_Bool bFullContent ) const
120 {
121     return CreatePreviewMetaFile_Impl( bFullContent, sal_False );
122 }
123 
124 
125 ::boost::shared_ptr<GDIMetaFile>
CreatePreviewMetaFile_Impl(sal_Bool bFullContent,sal_Bool bHighContrast) const126 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     // #120038# use local incarnation, so deletion cannot be forgotten
170     const SvtCTLOptions aCTLOptions;
171 
172     if ( SvtCTLOptions::NUMERALS_HINDI == aCTLOptions.GetCTLTextNumerals() )
173         eLang = LANGUAGE_ARABIC_SAUDI_ARABIA;
174     else if ( SvtCTLOptions::NUMERALS_ARABIC == aCTLOptions.GetCTLTextNumerals() )
175         eLang = LANGUAGE_ENGLISH;
176     else
177         eLang = (LanguageType) Application::GetSettings().GetLanguage();
178 
179     aDevice.SetDigitLanguage( eLang );
180 
181     ((SfxObjectShell*)this)->DoDraw( &aDevice, Point(0,0), aTmpSize, JobSetup(), nAspect );
182     pFile->Stop();
183 
184     return pFile;
185 }
186 
187 //====================================================================
188 
UpdateDocInfoForSave()189 void SfxObjectShell::UpdateDocInfoForSave()
190 {
191     uno::Reference<document::XDocumentProperties> xDocProps(getDocProperties());
192 
193     // clear user data if recommend (see 'Tools - Options - Open/StarOffice - Security')
194     if ( SvtSecurityOptions().IsOptionSet(
195             SvtSecurityOptions::E_DOCWARN_REMOVEPERSONALINFO ) )
196     {
197         xDocProps->resetUserData( ::rtl::OUString() );
198     }
199     else if ( IsModified() )
200     {
201         String aUserName = SvtUserOptions().GetFullName();
202         if ( !IsUseUserData() )
203         {
204             // remove all data pointing to the current user
205             if (xDocProps->getAuthor().equals(aUserName)) {
206                 xDocProps->setAuthor( ::rtl::OUString() );
207             }
208             xDocProps->setModifiedBy( ::rtl::OUString() );
209             if (xDocProps->getPrintedBy().equals(aUserName)) {
210                 xDocProps->setPrintedBy( ::rtl::OUString() );
211             }
212         }
213         else
214         {
215             // update ModificationAuthor, revision and editing time
216             ::DateTime now;
217             xDocProps->setModificationDate( util::DateTime(
218                 now.Get100Sec(), now.GetSec(), now.GetMin(),
219                 now.GetHour(), now.GetDay(), now.GetMonth(),
220                 now.GetYear() ) );
221             xDocProps->setModifiedBy( aUserName );
222             if ( !HasName() || pImp->bIsSaving )
223                 // QUESTION: not in case of "real" SaveAs as this is meant to create a new document
224                 UpdateTime_Impl( xDocProps );
225         }
226     }
227 }
228 
229 //--------------------------------------------------------------------
230 
231 static void
lcl_add(util::Duration & rDur,Time const & rTime)232 lcl_add(util::Duration & rDur, Time const& rTime)
233 {
234     // here we don't care about overflow: rDur is converted back to seconds
235     // anyway, and Time cannot store more than ~4000 hours
236     rDur.Hours   += rTime.GetHour();
237     rDur.Minutes += rTime.GetMin();
238     rDur.Seconds += rTime.GetSec();
239 }
240 
241 // Bearbeitungszeit aktualisieren
UpdateTime_Impl(const uno::Reference<document::XDocumentProperties> & i_xDocProps)242 void SfxObjectShell::UpdateTime_Impl(
243     const uno::Reference<document::XDocumentProperties> & i_xDocProps)
244 {
245     // Get old time from documentinfo
246     const sal_Int32 secs = i_xDocProps->getEditingDuration();
247     util::Duration editDuration(sal_False, 0, 0, 0,
248             secs/3600, (secs%3600)/60, secs%60, 0);
249 
250     // Initialize some local member! Its neccessary for wollow operations!
251     DateTime    aNow                    ;   // Date and time at current moment
252     Time        n24Time     (24,0,0,0)  ;   // Time-value for 24 hours - see follow calculation
253     sal_uIntPtr     nDays       = 0         ;   // Count of days between now and last editing
254     Time        nAddTime    (0)         ;   // Value to add on aOldTime
255 
256     // Safe impossible cases!
257     // User has changed time to the past between last editing and now ... its not possible!!!
258     DBG_ASSERT( !(aNow.GetDate()<pImp->nTime.GetDate()), "Timestamp of last change is in the past ?!..." );
259 
260     // Do the follow only, if user has NOT changed time to the past.
261     // Else add a time of 0 to aOldTime ... !!!
262     if (aNow.GetDate()>=pImp->nTime.GetDate())
263     {
264         // Get count of days last editing.
265         nDays = aNow.GetSecFromDateTime(pImp->nTime.GetDate())/86400 ;
266 
267         if (nDays==0)
268         {
269             // If no day between now and last editing - calculate time directly.
270             nAddTime    =   (const Time&)aNow - (const Time&)pImp->nTime ;
271         }
272         else
273         // If time of working without save greater then 1 month (!) ....
274         // we add 0 to aOldTime!
275         if (nDays<=31)
276         {
277             // If 1 or up to 31 days between now and last editing - calculate time indirectly.
278             // nAddTime = (24h - nTime) + (nDays * 24h) + aNow
279             --nDays;
280             nAddTime     =  nDays*n24Time.GetTime() ;
281             nAddTime    +=  n24Time-(const Time&)pImp->nTime        ;
282             nAddTime    +=  aNow                    ;
283         }
284 
285         lcl_add(editDuration, nAddTime);
286     }
287 
288     pImp->nTime = aNow;
289     try {
290         const sal_Int32 newSecs( (editDuration.Hours*3600)
291             + (editDuration.Minutes*60) + editDuration.Seconds);
292         i_xDocProps->setEditingDuration(newSecs);
293         i_xDocProps->setEditingCycles(i_xDocProps->getEditingCycles() + 1);
294     }
295     catch (lang::IllegalArgumentException &)
296     {
297         // ignore overflow
298     }
299 }
300 
301 //--------------------------------------------------------------------
302 
CreateDocumentInfoDialog(Window * pParent,const SfxItemSet & rSet)303 SfxDocumentInfoDialog* SfxObjectShell::CreateDocumentInfoDialog
304 (
305     Window*             pParent,
306     const SfxItemSet&   rSet
307 )
308 {
309     return new SfxDocumentInfoDialog(pParent, rSet);
310 }
311 
312 //--------------------------------------------------------------------
313 
GetStyleSheetPool()314 SfxStyleSheetBasePool* SfxObjectShell::GetStyleSheetPool()
315 {
316     return 0;
317 }
318 
SetOrganizerSearchMask(SfxStyleSheetBasePool * pStylePool) const319 void SfxObjectShell::SetOrganizerSearchMask(
320     SfxStyleSheetBasePool* pStylePool) const
321 {
322     pStylePool->SetSearchMask(
323         SFX_STYLE_FAMILY_ALL,
324         SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED);
325 }
326 
327 //--------------------------------------------------------------------
328 
GetContentCount(sal_uInt16 nIdx1,sal_uInt16)329 sal_uInt16 SfxObjectShell::GetContentCount(
330     sal_uInt16 nIdx1,
331     sal_uInt16 /*nIdx2*/)
332 {
333     switch(nIdx1)
334     {
335         case INDEX_IGNORE:
336             return DEF_CONTENT_COUNT;
337         case CONTENT_STYLE:
338         {
339             SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
340             if(!pStylePool)
341                 return 0;
342             SetOrganizerSearchMask(pStylePool);
343             return pStylePool->Count();
344         }
345         case CONTENT_MACRO:
346             break;
347 /*
348         case CONTENT_CONFIG:
349             return ( GetConfigManager() ) ?
350                         GetConfigManager()->GetItemCount() : 0;
351             break;
352  */
353     }
354     return 0;
355 }
356 
357 
358 //--------------------------------------------------------------------
359 //TODO/CLEANUP: remove this method (it's virtual)
TriggerHelpPI(sal_uInt16 nIdx1,sal_uInt16 nIdx2,sal_uInt16)360 void  SfxObjectShell::TriggerHelpPI(sal_uInt16 nIdx1, sal_uInt16 nIdx2, sal_uInt16)
361 {
362     if(nIdx1==CONTENT_STYLE && nIdx2 != INDEX_IGNORE) //StyleSheets
363     {
364         SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
365         SetOrganizerSearchMask(pStylePool);
366     }
367 }
368 
CanHaveChilds(sal_uInt16 nIdx1,sal_uInt16 nIdx2)369 sal_Bool   SfxObjectShell::CanHaveChilds(sal_uInt16 nIdx1,
370                                        sal_uInt16 nIdx2)
371 {
372     switch(nIdx1) {
373     case INDEX_IGNORE:
374         return sal_True;
375     case CONTENT_STYLE:
376         return INDEX_IGNORE == nIdx2 || !GetStyleSheetPool()? sal_False: sal_True;
377     case CONTENT_MACRO:
378 //!!    return INDEX_IGNORE == nIdx2? sal_False: sal_True;
379         return sal_False;
380 /*
381     case CONTENT_CONFIG:
382         return INDEX_IGNORE == nIdx2 ? sal_False : sal_True;
383  */
384     }
385     return sal_False;
386 }
387 
388 //--------------------------------------------------------------------
389 
GetContent(String & rText,Bitmap & rClosedBitmap,Bitmap & rOpenedBitmap,sal_Bool & bCanDel,sal_uInt16 i,sal_uInt16 nIdx1,sal_uInt16 nIdx2)390 void SfxObjectShell::GetContent(String &rText,
391                                 Bitmap &rClosedBitmap,
392                                 Bitmap &rOpenedBitmap,
393                                 sal_Bool &bCanDel,
394                                 sal_uInt16 i,
395                                 sal_uInt16 nIdx1,
396                                 sal_uInt16 nIdx2 )
397 {
398     DBG_ERRORFILE( "Non high contrast method called. Please update calling code!" );
399     SfxObjectShell::GetContent( rText, rClosedBitmap, rOpenedBitmap, BMP_COLOR_NORMAL, bCanDel, i, nIdx1, nIdx2 );
400 }
401 
402 //--------------------------------------------------------------------
403 
GetContent(String & rText,Bitmap & rClosedBitmap,Bitmap & rOpenedBitmap,BmpColorMode eColorMode,sal_Bool & bCanDel,sal_uInt16 i,sal_uInt16 nIdx1,sal_uInt16)404 void   SfxObjectShell::GetContent(String &rText,
405                                   Bitmap &rClosedBitmap,
406                                   Bitmap &rOpenedBitmap,
407                                   BmpColorMode eColorMode,
408                                   sal_Bool &bCanDel,
409                                   sal_uInt16 i,
410                                   sal_uInt16 nIdx1,
411                                   sal_uInt16 /*nIdx2*/ )
412 {
413     bCanDel=sal_True;
414 
415     switch(nIdx1)
416     {
417         case INDEX_IGNORE:
418         {
419             sal_uInt16 nTextResId = 0;
420             sal_uInt16 nClosedBitmapResId = 0; // evtl. sp"ater mal unterschiedliche
421             sal_uInt16 nOpenedBitmapResId = 0; // "     "       "   "
422             switch(i)
423             {
424                 case CONTENT_STYLE:
425                     nTextResId = STR_STYLES;
426                     if ( eColorMode == BMP_COLOR_NORMAL )
427                     {
428                         nClosedBitmapResId= BMP_STYLES_CLOSED;
429                         nOpenedBitmapResId= BMP_STYLES_OPENED;
430                     }
431                     else
432                     {
433                         nClosedBitmapResId= BMP_STYLES_CLOSED_HC;
434                         nOpenedBitmapResId= BMP_STYLES_OPENED_HC;
435                     }
436                     break;
437                 case CONTENT_MACRO:
438                     nTextResId = STR_MACROS;
439                     if ( eColorMode == BMP_COLOR_NORMAL )
440                     {
441                         nClosedBitmapResId= BMP_STYLES_CLOSED;
442                         nOpenedBitmapResId= BMP_STYLES_OPENED;
443                     }
444                     else
445                     {
446                         nClosedBitmapResId= BMP_STYLES_CLOSED_HC;
447                         nOpenedBitmapResId= BMP_STYLES_OPENED_HC;
448                     }
449                     break;
450 /*
451                 case CONTENT_CONFIG:
452                     nTextResId = STR_CONFIG;
453                     nClosedBitmapResId= BMP_STYLES_CLOSED;
454                     nOpenedBitmapResId= BMP_STYLES_OPENED;
455                     break;
456  */
457             }
458 
459             if ( nTextResId )
460             {
461                 rText  = String(SfxResId(nTextResId));
462                 rClosedBitmap = Bitmap(SfxResId(nClosedBitmapResId));
463                 rOpenedBitmap = Bitmap(SfxResId(nOpenedBitmapResId));
464             }
465             break;
466         }
467 
468         case CONTENT_STYLE:
469         {
470             SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
471             SetOrganizerSearchMask(pStylePool);
472             SfxStyleSheetBase *pStyle = (*pStylePool)[i];
473             rText = pStyle->GetName();
474             bCanDel=((pStyle->GetMask() & SFXSTYLEBIT_USERDEF)
475                      == SFXSTYLEBIT_USERDEF);
476             rClosedBitmap = rOpenedBitmap =
477                 GetStyleFamilyBitmap(pStyle->GetFamily(), eColorMode );
478         }
479             break;
480         case CONTENT_MACRO:
481             break;
482 /*
483         case CONTENT_CONFIG:
484             if ( GetConfigManager() )
485             {
486                 rText = GetConfigManager()->GetItem(i);
487                 bCanDel = GetConfigManager()->CanDelete(i);
488             }
489             else
490                 rText = String();
491             rClosedBitmap = Bitmap(SfxResId(BMP_STYLES_CLOSED));
492             rOpenedBitmap = Bitmap(SfxResId(BMP_STYLES_OPENED));
493             break;
494 */
495     }
496 }
497 
498 //--------------------------------------------------------------------
GetStyleFamilyBitmap(SfxStyleFamily eFamily)499 Bitmap SfxObjectShell::GetStyleFamilyBitmap( SfxStyleFamily eFamily )
500 {
501     DBG_ERRORFILE( "Non high contrast method called. Please update calling code!" );
502     return SfxObjectShell::GetStyleFamilyBitmap( eFamily, BMP_COLOR_NORMAL );
503 }
504 
505 //--------------------------------------------------------------------
506 
GetStyleFamilyBitmap(SfxStyleFamily eFamily,BmpColorMode eColorMode)507 Bitmap SfxObjectShell::GetStyleFamilyBitmap(SfxStyleFamily eFamily, BmpColorMode eColorMode )
508 {
509     sal_uInt16 nResId = 0;
510     switch(eFamily)
511     {
512         case SFX_STYLE_FAMILY_CHAR:
513             nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY1 : BMP_STYLES_FAMILY1_HC;
514             break;
515         case SFX_STYLE_FAMILY_PARA:
516             nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY2 : BMP_STYLES_FAMILY2_HC;
517             break;
518         case SFX_STYLE_FAMILY_FRAME:
519             nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY3 : BMP_STYLES_FAMILY3_HC;
520             break;
521         case SFX_STYLE_FAMILY_PAGE :
522             nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY4 : BMP_STYLES_FAMILY4_HC;
523             break;
524         case SFX_STYLE_FAMILY_PSEUDO:
525         case SFX_STYLE_FAMILY_ALL:
526             break;
527     }
528 
529     if ( nResId )
530         return Bitmap(SfxResId(nResId));
531     else
532         return Bitmap();
533 }
534 
535 
536 //--------------------------------------------------------------------
537 
Insert(SfxObjectShell & rSource,sal_uInt16 nSourceIdx1,sal_uInt16 nSourceIdx2,sal_uInt16,sal_uInt16 & nIdx1,sal_uInt16 & nIdx2,sal_uInt16 &,sal_uInt16 &)538 sal_Bool SfxObjectShell::Insert(SfxObjectShell &rSource,
539                               sal_uInt16 nSourceIdx1,
540                               sal_uInt16 nSourceIdx2,
541                               sal_uInt16 /*nSourceIdx3*/,
542                               sal_uInt16 &nIdx1,
543                               sal_uInt16 &nIdx2,
544                               sal_uInt16 &/*nIdx3*/,
545                               sal_uInt16 &/*nDeleted*/)
546 {
547     sal_Bool bRet = sal_False;
548 
549     if (INDEX_IGNORE == nIdx1 && CONTENT_STYLE == nSourceIdx1)
550         nIdx1 = CONTENT_STYLE;
551 
552     if (CONTENT_STYLE == nSourceIdx1 && CONTENT_STYLE == nIdx1)
553     {
554         SfxStyleSheetBasePool* pHisPool  = rSource.GetStyleSheetPool();
555         SfxStyleSheetBasePool* pMyPool   = GetStyleSheetPool();
556         SetOrganizerSearchMask(pHisPool);
557         SetOrganizerSearchMask(pMyPool);
558         SfxStyleSheetBase* pHisSheet = NULL;
559 
560         if ( pHisPool && pHisPool->Count() > nSourceIdx2 )
561             pHisSheet = (*pHisPool)[nSourceIdx2];
562 
563         // Einfuegen ist nur dann noetig, wenn ein StyleSheet
564         // zwischen unterschiedlichen(!) Pools bewegt wird
565 
566         if ( pHisSheet && pMyPool != pHisPool )
567         {
568             if (INDEX_IGNORE == nIdx2)
569             {
570                 nIdx2 = pMyPool->Count();
571             }
572 
573             // wenn so eine Vorlage schon existiert: loeschen!
574             String aOldName(pHisSheet->GetName());
575             SfxStyleFamily eOldFamily = pHisSheet->GetFamily();
576 
577             SfxStyleSheetBase* pExist = pMyPool->Find(aOldName, eOldFamily);
578             // sal_uInt16 nOldHelpId = pExist->GetHelpId(??? VB ueberlegt sich was);
579             sal_Bool bUsedOrUserDefined;
580             if( pExist )
581             {
582                 bUsedOrUserDefined =
583                     pExist->IsUsed() || pExist->IsUserDefined();
584                 if( ErrorHandler::HandleError(
585                     *new MessageInfo( ERRCODE_SFXMSG_STYLEREPLACE, aOldName ) )
586                     != ERRCODE_BUTTON_OK )
587                     return sal_False;
588                 else
589                 {
590                     pMyPool->Replace( *pHisSheet, *pExist );
591                     SetModified( sal_True );
592                     nIdx2 = nIdx1 = INDEX_IGNORE;
593                     return sal_True;
594                 }
595             }
596 
597             SfxStyleSheetBase& rNewSheet = pMyPool->Make(
598                 aOldName, eOldFamily,
599                 pHisSheet->GetMask(), nIdx2);
600 
601             // ItemSet der neuen Vorlage fuellen
602             rNewSheet.GetItemSet().Set(pHisSheet->GetItemSet());
603 
604             // wer bekommt den Neuen als Parent? wer benutzt den Neuen als Follow?
605             SfxStyleSheetBase* pTestSheet = pMyPool->First();
606             while (pTestSheet)
607             {
608                 if (pTestSheet->GetFamily() == eOldFamily &&
609                     pTestSheet->HasParentSupport() &&
610                     pTestSheet->GetParent() == aOldName)
611                 {
612                     pTestSheet->SetParent(aOldName);
613                     // Verknuepfung neu aufbauen
614                 }
615 
616                 if (pTestSheet->GetFamily() == eOldFamily &&
617                     pTestSheet->HasFollowSupport() &&
618                     pTestSheet->GetFollow() == aOldName)
619                 {
620                     pTestSheet->SetFollow(aOldName);
621                     // Verknuepfung neu aufbauen
622                 }
623 
624                 pTestSheet = pMyPool->Next();
625             }
626             bUsedOrUserDefined =
627                 rNewSheet.IsUsed() || rNewSheet.IsUserDefined();
628 
629 
630             // hat der Neue einen Parent? wenn ja, mit gleichem Namen bei uns suchen
631             if (pHisSheet->HasParentSupport())
632             {
633                 const String& rParentName = pHisSheet->GetParent();
634                 if (0 != rParentName.Len())
635                 {
636                     SfxStyleSheetBase* pParentOfNew =
637                         pMyPool->Find(rParentName, eOldFamily);
638                     if (pParentOfNew)
639                         rNewSheet.SetParent(rParentName);
640                 }
641             }
642 
643             // hat der Neue einen Follow? wenn ja, mit gleichem
644             // Namen bei uns suchen
645             if (pHisSheet->HasFollowSupport())
646             {
647                 const String& rFollowName = pHisSheet->GetFollow();
648                 if (0 != rFollowName.Len())
649                 {
650                     SfxStyleSheetBase* pFollowOfNew =
651                         pMyPool->Find(rFollowName, eOldFamily);
652                     if (pFollowOfNew)
653                         rNewSheet.SetFollow(rFollowName);
654                 }
655             }
656 
657             SetModified( sal_True );
658             if( !bUsedOrUserDefined ) nIdx2 = nIdx1 = INDEX_IGNORE;
659 
660             bRet = sal_True;
661         }
662         else
663             bRet = sal_False;
664     }
665 /*
666     else if (nSourceIdx1 == CONTENT_CONFIG)
667     {
668         nIdx1 = CONTENT_CONFIG;
669 
670         SfxConfigManager *pCfgMgr = SFX_CFGMANAGER();
671         if ( !GetConfigManager() )
672         {
673             SetConfigManager(new SfxConfigManager(0, pCfgMgr));
674             SetTemplateConfig(sal_False);
675             if (this == Current())
676                 GetConfigManager()->Activate(pCfgMgr);
677         }
678 
679         if (GetConfigManager()->CopyItem(
680             nSourceIdx2, nIdx2, rSource.GetConfigManager()))
681         {
682             SetModified(sal_True);
683             bRet = sal_True;
684             SFX_APP()->GetDispatcher_Impl()->Update_Impl(sal_True);
685         }
686     }
687 */
688     return bRet;
689 }
690 
691 //--------------------------------------------------------------------
692 
Remove(sal_uInt16 nIdx1,sal_uInt16 nIdx2,sal_uInt16)693 sal_Bool SfxObjectShell::Remove
694 (
695     sal_uInt16 nIdx1,
696     sal_uInt16 nIdx2,
697     sal_uInt16 /*nIdx3*/
698 )
699 {
700     sal_Bool bRet = sal_False;
701 
702     if (CONTENT_STYLE == nIdx1)
703     {
704         SfxStyleSheetBasePool* pMyPool  = GetStyleSheetPool();
705 
706         SetOrganizerSearchMask(pMyPool);
707 
708         SfxStyleSheetBase* pMySheet =  (*pMyPool)[nIdx2];
709         String aName(pMySheet->GetName());
710         String aEmpty;
711         SfxStyleFamily  eFamily = pMySheet->GetFamily();
712         pMyPool->Remove(pMySheet);
713         bRet = sal_True;
714 
715         SfxStyleSheetBase* pTestSheet = pMyPool->First();
716         while (pTestSheet)
717         {
718             if (pTestSheet->GetFamily() == eFamily &&
719                 pTestSheet->HasParentSupport() &&
720                 pTestSheet->GetParent() == aName)
721             {
722                 pTestSheet->SetParent(aEmpty); // Verknuepfung aufloesen
723             }
724 
725             if (pTestSheet->GetFamily() == eFamily &&
726                 pTestSheet->HasFollowSupport() &&
727                 pTestSheet->GetFollow() == aName)
728             {
729                 pTestSheet->SetFollow(aEmpty); // Verknuepfung aufloesen
730             }
731 
732             pTestSheet = pMyPool->Next();
733         }
734 
735         SetModified( sal_True );
736     }
737 
738     return bRet;
739 }
740 
741 //--------------------------------------------------------------------
742 
Print(Printer & rPrt,sal_uInt16 nIdx1,sal_uInt16,sal_uInt16,const String * pObjectName)743 sal_Bool SfxObjectShell::Print
744 (
745     Printer&        rPrt,
746     sal_uInt16          nIdx1,
747     sal_uInt16          /*nIdx2*/,
748     sal_uInt16          /*nIdx3*/,
749     const String*   pObjectName
750 )
751 
752 /*  [Beschreibung]
753 */
754 
755 {
756     switch(nIdx1)
757     {
758       case CONTENT_STYLE:
759         {
760             SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
761             SetOrganizerSearchMask(pStylePool);
762             SfxStyleSheetIteratorPtr pIter = pStylePool->CreateIterator( pStylePool->GetSearchFamily(), pStylePool->GetSearchMask() );
763             sal_uInt16 nStyles = pIter->Count();
764             SfxStyleSheetBase *pStyle = pIter->First();
765             if ( !pStyle )
766                 return sal_True;
767 
768             // pepare adaptor for old style StartPage/EndPage printing
769             boost::shared_ptr< Printer > pPrinter( new Printer( rPrt.GetJobSetup() ) );
770             vcl::OldStylePrintAdaptor* pAdaptor = new vcl::OldStylePrintAdaptor( pPrinter );
771             boost::shared_ptr< vcl::PrinterController > pController( pAdaptor );
772 
773             pAdaptor->StartPage();
774 
775             pPrinter->SetMapMode(MapMode(MAP_10TH_MM));
776             Font aFont( DEFINE_CONST_UNICODE( "Arial" ), Size(0, 64));   // 18pt
777             aFont.SetWeight(WEIGHT_BOLD);
778             pPrinter->SetFont(aFont);
779             const Size aPageSize(pPrinter->GetOutputSize());
780             const sal_uInt16 nXIndent = 200;
781             sal_uInt16 nYIndent = 200;
782             Point aOutPos(nXIndent, nYIndent);
783             String aHeader(SfxResId(STR_PRINT_STYLES_HEADER));
784             if ( pObjectName )
785                 aHeader += *pObjectName;
786             else
787                 aHeader += GetTitle();
788             long nTextHeight( pPrinter->GetTextHeight() );
789             pPrinter->DrawText(aOutPos, aHeader);
790             aOutPos.Y() += nTextHeight;
791             aOutPos.Y() += nTextHeight/2;
792             aFont.SetSize(Size(0, 35)); // 10pt
793             nStyles = 1;
794             while(pStyle)
795             {
796                 // print template name
797                 String aStr(pStyle->GetName());
798                 aFont.SetWeight(WEIGHT_BOLD);
799                 pPrinter->SetFont(aFont);
800                 nTextHeight = pPrinter->GetTextHeight();
801                 // check for new page
802                 if ( aOutPos.Y() + nTextHeight*2 >
803                     aPageSize.Height() - (long) nYIndent )
804                 {
805                     pAdaptor->EndPage();
806                     pAdaptor->StartPage();
807                     aOutPos.Y() = nYIndent;
808                 }
809                 pPrinter->DrawText(aOutPos, aStr);
810                 aOutPos.Y() += nTextHeight;
811 
812                 // print template description
813                 aFont.SetWeight(WEIGHT_NORMAL);
814                 pPrinter->SetFont(aFont);
815                 aStr = pStyle->GetDescription();
816                 const char cDelim = ' ';
817                 sal_uInt16 nStart = 0, nIdx = 0;
818 
819                 nTextHeight = pPrinter->GetTextHeight();
820                 // break text into lines
821                 while(nIdx < aStr.Len())
822                 {
823                     sal_uInt16  nOld = nIdx;
824                     long nTextWidth;
825                     nIdx = aStr.Search(cDelim, nStart);
826                     nTextWidth = pPrinter->GetTextWidth(aStr, nStart, nIdx-nStart);
827                     while(nIdx != STRING_NOTFOUND &&
828                           aOutPos.X() + nTextWidth <
829                           aPageSize.Width() - (long) nXIndent)
830                     {
831                         nOld = nIdx;
832                         nIdx = aStr.Search(cDelim, nIdx+1);
833                         nTextWidth = pPrinter->GetTextWidth(aStr, nStart, nIdx-nStart);
834                     }
835                     String aTmp(aStr, nStart, nIdx == STRING_NOTFOUND?
836                                 STRING_LEN :
837                                 nOld-nStart);
838                     if ( aTmp.Len() )
839                     {
840                         nStart = nOld+1;    // trailing space
841                     }
842                     else
843                     {
844                         sal_uInt16 nChar = 1;
845                         while(
846                             nStart + nChar < aStr.Len() &&
847                             aOutPos.X() + pPrinter->GetTextWidth(
848                                 aStr, nStart, nChar) <
849                             aPageSize.Width() - nXIndent)
850                             ++nChar;
851                         aTmp = String(aStr, nStart, nChar-1);
852                         nIdx = nStart + nChar;
853                         nStart = nIdx;
854                     }
855                     if ( aOutPos.Y() + nTextHeight*2 >
856                         aPageSize.Height() - nYIndent )
857                     {
858                         pAdaptor->EndPage();
859                         pAdaptor->StartPage();
860                         aOutPos.Y() = nYIndent;
861                     }
862                     pPrinter->DrawText(aOutPos, aTmp);
863                     aOutPos.Y() += pPrinter->GetTextHeight();
864                 }
865                 pStyle = pIter->Next();
866             }
867             pAdaptor->EndPage();
868 
869             Printer::PrintJob( pController, rPrt.GetJobSetup() );
870 
871             break;
872         }
873       default:
874           return sal_False;
875     }
876     return sal_True;
877 }
878 
879 //--------------------------------------------------------------------
880 
LoadStyles(SfxObjectShell & rSource)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 
UpdateFromTemplate_Impl()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 
IsHelpDocument() const1091 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 
ResetFromTemplate(const String & rTemplateName,const String & rFileName)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 
IsQueryLoadTemplate() const1132 sal_Bool SfxObjectShell::IsQueryLoadTemplate() const
1133 {
1134     return pImp->bQueryLoadTemplate;
1135 }
1136 
IsUseUserData() const1137 sal_Bool SfxObjectShell::IsUseUserData() const
1138 {
1139     return pImp->bUseUserData;
1140 }
1141 
SetQueryLoadTemplate(sal_Bool bNew)1142 void SfxObjectShell::SetQueryLoadTemplate( sal_Bool bNew )
1143 {
1144     if ( pImp->bQueryLoadTemplate != bNew )
1145         SetModified( sal_True );
1146     pImp->bQueryLoadTemplate = bNew;
1147 }
1148 
SetUseUserData(sal_Bool bNew)1149 void SfxObjectShell::SetUseUserData( sal_Bool bNew )
1150 {
1151     if ( pImp->bUseUserData != bNew )
1152         SetModified( sal_True );
1153     pImp->bUseUserData = bNew;
1154 }
1155 
IsLoadReadonly() const1156 sal_Bool SfxObjectShell::IsLoadReadonly() const
1157 {
1158     return pImp->bLoadReadonly;
1159 }
1160 
IsSaveVersionOnClose() const1161 sal_Bool SfxObjectShell::IsSaveVersionOnClose() const
1162 {
1163     return pImp->bSaveVersionOnClose;
1164 }
1165 
SetLoadReadonly(sal_Bool bNew)1166 void SfxObjectShell::SetLoadReadonly( sal_Bool bNew )
1167 {
1168     if ( pImp->bLoadReadonly != bNew )
1169         SetModified( sal_True );
1170     pImp->bLoadReadonly = bNew;
1171 }
1172 
SetSaveVersionOnClose(sal_Bool bNew)1173 void SfxObjectShell::SetSaveVersionOnClose( sal_Bool bNew )
1174 {
1175     if ( pImp->bSaveVersionOnClose != bNew )
1176         SetModified( sal_True );
1177     pImp->bSaveVersionOnClose = bNew;
1178 }
1179 
GetModifyPasswordHash() const1180 sal_uInt32 SfxObjectShell::GetModifyPasswordHash() const
1181 {
1182     return pImp->m_nModifyPasswordHash;
1183 }
1184 
SetModifyPasswordHash(sal_uInt32 nHash)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 
GetModifyPasswordInfo() const1199 uno::Sequence< beans::PropertyValue > SfxObjectShell::GetModifyPasswordInfo() const
1200 {
1201     return pImp->m_aModifyPasswordInfo;
1202 }
1203 
SetModifyPasswordInfo(const uno::Sequence<beans::PropertyValue> & aInfo)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 
SetModifyPasswordEntered(sal_Bool bEntered)1218 void SfxObjectShell::SetModifyPasswordEntered( sal_Bool bEntered )
1219 {
1220     pImp->m_bModifyPasswordEntered = bEntered;
1221 }
1222 
IsModifyPasswordEntered()1223 sal_Bool SfxObjectShell::IsModifyPasswordEntered()
1224 {
1225     return pImp->m_bModifyPasswordEntered;
1226 }
1227 
1228