xref: /AOO41X/main/sd/source/core/drawdoc.cxx (revision 7b6b9ddb4b63a97ea0214b9472b5270bbf674949)
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_sd.hxx"
26 
27 #include "PageListWatcher.hxx"
28 #include <com/sun/star/text/WritingMode.hpp>
29 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
30 #include <com/sun/star/i18n/ScriptType.hpp>
31 #include <editeng/forbiddencharacterstable.hxx>
32 
33 #include <svx/svxids.hrc>
34 #include <svl/srchitem.hxx>
35 #include <editeng/eeitem.hxx>
36 #include <editeng/scriptspaceitem.hxx>
37 
38 #include <unotools/useroptions.hxx>
39 
40 #include <sfx2/printer.hxx>
41 #include <sfx2/app.hxx>
42 #include <sfx2/linkmgr.hxx>
43 #include <svx/dialogs.hrc>
44 #include "Outliner.hxx"
45 #include "app.hxx"
46 #include <editeng/eeitem.hxx>
47 #include <editeng/editstat.hxx>
48 #include <editeng/fontitem.hxx>
49 #include <svl/flagitem.hxx>
50 #include <svx/svdoattr.hxx>
51 #include <svx/svdotext.hxx>
52 #include <editeng/bulitem.hxx>
53 #include <editeng/numitem.hxx>
54 #include <svx/svditer.hxx>
55 #include <editeng/unolingu.hxx>
56 #include <svl/itempool.hxx>
57 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
58 #include <svx/xtable.hxx>
59 #include <com/sun/star/linguistic2/XHyphenator.hpp>
60 #include <com/sun/star/linguistic2/XSpellChecker1.hpp>
61 #include <com/sun/star/beans/XPropertySet.hpp>
62 #include <editeng/outlobj.hxx>
63 #include <unotools/saveopt.hxx>
64 #include <comphelper/extract.hxx>
65 #include <i18npool/mslangid.hxx>
66 #include <unotools/charclass.hxx>
67 #include <comphelper/processfactory.hxx>
68 #ifndef _SVTOOLS_PATHOPTIONS_HXX_
69 #include <unotools/pathoptions.hxx>
70 #endif
71 #include <unotools/lingucfg.hxx>
72 #include <unotools/linguprops.hxx>
73 
74 #include "eetext.hxx"
75 #include "drawdoc.hxx"
76 #include "sdpage.hxx"
77 #include "pglink.hxx"
78 #include "sdattr.hxx"
79 #include "glob.hrc"
80 #include "glob.hxx"
81 #include "stlpool.hxx"
82 #include "sdiocmpt.hxx"
83 #include "sdresid.hxx"
84 #include "cusshow.hxx"
85 #include "../ui/inc/DrawDocShell.hxx"
86 #include "../ui/inc/GraphicDocShell.hxx"
87 #include "../ui/inc/sdxfer.hxx"
88 #include "../ui/inc/ViewShell.hxx"
89 #include "../ui/inc/optsitem.hxx"
90 #include "../ui/inc/FrameView.hxx"
91 
92 // #90477#
93 #include <tools/tenccvt.hxx>
94 
95 using ::rtl::OUString;
96 using namespace ::sd;
97 using namespace ::com::sun::star;
98 using namespace ::com::sun::star::uno;
99 using namespace ::com::sun::star::lang;
100 using namespace ::com::sun::star::linguistic2;
101 
102 //////////////////////////////////////////////////////////////////////////////
103 
104 TYPEINIT1( SdDrawDocument, FmFormModel );
105 
106 SdDrawDocument* SdDrawDocument::pDocLockedInsertingLinks = NULL;
107 
108 //////////////////////////////////////////////////////////////////////////////
109 
110 PresentationSettings::PresentationSettings()
111 :   mbAll( true ),
112     mbEndless( false ),
113     mbCustomShow(false),
114     mbManual( false ),
115     mbMouseVisible( false ),
116     mbMouseAsPen( false ),
117     mbLockedPages( false ),
118     mbAlwaysOnTop( false ),
119     mbFullScreen( true ),
120     mbAnimationAllowed( true ),
121     mnPauseTimeout( 10 ),
122     mbShowPauseLogo( false ),
123     mbStartWithNavigator(false)
124 {
125 }
126 
127 // ---------------------------------------------------------------------------
128 
129 PresentationSettings::PresentationSettings( const PresentationSettings& r )
130 :   maPresPage( r.maPresPage ),
131     mbAll( r.mbAll ),
132     mbEndless( r.mbEndless ),
133     mbCustomShow( r.mbCustomShow ),
134     mbManual( r.mbManual ),
135     mbMouseVisible( r.mbMouseVisible ),
136     mbMouseAsPen( r.mbMouseAsPen ),
137     mbLockedPages( r.mbLockedPages ),
138     mbAlwaysOnTop( r.mbAlwaysOnTop ),
139     mbFullScreen( r.mbFullScreen ),
140     mbAnimationAllowed( r.mbAnimationAllowed ),
141     mnPauseTimeout( r.mnPauseTimeout ),
142     mbShowPauseLogo( r.mbShowPauseLogo ),
143     mbStartWithNavigator( r.mbStartWithNavigator )
144 {
145 }
146 
147 // ---------------------------------------------------------------------------
148 
149 SdDrawDocument::SdDrawDocument(DocumentType eType, SfxObjectShell* pDrDocSh)
150 : FmFormModel( SvtPathOptions().GetPalettePath(), NULL, pDrDocSh )
151 , mpOutliner(NULL)
152 , mpInternalOutliner(NULL)
153 , mpWorkStartupTimer(NULL)
154 , mpOnlineSpellingTimer(NULL)
155 , mpOnlineSpellingList(NULL)
156 , mpOnlineSearchItem(NULL)
157 , mpFrameViewList( new List() )
158 , mpCustomShowList(NULL)
159 , mpDocSh(static_cast< ::sd::DrawDocShell*>(pDrDocSh))
160 , mpCreatingTransferable( NULL )
161 , mbHasOnlineSpellErrors(sal_False)
162 , mbInitialOnlineSpellingEnabled(sal_True)
163 , mbNewOrLoadCompleted(sal_False)
164 , mbStartWithPresentation( false )
165 , meLanguage( LANGUAGE_SYSTEM )
166 , meLanguageCJK( LANGUAGE_SYSTEM )
167 , meLanguageCTL( LANGUAGE_SYSTEM )
168 , mePageNumType(SVX_ARABIC)
169 , mbAllocDocSh(sal_False)
170 , meDocType(eType)
171 , mpCharClass(NULL)
172 , mpLocale(NULL)
173 , mpDrawPageListWatcher(0)
174 , mpMasterPageListWatcher(0)
175 {
176     // #109538#
177     mpDrawPageListWatcher = ::std::auto_ptr<ImpDrawPageListWatcher>(
178         new ImpDrawPageListWatcher(*this));
179     mpMasterPageListWatcher = ::std::auto_ptr<ImpMasterPageListWatcher>(
180         new ImpMasterPageListWatcher(*this));
181 
182     SetObjectShell(pDrDocSh);       // fuer das VCDrawModel
183 
184     if (mpDocSh)
185     {
186         SetSwapGraphics(sal_True);
187     }
188 
189     // Masseinheit (von App) und Massstab (von SdMod) setzen
190     sal_Int32 nX, nY;
191     SdOptions* pOptions = SD_MOD()->GetSdOptions(meDocType);
192     pOptions->GetScale( nX, nY );
193 
194     // #92067# Allow UI scale only for draw documents.
195     if( eType == DOCUMENT_TYPE_DRAW )
196         SetUIUnit( (FieldUnit)pOptions->GetMetric(), Fraction( nX, nY ) );  // user-defined
197     else
198         SetUIUnit( (FieldUnit)pOptions->GetMetric(), Fraction( 1, 1 ) );    // default
199 
200     SetScaleUnit(MAP_100TH_MM);
201     SetScaleFraction(Fraction(1, 1));
202     SetDefaultFontHeight(847);     // 24p
203 
204     pItemPool->SetDefaultMetric(SFX_MAPUNIT_100TH_MM);
205     pItemPool->FreezeIdRanges();
206     SetTextDefaults();
207 
208     // die DrawingEngine muss auch wissen, wo er ist
209     FmFormModel::SetStyleSheetPool( new SdStyleSheetPool( GetPool(), this ) );
210 
211     // Dem DrawOutliner den StyleSheetPool setzen, damit Textobjekte richtig
212     // eingelesen werden koennen. Der Link zum StyleRequest-Handler des
213     // Dokuments wird erst in NewOrLoadCompleted gesetzt, da erst dann alle
214     // Vorlagen existieren.
215     SdrOutliner& rOutliner = GetDrawOutliner();
216     rOutliner.SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
217     SetCalcFieldValueHdl( &rOutliner );
218 
219     // set linguistic options
220     {
221         const SvtLinguConfig    aLinguConfig;
222         SvtLinguOptions         aOptions;
223         aLinguConfig.GetOptions( aOptions );
224 
225         SetLanguage( MsLangId::resolveSystemLanguageByScriptType(aOptions.nDefaultLanguage,
226             ::com::sun::star::i18n::ScriptType::LATIN), EE_CHAR_LANGUAGE );
227         SetLanguage( MsLangId::resolveSystemLanguageByScriptType(aOptions.nDefaultLanguage_CJK,
228             ::com::sun::star::i18n::ScriptType::ASIAN), EE_CHAR_LANGUAGE_CJK );
229         SetLanguage( MsLangId::resolveSystemLanguageByScriptType(aOptions.nDefaultLanguage_CTL,
230             ::com::sun::star::i18n::ScriptType::COMPLEX), EE_CHAR_LANGUAGE_CTL );
231 
232         mbOnlineSpell = aOptions.bIsSpellAuto;
233     }
234 
235     LanguageType eRealLanguage = MsLangId::getRealLanguage( meLanguage );
236     mpLocale = new ::com::sun::star::lang::Locale( MsLangId::convertLanguageToLocale( eRealLanguage ));
237     mpCharClass = new CharClass( *mpLocale );
238 
239     // If the current application language is a language that uses right-to-left text...
240     LanguageType eRealCTLLanguage = Application::GetSettings().GetLanguage();
241     if( MsLangId::isRightToLeft( eRealCTLLanguage ) )
242     {
243         // ... then we have to set this as a default
244         SetDefaultWritingMode( ::com::sun::star::text::WritingMode_RL_TB );
245     }
246 
247     // for korean and japanese languages we have a different default for apply spacing between asian, latin and ctl text
248     if( ( LANGUAGE_KOREAN  == eRealCTLLanguage ) || ( LANGUAGE_KOREAN_JOHAB == eRealCTLLanguage ) || ( LANGUAGE_JAPANESE == eRealCTLLanguage ) )
249     {
250         GetPool().GetSecondaryPool()->SetPoolDefaultItem( SvxScriptSpaceItem( sal_False, EE_PARA_ASIANCJKSPACING ) );
251     }
252 
253     // DefTab und SpellOptions setzen
254     // Jetzt am Modul (SD)
255     sal_uInt16 nDefTab = pOptions->GetDefTab();
256     SetDefaultTabulator( nDefTab );
257 
258     try
259     {
260         Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
261         if ( xSpellChecker.is() )
262             rOutliner.SetSpeller( xSpellChecker );
263 
264         Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
265         if( xHyphenator.is() )
266             rOutliner.SetHyphenator( xHyphenator );
267 
268         SetForbiddenCharsTable( new SvxForbiddenCharactersTable( ::comphelper::getProcessServiceFactory() ) );
269     }
270     catch(...)
271     {
272         DBG_ERROR("Can't get SpellChecker");
273     }
274 
275     rOutliner.SetDefaultLanguage( Application::GetSettings().GetLanguage() );
276 
277     if (mpDocSh)
278     {
279         SetLinkManager( new sfx2::LinkManager(mpDocSh) );
280     }
281 
282     sal_uLong nCntrl = rOutliner.GetControlWord();
283     nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
284     nCntrl |= EE_CNTRL_URLSFXEXECUTE;
285 
286     if (mbOnlineSpell)
287         nCntrl |= EE_CNTRL_ONLINESPELLING;
288     else
289         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
290 
291     nCntrl &= ~ EE_CNTRL_ULSPACESUMMATION;
292     if ( meDocType != DOCUMENT_TYPE_IMPRESS )
293         SetSummationOfParagraphs( sal_False );
294     else
295     {
296         SetSummationOfParagraphs( pOptions->IsSummationOfParagraphs() );
297         if ( pOptions->IsSummationOfParagraphs() )
298             nCntrl |= EE_CNTRL_ULSPACESUMMATION;
299     }
300     rOutliner.SetControlWord(nCntrl);
301 
302     // Initialize the printer independent layout mode.
303     SetPrinterIndependentLayout (pOptions->GetPrinterIndependentLayout());
304 
305     // Dem HitTestOutliner den StyleSheetPool setzen.
306     // Der Link zum StyleRequest-Handler des
307     // Dokuments wird erst in NewOrLoadCompleted gesetzt, da erst dann alle
308     // Vorlagen existieren.
309     SfxItemSet aSet2( pHitTestOutliner->GetEmptyItemSet() );
310     pHitTestOutliner->SetStyleSheetPool( (SfxStyleSheetPool*)GetStyleSheetPool() );
311 
312     SetCalcFieldValueHdl( pHitTestOutliner );
313 
314     try
315     {
316         Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
317         if ( xSpellChecker.is() )
318             pHitTestOutliner->SetSpeller( xSpellChecker );
319 
320         Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
321         if( xHyphenator.is() )
322             pHitTestOutliner->SetHyphenator( xHyphenator );
323     }
324     catch(...)
325     {
326         DBG_ERROR("Can't get SpellChecker");
327     }
328 
329     pHitTestOutliner->SetDefaultLanguage( Application::GetSettings().GetLanguage() );
330 
331     sal_uLong nCntrl2 = pHitTestOutliner->GetControlWord();
332     nCntrl2 |= EE_CNTRL_ALLOWBIGOBJS;
333     nCntrl2 |= EE_CNTRL_URLSFXEXECUTE;
334     nCntrl2 &= ~EE_CNTRL_ONLINESPELLING;
335 
336     nCntrl2 &= ~ EE_CNTRL_ULSPACESUMMATION;
337     if ( pOptions->IsSummationOfParagraphs() )
338         nCntrl2 |= EE_CNTRL_ULSPACESUMMATION;
339 
340     pHitTestOutliner->SetControlWord( nCntrl2 );
341 
342     /**************************************************************************
343     * Layer anlegen
344     *
345     * Es werden auf Pages und MasterPages folgende Default-Layer angelegt:
346     *
347     * Layer STR_LAYOUT    : Standardlayer f�r alle Zeichenobjekte
348     *
349     * Layer STR_BCKGRND   : Hintergrund der MasterPage
350     *                       (auf normalen Pages z.Z. keine Verwendung)
351     *
352     * Layer STR_BCKGRNDOBJ: Objekte auf dem Hintergrund der MasterPage
353     *                       (auf normalen Pages z.Z. keine Verwendung)
354     *
355     * Layer STR_CONTROLS  : Standardlayer f�r Controls
356     *
357     **************************************************************************/
358     {
359         String aControlLayerName( SdResId(STR_LAYER_CONTROLS) );
360 
361         SdrLayerAdmin& rLayerAdmin = GetLayerAdmin();
362         rLayerAdmin.NewLayer( String(SdResId(STR_LAYER_LAYOUT)) );
363         rLayerAdmin.NewLayer( String(SdResId(STR_LAYER_BCKGRND)) );
364         rLayerAdmin.NewLayer( String(SdResId(STR_LAYER_BCKGRNDOBJ)) );
365         rLayerAdmin.NewLayer( aControlLayerName );
366         rLayerAdmin.NewLayer( String(SdResId(STR_LAYER_MEASURELINES)) );
367 
368         rLayerAdmin.SetControlLayerName(aControlLayerName);
369     }
370 
371 
372 }
373 
374 /*************************************************************************
375 |*
376 |* Destruktor
377 |*
378 \************************************************************************/
379 
380 SdDrawDocument::~SdDrawDocument()
381 {
382     Broadcast(SdrHint(HINT_MODELCLEARED));
383 
384     if (mpWorkStartupTimer)
385     {
386         if ( mpWorkStartupTimer->IsActive() )
387             mpWorkStartupTimer->Stop();
388 
389         delete mpWorkStartupTimer;
390         mpWorkStartupTimer = NULL;
391     }
392 
393     StopOnlineSpelling();
394     delete mpOnlineSearchItem;
395     mpOnlineSearchItem = NULL;
396 
397     CloseBookmarkDoc();
398     SetAllocDocSh(sal_False);
399 
400     // #116168#
401     ClearModel(sal_True);
402 
403     if (pLinkManager)
404     {
405         // BaseLinks freigeben
406         if ( pLinkManager->GetLinks().Count() )
407         {
408             pLinkManager->Remove( 0, pLinkManager->GetLinks().Count() );
409         }
410 
411         delete pLinkManager;
412         pLinkManager = NULL;
413     }
414 
415     ::sd::FrameView* pFrameView = NULL;
416 
417     for (sal_uLong i = 0; i < mpFrameViewList->Count(); i++)
418     {
419         // Ggf. FrameViews loeschen
420         pFrameView =
421             static_cast< ::sd::FrameView*>(mpFrameViewList->GetObject(i));
422 
423         if (pFrameView)
424             delete pFrameView;
425     }
426 
427     delete mpFrameViewList;
428     mpFrameViewList = NULL;
429 
430     if (mpCustomShowList)
431     {
432         for (sal_uLong j = 0; j < mpCustomShowList->Count(); j++)
433         {
434             // Ggf. CustomShows loeschen
435             SdCustomShow* pCustomShow = (SdCustomShow*) mpCustomShowList->GetObject(j);
436             delete pCustomShow;
437         }
438 
439         delete mpCustomShowList;
440         mpCustomShowList = NULL;
441     }
442 
443     delete mpOutliner;
444     mpOutliner = NULL;
445 
446     delete mpInternalOutliner;
447     mpInternalOutliner = NULL;
448 
449     delete mpLocale;
450     mpLocale = NULL;
451 
452     delete mpCharClass;
453     mpCharClass = NULL;
454 }
455 
456 /*************************************************************************
457 |*
458 |* Diese Methode erzeugt ein neues Dokument (SdDrawDocument) und gibt einen
459 |* Zeiger darauf zurueck. Die Drawing Engine benutzt diese Methode um das
460 |* Dokument oder Teile davon ins Clipboard/DragServer stellen zu koennen.
461 |*
462 \************************************************************************/
463 
464 SdrModel* SdDrawDocument::AllocModel() const
465 {
466     SdDrawDocument* pNewModel = NULL;
467 
468     if( mpCreatingTransferable )
469     {
470         // Dokument wird fuer Drag&Drop/Clipboard erzeugt, dafuer muss dem Dokument eine DocShell (SvPersist) bekannt sein
471         SfxObjectShell*   pObj = NULL;
472         ::sd::DrawDocShell*     pNewDocSh = NULL;
473 
474         if( meDocType == DOCUMENT_TYPE_IMPRESS )
475             mpCreatingTransferable->SetDocShell( new ::sd::DrawDocShell(
476                 SFX_CREATE_MODE_EMBEDDED, sal_True, meDocType ) );
477         else
478             mpCreatingTransferable->SetDocShell( new ::sd::GraphicDocShell(
479                 SFX_CREATE_MODE_EMBEDDED, sal_True, meDocType ) );
480 
481         pNewDocSh = static_cast< ::sd::DrawDocShell*>( pObj = mpCreatingTransferable->GetDocShell() );
482         pNewDocSh->DoInitNew( NULL );
483         pNewModel = pNewDocSh->GetDoc();
484 
485         // Nur fuer Clipboard notwendig,
486         // fuer Drag&Drop erfolgt dieses im DragServer
487         SdStyleSheetPool* pOldStylePool = (SdStyleSheetPool*) GetStyleSheetPool();
488         SdStyleSheetPool* pNewStylePool = (SdStyleSheetPool*) pNewModel->GetStyleSheetPool();
489 
490         pNewStylePool->CopyGraphicSheets(*pOldStylePool);
491         pNewStylePool->CopyCellSheets(*pOldStylePool);
492         pNewStylePool->CopyTableStyles(*pOldStylePool);
493 
494 
495         for (sal_uInt16 i = 0; i < GetMasterSdPageCount(PK_STANDARD); i++)
496         {
497             // Alle Layouts der MasterPage mitnehmen
498             String aOldLayoutName(((SdDrawDocument*) this)->GetMasterSdPage(i, PK_STANDARD)->GetLayoutName());
499             aOldLayoutName.Erase( aOldLayoutName.SearchAscii( SD_LT_SEPARATOR ) );
500             SdStyleSheetVector aCreatedSheets;
501             pNewStylePool->CopyLayoutSheets(aOldLayoutName, *pOldStylePool, aCreatedSheets );
502         }
503 
504         pNewModel->NewOrLoadCompleted( DOC_LOADED );  // loaded from source document
505     }
506     else if( mbAllocDocSh )
507     {
508         // Es wird eine DocShell erzeugt, welche mit GetAllocedDocSh() zurueckgegeben wird
509         SdDrawDocument* pDoc = (SdDrawDocument*) this;
510         pDoc->SetAllocDocSh(sal_False);
511         pDoc->mxAllocedDocShRef = new ::sd::DrawDocShell(
512             SFX_CREATE_MODE_EMBEDDED, sal_True, meDocType);
513         pDoc->mxAllocedDocShRef->DoInitNew(NULL);
514         pNewModel = pDoc->mxAllocedDocShRef->GetDoc();
515     }
516     else
517     {
518         pNewModel = new SdDrawDocument(meDocType, NULL);
519     }
520 
521     return pNewModel;
522 }
523 
524 /*************************************************************************
525 |*
526 |* Diese Methode erzeugt eine neue Seite (SdPage) und gibt einen Zeiger
527 |* darauf zurueck. Die Drawing Engine benutzt diese Methode beim Laden
528 |* zur Erzeugung von Seiten (deren Typ sie ja nicht kennt, da es ABLEITUNGEN
529 |* der SdrPage sind).
530 |*
531 \************************************************************************/
532 
533 SdrPage* SdDrawDocument::AllocPage(FASTBOOL bMasterPage)
534 {
535     return new SdPage(*this, NULL, (sal_Bool)bMasterPage);
536 }
537 
538 /*************************************************************************
539 |*
540 |* SetChanged(), das Model wurde geaendert
541 |*
542 \************************************************************************/
543 
544 void SdDrawDocument::SetChanged(sal_Bool bFlag)
545 {
546     if (mpDocSh)
547     {
548         if (mbNewOrLoadCompleted && mpDocSh->IsEnableSetModified())
549         {
550             // weitergeben an Basisklasse
551             FmFormModel::SetChanged(bFlag);
552 
553             // an ObjectShell weiterleiten
554             mpDocSh->SetModified(bFlag);
555         }
556     }
557     else
558     {
559         // weitergeben an Basisklasse
560         FmFormModel::SetChanged(bFlag);
561     }
562 }
563 
564 /*************************************************************************
565 |*
566 |* NbcSetChanged(), the model changed, don't call anybody else
567 |*
568 \************************************************************************/
569 
570 void SdDrawDocument::NbcSetChanged(sal_Bool bFlag)
571 {
572     // #100237# forward to baseclass
573     FmFormModel::SetChanged(bFlag);
574 }
575 
576 /*************************************************************************
577 |*
578 |* NewOrLoadCompleted
579 |*
580 |* Wird gerufen, wenn das Dokument geladen wurde bzw. feststeht, dass es
581 |* nicht mehr geladen wird.
582 |*
583 \************************************************************************/
584 
585 void SdDrawDocument::NewOrLoadCompleted(DocCreationMode eMode)
586 {
587     if (eMode == NEW_DOC)
588     {
589         // Neues Dokument:
590         // Praesentations- und Standardvorlagen erzeugen,
591         // Pool fuer virtuelle Controls erzeugen
592         CreateLayoutTemplates();
593         CreateDefaultCellStyles();
594 
595         static_cast< SdStyleSheetPool* >( mxStyleSheetPool.get() )->CreatePseudosIfNecessary();
596     }
597     else if (eMode == DOC_LOADED)
598     {
599             // Dokument wurde geladen:
600 
601         CheckMasterPages();
602 
603         if ( GetMasterSdPageCount(PK_STANDARD) > 1 )
604             RemoveUnnecessaryMasterPages( NULL, sal_True, sal_False );
605 
606         for ( sal_uInt16 i = 0; i < GetPageCount(); i++ )
607         {
608             // Check for correct layout names
609             SdPage* pPage = (SdPage*) GetPage( i );
610 
611             if(pPage->TRG_HasMasterPage())
612             {
613                 SdPage& rMaster = (SdPage&)pPage->TRG_GetMasterPage();
614 
615                 if(rMaster.GetLayoutName() != pPage->GetLayoutName())
616                 {
617                     pPage->SetLayoutName(rMaster.GetLayoutName());
618                 }
619             }
620         }
621 
622         for ( sal_uInt16 nPage = 0; nPage < GetMasterPageCount(); nPage++)
623         {
624             // LayoutName and PageName must be the same
625             SdPage* pPage = (SdPage*) GetMasterPage( nPage );
626 
627             String aName( pPage->GetLayoutName() );
628             aName.Erase( aName.SearchAscii( SD_LT_SEPARATOR ) );
629 
630             if( aName != pPage->GetName() )
631                 pPage->SetName( aName );
632         }
633 
634         // Sprachabhaengige Namen der StandardLayer erzeugen
635         RestoreLayerNames();
636 
637         // Sprachabhaengige Namen der Vorlagen setzen
638         static_cast<SdStyleSheetPool*>(mxStyleSheetPool.get())->UpdateStdNames();
639 
640         // Ggf. fehlende Vorlagen erzeugen (es gab z.B. frueher keinen Subtitle)
641         static_cast<SdStyleSheetPool*>(mxStyleSheetPool.get())->CreatePseudosIfNecessary();
642     }
643 
644     // Standardvorlage an der Drawing Engine setzen
645     String aName( SdResId(STR_STANDARD_STYLESHEET_NAME));
646     SetDefaultStyleSheet(static_cast<SfxStyleSheet*>(mxStyleSheetPool->Find(aName, SD_STYLE_FAMILY_GRAPHICS)));
647 
648     // #119287# Set default StyleSheet for SdrGrafObj and SdrOle2Obj
649     SetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(static_cast<SfxStyleSheet*>(mxStyleSheetPool->Find(String( SdResId(STR_POOLSHEET_OBJNOLINENOFILL)), SD_STYLE_FAMILY_GRAPHICS)));
650 
651     // Draw-Outliner und  Dokument Outliner initialisieren,
652     // aber nicht den globalen Outliner, den der ist ja nicht
653     // dokumentspezifisch wie StyleSheetPool und StyleRequestHandler
654     ::Outliner& rDrawOutliner = GetDrawOutliner();
655     rDrawOutliner.SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
656     sal_uLong nCntrl = rDrawOutliner.GetControlWord();
657     if (mbOnlineSpell)
658         nCntrl |= EE_CNTRL_ONLINESPELLING;
659     else
660         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
661     rDrawOutliner.SetControlWord(nCntrl);
662 
663     // HitTest-Outliner und  Dokument Outliner initialisieren,
664     // aber nicht den globalen Outliner, den der ist ja nicht
665     // dokumentspezifisch wie StyleSheetPool und StyleRequestHandler
666     pHitTestOutliner->SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
667 
668     if(mpOutliner)
669     {
670         mpOutliner->SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
671     }
672     if(mpInternalOutliner)
673     {
674         mpInternalOutliner->SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
675     }
676 
677     if ( eMode == DOC_LOADED )
678     {
679         // Praesentationsobjekte muessen wieder Listener der entsprechenden
680         // Vorlagen werden
681         SdStyleSheetPool* pSPool = (SdStyleSheetPool*) GetStyleSheetPool();
682         sal_uInt16 nPage, nPageCount;
683 
684         // #96323# create missing layout style sheets for broken documents
685         //         that where created with the 5.2
686         nPageCount = GetMasterSdPageCount( PK_STANDARD );
687         for (nPage = 0; nPage < nPageCount; nPage++)
688         {
689             SdPage* pPage = GetMasterSdPage(nPage, PK_STANDARD);
690             pSPool->CreateLayoutStyleSheets( pPage->GetName(), sal_True );
691         }
692 
693         // Standard- und Notizseiten:
694         for (nPage = 0; nPage < GetPageCount(); nPage++)
695         {
696             SdPage* pPage = (SdPage*)GetPage(nPage);
697             NewOrLoadCompleted( pPage, pSPool );
698         }
699 
700         // Masterpages:
701         for (nPage = 0; nPage < GetMasterPageCount(); nPage++)
702         {
703             SdPage* pPage = (SdPage*)GetMasterPage(nPage);
704 
705             NewOrLoadCompleted( pPage, pSPool );
706         }
707     }
708 
709     mbNewOrLoadCompleted = sal_True;
710 
711     /**************************************************************************
712     * Alle gelinkten Pages aktualisieren
713     **************************************************************************/
714     SdPage* pPage = NULL;
715     sal_uInt16 nMaxSdPages = GetSdPageCount(PK_STANDARD);
716 
717     for (sal_uInt16 nSdPage=0; nSdPage < nMaxSdPages; nSdPage++)
718     {
719         pPage = (SdPage*) GetSdPage(nSdPage, PK_STANDARD);
720 
721         if (pPage && pPage->GetFileName().Len() && pPage->GetBookmarkName().Len())
722         {
723             pPage->SetModel(this);
724         }
725     }
726 
727     UpdateAllLinks();
728 
729     SetChanged( sal_False );
730 }
731 
732 /** updates all links, only links in this document should by resolved */
733 void SdDrawDocument::UpdateAllLinks()
734 {
735     if ( !pDocLockedInsertingLinks && pLinkManager && pLinkManager->GetLinks().Count() )
736     {
737         pDocLockedInsertingLinks = this; // lock inserting links. only links in this document should by resolved
738 
739         pLinkManager->UpdateAllLinks();  // query box: update all links?
740 
741         if( pDocLockedInsertingLinks == this )
742             pDocLockedInsertingLinks = NULL;  // unlock inserting links
743     }
744 }
745 
746 /** this loops over the presentation objectes of a page and repairs some new settings
747     from old binary files and resets all default strings for empty presentation objects.
748 */
749 void SdDrawDocument::NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool )
750 {
751 /* cl removed because not needed anymore since binfilter
752     SdrObjListIter aShapeIter( *pPage );
753     while( aShapeIter.IsMore() )
754     {
755         OutlinerParaObject* pOPO = aShapeIter.Next()->GetOutlinerParaObject();
756         if( pOPO )
757         {
758             if( pOPO->GetOutlinerMode() == OUTLINERMODE_DONTKNOW )
759                 pOPO->SetOutlinerMode( OUTLINERMODE_TEXTOBJECT );
760 
761             pOPO->FinishLoad( pSPool );
762         }
763     }
764 */
765 
766     const sd::ShapeList& rPresentationShapes( pPage->GetPresentationShapeList() );
767     if(!rPresentationShapes.isEmpty())
768     {
769         // Listen mit Titel- und Gliederungsvorlagen erstellen
770         String aName = pPage->GetLayoutName();
771         aName.Erase( aName.SearchAscii( SD_LT_SEPARATOR ));
772 
773         List* pOutlineList = pSPool->CreateOutlineSheetList(aName);
774         SfxStyleSheet* pTitleSheet = (SfxStyleSheet*)
775                                         pSPool->GetTitleSheet(aName);
776 
777         SdrObject* pObj = rPresentationShapes.getNextShape(0);
778 
779         // jetzt nach Titel- und Gliederungstextobjekten suchen und
780         // Objekte zu Listenern machen
781         while(pObj)
782         {
783             if (pObj->GetObjInventor() == SdrInventor)
784             {
785                 OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
786                 sal_uInt16 nId = pObj->GetObjIdentifier();
787 
788                 if (nId == OBJ_TITLETEXT)
789                 {
790                     if( pOPO && pOPO->GetOutlinerMode() == OUTLINERMODE_DONTKNOW )
791                         pOPO->SetOutlinerMode( OUTLINERMODE_TITLEOBJECT );
792 
793                     // sal_True: harte Attribute dabei nicht loeschen
794                     if (pTitleSheet)
795                         pObj->SetStyleSheet(pTitleSheet, sal_True);
796                 }
797                 else if (nId == OBJ_OUTLINETEXT)
798                 {
799                     if( pOPO && pOPO->GetOutlinerMode() == OUTLINERMODE_DONTKNOW )
800                         pOPO->SetOutlinerMode( OUTLINERMODE_OUTLINEOBJECT );
801 
802                     for (sal_uInt16 nSheet = 0; nSheet < 10; nSheet++)
803                     {
804                         SfxStyleSheet* pSheet = (SfxStyleSheet*)pOutlineList->GetObject(nSheet);
805                         if (pSheet)
806                         {
807                             pObj->StartListening(*pSheet);
808 
809                             if( nSheet == 0)
810                                 // Textrahmen hoert auf StyleSheet der Ebene1
811                                 pObj->NbcSetStyleSheet(pSheet, sal_True);
812                         }
813                     }
814                 }
815 
816                 if (pObj->ISA(SdrTextObj) && pObj->IsEmptyPresObj() && pPage)
817                 {
818                     PresObjKind ePresObjKind = pPage->GetPresObjKind(pObj);
819                     String aString( pPage->GetPresObjText(ePresObjKind) );
820 
821                     if (aString.Len())
822                     {
823                         sd::Outliner* pInternalOutl = GetInternalOutliner(sal_True);
824                         pPage->SetObjText( (SdrTextObj*) pObj, pInternalOutl, ePresObjKind, aString );
825                         pObj->NbcSetStyleSheet( pPage->GetStyleSheetForPresObj( ePresObjKind ), sal_True );
826                         pInternalOutl->Clear();
827                     }
828                 }
829             }
830 
831             pObj = rPresentationShapes.getNextShape(pObj);
832         }
833 
834         delete pOutlineList;
835     }
836 }
837 
838 /*************************************************************************
839 |*
840 |* Lokaler Outliner, welcher fuer den Gliederungsmodus verwendet wird
841 |* In diesen Outliner werden ggf. OutlinerViews inserted!
842 |*
843 \************************************************************************/
844 
845 ::sd::Outliner* SdDrawDocument::GetOutliner(sal_Bool bCreateOutliner)
846 {
847     if (!mpOutliner && bCreateOutliner)
848     {
849         mpOutliner = new ::sd::Outliner( this, OUTLINERMODE_TEXTOBJECT );
850 
851         if (mpDocSh)
852             mpOutliner->SetRefDevice( SD_MOD()->GetRefDevice( *mpDocSh ) );
853 
854         mpOutliner->SetDefTab( nDefaultTabulator );
855         mpOutliner->SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
856     }
857 
858     return(mpOutliner);
859 }
860 
861 
862 /*************************************************************************
863 |*
864 |* Interner Outliner, welcher fuer die Erzeugung von Textobjekten
865 |* verwendet wird.
866 |* In diesen Outliner werden keine OutlinerViews inserted!
867 |*
868 \************************************************************************/
869 
870 ::sd::Outliner* SdDrawDocument::GetInternalOutliner(sal_Bool bCreateOutliner)
871 {
872     if ( !mpInternalOutliner && bCreateOutliner )
873     {
874         mpInternalOutliner = new ::sd::Outliner( this, OUTLINERMODE_TEXTOBJECT );
875         // MT:
876         // Dieser Outliner wird nur fuer das Erzeugen spezieller Textobjekte
877         // verwendet. Da in diesen Textobjekten keine Portion-Informationen
878         // gespeichert werden muessen, kann/soll der Update-Mode immer sal_False bleiben.
879         mpInternalOutliner->SetUpdateMode( sal_False );
880         mpInternalOutliner->EnableUndo( sal_False );
881 
882         if (mpDocSh)
883             mpInternalOutliner->SetRefDevice( SD_MOD()->GetRefDevice( *mpDocSh ) );
884 
885         mpInternalOutliner->SetDefTab( nDefaultTabulator );
886         mpInternalOutliner->SetStyleSheetPool((SfxStyleSheetPool*)GetStyleSheetPool());
887     }
888 
889     DBG_ASSERT( !mpInternalOutliner || ( mpInternalOutliner->GetUpdateMode() == sal_False ) , "InternalOutliner: UpdateMode = sal_True !" );
890     DBG_ASSERT( !mpInternalOutliner || ( mpInternalOutliner->IsUndoEnabled() == sal_False ), "InternalOutliner: Undo = sal_True !" );
891 
892     // MT: Wer ihn vollmuellt, macht ihn auch gleich wieder leer:
893     // Vorteile:
894     // a) Keine unnoetigen Clear-Aufrufe
895     // b) Kein Muell im Speicher.
896     DBG_ASSERT( !mpInternalOutliner || ( ( mpInternalOutliner->GetParagraphCount() == 1 ) && ( mpInternalOutliner->GetText( mpInternalOutliner->GetParagraph( 0 ) ).Len() == 0 ) ), "InternalOutliner: Nicht leer!" );
897 
898     return mpInternalOutliner;
899 }
900 
901 /*************************************************************************
902 |*
903 |* OnlineSpelling ein/aus
904 |*
905 \************************************************************************/
906 
907 void SdDrawDocument::SetOnlineSpell(sal_Bool bIn)
908 {
909     mbOnlineSpell = bIn;
910     sal_uLong nCntrl = 0;
911 
912     if(mpOutliner)
913     {
914         nCntrl = mpOutliner->GetControlWord();
915 
916         if(mbOnlineSpell)
917             nCntrl |= EE_CNTRL_ONLINESPELLING;
918         else
919             nCntrl &= ~EE_CNTRL_ONLINESPELLING;
920 
921         mpOutliner->SetControlWord(nCntrl);
922     }
923 
924     if (mpInternalOutliner)
925     {
926         nCntrl = mpInternalOutliner->GetControlWord();
927 
928         if (mbOnlineSpell)
929             nCntrl |= EE_CNTRL_ONLINESPELLING;
930         else
931             nCntrl &= ~EE_CNTRL_ONLINESPELLING;
932 
933         mpInternalOutliner->SetControlWord(nCntrl);
934     }
935 
936     ::Outliner& rOutliner = GetDrawOutliner();
937 
938     nCntrl = rOutliner.GetControlWord();
939 
940     if (mbOnlineSpell)
941         nCntrl |= EE_CNTRL_ONLINESPELLING;
942     else
943         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
944 
945     rOutliner.SetControlWord(nCntrl);
946 
947     if (mbOnlineSpell)
948     {
949         StartOnlineSpelling();
950     }
951     else
952     {
953         StopOnlineSpelling();
954     }
955 }
956 
957 
958 /*************************************************************************
959 |*
960 |* OnlineSpelling: Markierung ein/aus
961 |*
962 \************************************************************************/
963 
964 uno::Reference< uno::XInterface > SdDrawDocument::createUnoModel()
965 {
966     uno::Reference< uno::XInterface > xModel;
967 
968     try
969     {
970         if ( mpDocSh )
971             xModel = mpDocSh->GetModel();
972     }
973     catch( uno::RuntimeException& )
974     {
975     }
976 
977     return xModel;
978 }
979 
980 SvxNumType SdDrawDocument::GetPageNumType() const
981 {
982     return mePageNumType;
983 }
984 
985 
986 
987 
988 void SdDrawDocument::SetPrinterIndependentLayout (sal_Int32 nMode)
989 {
990     // #108104#
991     // DBG_ASSERT (mpDocSh!=NULL, "No available document shell to set ref device at.");
992 
993     switch (nMode)
994     {
995         case ::com::sun::star::document::PrinterIndependentLayout::DISABLED:
996         case ::com::sun::star::document::PrinterIndependentLayout::ENABLED:
997             // Just store supported modes and inform the doc shell.
998             mnPrinterIndependentLayout = nMode;
999 
1000             // #108104#
1001             // Since it is possible that a SdDrawDocument is constructed without a
1002             // SdDrawDocShell the pointer member mpDocSh needs to be tested
1003             // before the call is executed. This is e.-g. used for copy/paste.
1004             if(mpDocSh)
1005             {
1006                 mpDocSh->UpdateRefDevice ();
1007             }
1008 
1009             break;
1010 
1011         default:
1012             // Ignore unknown values.
1013             break;
1014     }
1015 }
1016 
1017 sal_Int32 SdDrawDocument::GetPrinterIndependentLayout (void)
1018 {
1019     return mnPrinterIndependentLayout;
1020 }
1021 
1022 bool SdDrawDocument::IsStartWithPresentation() const
1023 {
1024     return mbStartWithPresentation;
1025 }
1026 
1027 void SdDrawDocument::SetStartWithPresentation( bool bStartWithPresentation )
1028 {
1029     mbStartWithPresentation = bStartWithPresentation;
1030 }
1031 
1032 // #109538#
1033 void SdDrawDocument::PageListChanged()
1034 {
1035     mpDrawPageListWatcher->Invalidate();
1036 }
1037 
1038 // #109538#
1039 void SdDrawDocument::MasterPageListChanged()
1040 {
1041     mpMasterPageListWatcher->Invalidate();
1042 }
1043 
1044 void SdDrawDocument::SetCalcFieldValueHdl(::Outliner* pOutliner)
1045 {
1046     pOutliner->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
1047 }
1048 
1049 sal_uInt16 SdDrawDocument::GetAnnotationAuthorIndex( const rtl::OUString& rAuthor )
1050 {
1051     // force current user to have first color
1052     if( maAnnotationAuthors.empty() )
1053     {
1054         SvtUserOptions aUserOptions;
1055         maAnnotationAuthors.push_back( aUserOptions.GetFullName() );
1056     }
1057 
1058     sal_uInt16 idx = 0;
1059     for( std::vector< OUString >::iterator iter( maAnnotationAuthors.begin() ); iter != maAnnotationAuthors.end(); iter++ )
1060     {
1061         if( (*iter) == rAuthor )
1062         {
1063             break;
1064         }
1065         idx++;
1066     }
1067 
1068     if( idx == maAnnotationAuthors.size() )
1069     {
1070         maAnnotationAuthors.push_back( rAuthor );
1071     }
1072 
1073     return idx;
1074 }
1075 
1076 // eof
1077