xref: /trunk/main/sw/source/ui/app/docshini.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 
32 #include <hintids.hxx>
33 
34 #include <svx/dialogs.hrc>
35 #include <i18npool/mslangid.hxx>
36 #include <sot/storinfo.hxx>
37 #include <sot/storage.hxx>
38 #include <svl/zforlist.hxx>
39 #include <svtools/ctrltool.hxx>
40 #include <unotools/lingucfg.hxx>
41 #include <sfx2/docfile.hxx>
42 #include <sfx2/sfxmodelfactory.hxx>
43 #include <sfx2/printer.hxx>
44 #include <sfx2/bindings.hxx>
45 #include <svl/asiancfg.hxx>
46 #include <editeng/unolingu.hxx>
47 #include <sfx2/request.hxx>
48 #include <svl/intitem.hxx>
49 #include <editeng/adjitem.hxx>
50 #include <editeng/akrnitem.hxx>
51 #include <linguistic/lngprops.hxx>
52 #include <com/sun/star/document/UpdateDocMode.hpp>
53 #include <com/sun/star/i18n/ScriptType.hpp>
54 #include <rtl/logfile.hxx>
55 #include <sfx2/docfilt.hxx>
56 #include <svx/xtable.hxx>
57 #include <svx/drawitem.hxx>
58 #include <editeng/fhgtitem.hxx>
59 #include <editeng/fontitem.hxx>
60 #include <editeng/flstitem.hxx>
61 #include <editeng/tstpitem.hxx>
62 #include <editeng/langitem.hxx>
63 #include <editeng/colritem.hxx>
64 #include <editeng/hyznitem.hxx>
65 #include <editeng/svxacorr.hxx>
66 #include <vcl/svapp.hxx>
67 #include <view.hxx>
68 #include <prtopt.hxx>
69 #include <fmtcol.hxx>
70 #include <docsh.hxx>
71 #include <wdocsh.hxx>
72 #include <swmodule.hxx>
73 #include <doc.hxx>
74 #include <docfac.hxx>
75 #include <docstyle.hxx>
76 #include <shellio.hxx>
77 #include <tox.hxx>
78 #include <swdtflvr.hxx>
79 #include <dbmgr.hxx>
80 #include <usrpref.hxx>
81 #include <fontcfg.hxx>
82 #include <poolfmt.hxx>
83 #include <modcfg.hxx>
84 #include <globdoc.hxx>
85 #include <ndole.hxx>
86 #include <mdiexp.hxx>
87 #include <unotxdoc.hxx>
88 #include <linkenum.hxx>
89 #include <swwait.hxx>
90 #include <wrtsh.hxx>
91 #include <swerror.h>
92 #include <globals.hrc>
93 
94 // #i18732#
95 #include <fmtfollowtextflow.hxx>
96 
97 #include <unochart.hxx>
98 
99 // text grid
100 #include <tgrditem.hxx>
101 
102 using namespace ::com::sun::star::i18n;
103 using namespace ::com::sun::star::lang;
104 using namespace ::com::sun::star::uno;
105 using namespace ::com::sun::star;
106 using ::rtl::OUString;
107 
108 /*-----------------21.09.96 15.29-------------------
109 
110 --------------------------------------------------*/
111 
112 
113 /*--------------------------------------------------------------------
114     Beschreibung: Document laden
115  --------------------------------------------------------------------*/
116 
117 
118 sal_Bool SwDocShell::InitNew( const uno::Reference < embed::XStorage >& xStor )
119 {
120     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDocShell::InitNew" );
121 
122     sal_Bool bRet = SfxObjectShell::InitNew( xStor );
123     ASSERT( GetMapUnit() == MAP_TWIP, "map unit is not twip!" );
124     sal_Bool bHTMLTemplSet = sal_False;
125     if( bRet )
126     {
127         AddLink();      // pDoc / pIo ggf. anlegen
128 
129         sal_Bool bWeb = ISA( SwWebDocShell );
130         if ( bWeb )
131             bHTMLTemplSet = SetHTMLTemplate( *GetDoc() );//Styles aus HTML.vor
132         else if( ISA( SwGlobalDocShell ) )
133             GetDoc()->set(IDocumentSettingAccess::GLOBAL_DOCUMENT, true);       // Globaldokument
134 
135 
136 /*
137         //JP 12.07.95: so einfach waere es fuer die neu Mimik
138         pDoc->SetDefault( SvxTabStopItem( 1,
139                     GetStar Writer App()->GetUsrPref()->GetDefTabDist(),
140                     SVX_TAB_ADJUST_DEFAULT,
141                     RES_PARATR_TABSTOP));
142 */
143         if ( GetCreateMode() ==  SFX_CREATE_MODE_EMBEDDED )
144             SwTransferable::InitOle( this, *pDoc );
145 
146         // set forbidden characters if necessary
147         SvxAsianConfig aAsian;
148         Sequence<Locale> aLocales =  aAsian.GetStartEndCharLocales();
149         if(aLocales.getLength())
150         {
151             const Locale* pLocales = aLocales.getConstArray();
152             for(sal_Int32 i = 0; i < aLocales.getLength(); i++)
153             {
154                 ForbiddenCharacters aForbidden;
155                 aAsian.GetStartEndChars( pLocales[i], aForbidden.beginLine, aForbidden.endLine);
156                 LanguageType  eLang = SvxLocaleToLanguage(pLocales[i]);
157                 pDoc->setForbiddenCharacters( eLang, aForbidden);
158             }
159         }
160         pDoc->set(IDocumentSettingAccess::KERN_ASIAN_PUNCTUATION,
161                   !aAsian.IsKerningWesternTextOnly());
162         pDoc->setCharacterCompressionType(static_cast<SwCharCompressType>(aAsian.GetCharDistanceCompression()));
163         pDoc->setPrintData(*SW_MOD()->GetPrtOptions(bWeb));
164 
165         SubInitNew();
166 
167         // fuer alle
168 
169         SwStdFontConfig* pStdFont = SW_MOD()->GetStdFontConfig();
170         SfxPrinter* pPrt = pDoc->getPrinter( false );
171 
172         String sEntry;
173         sal_uInt16 aFontWhich[] =
174         {   RES_CHRATR_FONT,
175             RES_CHRATR_CJK_FONT,
176             RES_CHRATR_CTL_FONT
177         };
178         sal_uInt16 aFontHeightWhich[] =
179         {
180             RES_CHRATR_FONTSIZE,
181             RES_CHRATR_CJK_FONTSIZE,
182             RES_CHRATR_CTL_FONTSIZE
183         };
184         sal_uInt16 aFontIds[] =
185         {
186             FONT_STANDARD,
187             FONT_STANDARD_CJK,
188             FONT_STANDARD_CTL
189         };
190         sal_uInt16 nFontTypes[] =
191         {
192             DEFAULTFONT_LATIN_TEXT,
193             DEFAULTFONT_CJK_TEXT,
194             DEFAULTFONT_CTL_TEXT
195         };
196         sal_uInt16 aLangTypes[] =
197         {
198             RES_CHRATR_LANGUAGE,
199             RES_CHRATR_CJK_LANGUAGE,
200             RES_CHRATR_CTL_LANGUAGE
201         };
202 
203         for(sal_uInt8 i = 0; i < 3; i++)
204         {
205             sal_uInt16 nFontWhich = aFontWhich[i];
206             sal_uInt16 nFontId = aFontIds[i];
207             SvxFontItem* pFontItem = 0;
208             const SvxLanguageItem& rLang = (const SvxLanguageItem&)pDoc->GetDefault( aLangTypes[i] );
209             LanguageType eLanguage = rLang.GetLanguage();
210             if(!pStdFont->IsFontDefault(nFontId))
211             {
212                 sEntry = pStdFont->GetFontFor(nFontId);
213 
214                 Font aFont( sEntry, Size( 0, 10 ) );
215                 if( pPrt )
216                 {
217                     aFont = pPrt->GetFontMetric( aFont );
218                 }
219 
220                 pFontItem = new SvxFontItem(aFont.GetFamily(), aFont.GetName(),
221                                             aEmptyStr, aFont.GetPitch(), aFont.GetCharSet(), nFontWhich);
222             }
223             else
224             {
225                 // #107782# OJ use korean language if latin was used
226                 if ( i == 0 )
227                 {
228                     LanguageType eUiLanguage = Application::GetSettings().GetUILanguage();
229                     switch( eUiLanguage )
230                     {
231                         case LANGUAGE_KOREAN:
232                         case LANGUAGE_KOREAN_JOHAB:
233                             eLanguage = eUiLanguage;
234                         break;
235                     }
236                 }
237 
238                 Font aLangDefFont = OutputDevice::GetDefaultFont(
239                     nFontTypes[i],
240                     eLanguage,
241                     DEFAULTFONT_FLAGS_ONLYONE );
242                 pFontItem = new SvxFontItem(aLangDefFont.GetFamily(), aLangDefFont.GetName(),
243                                     aEmptyStr, aLangDefFont.GetPitch(), aLangDefFont.GetCharSet(), nFontWhich);
244             }
245             pDoc->SetDefault(*pFontItem);
246             if( !bHTMLTemplSet )
247             {
248                 SwTxtFmtColl *pColl = pDoc->GetTxtCollFromPool(RES_POOLCOLL_STANDARD);
249                 pColl->ResetFmtAttr(nFontWhich);
250             }
251             delete pFontItem;
252             sal_Int32 nFontHeight = pStdFont->GetFontHeight( FONT_STANDARD, i, eLanguage );
253             if(nFontHeight <= 0)
254                 nFontHeight = pStdFont->GetDefaultHeightFor( nFontId, eLanguage );
255             pDoc->SetDefault(SvxFontHeightItem( nFontHeight, 100, aFontHeightWhich[i] ));
256             if( !bHTMLTemplSet )
257             {
258                 SwTxtFmtColl *pColl = pDoc->GetTxtCollFromPool(RES_POOLCOLL_STANDARD);
259                 pColl->ResetFmtAttr(aFontHeightWhich[i]);
260             }
261 
262         }
263         sal_uInt16 aFontIdPoolId[] =
264         {
265             FONT_OUTLINE,       RES_POOLCOLL_HEADLINE_BASE,
266             FONT_LIST,          RES_POOLCOLL_NUMBUL_BASE,
267             FONT_CAPTION,       RES_POOLCOLL_LABEL,
268             FONT_INDEX,         RES_POOLCOLL_REGISTER_BASE,
269             FONT_OUTLINE_CJK,   RES_POOLCOLL_HEADLINE_BASE,
270             FONT_LIST_CJK,      RES_POOLCOLL_NUMBUL_BASE,
271             FONT_CAPTION_CJK,   RES_POOLCOLL_LABEL,
272             FONT_INDEX_CJK,     RES_POOLCOLL_REGISTER_BASE,
273             FONT_OUTLINE_CTL,   RES_POOLCOLL_HEADLINE_BASE,
274             FONT_LIST_CTL,      RES_POOLCOLL_NUMBUL_BASE,
275             FONT_CAPTION_CTL,   RES_POOLCOLL_LABEL,
276             FONT_INDEX_CTL,     RES_POOLCOLL_REGISTER_BASE
277         };
278 
279         sal_uInt16 nFontWhich = RES_CHRATR_FONT;
280         sal_uInt16 nFontHeightWhich = RES_CHRATR_FONTSIZE;
281         LanguageType eLanguage = static_cast<const SvxLanguageItem&>(pDoc->GetDefault( RES_CHRATR_LANGUAGE )).GetLanguage();
282         for(sal_uInt8 nIdx = 0; nIdx < 24; nIdx += 2)
283         {
284             if(nIdx == 8)
285             {
286                 nFontWhich = RES_CHRATR_CJK_FONT;
287                 nFontHeightWhich = RES_CHRATR_CJK_FONTSIZE;
288                 eLanguage = static_cast<const SvxLanguageItem&>(pDoc->GetDefault( RES_CHRATR_CJK_LANGUAGE )).GetLanguage();
289             }
290             else if(nIdx == 16)
291             {
292                 nFontWhich = RES_CHRATR_CTL_FONT;
293                 nFontHeightWhich = RES_CHRATR_CTL_FONTSIZE;
294                 eLanguage = static_cast<const SvxLanguageItem&>(pDoc->GetDefault( RES_CHRATR_CTL_LANGUAGE )).GetLanguage();
295             }
296             SwTxtFmtColl *pColl = 0;
297             if(!pStdFont->IsFontDefault(aFontIdPoolId[nIdx]))
298             {
299                 sEntry = pStdFont->GetFontFor(aFontIdPoolId[nIdx]);
300 
301                 Font aFont( sEntry, Size( 0, 10 ) );
302                 if( pPrt )
303                     aFont = pPrt->GetFontMetric( aFont );
304 
305                 pColl = pDoc->GetTxtCollFromPool(aFontIdPoolId[nIdx + 1]);
306                 if( !bHTMLTemplSet ||
307                     SFX_ITEM_SET != pColl->GetAttrSet().GetItemState(
308                                                     nFontWhich, sal_False ) )
309                 {
310                     pColl->SetFmtAttr(SvxFontItem(aFont.GetFamily(), aFont.GetName(),
311                                                   aEmptyStr, aFont.GetPitch(), aFont.GetCharSet(), nFontWhich));
312                 }
313             }
314             sal_Int32 nFontHeight = pStdFont->GetFontHeight( static_cast< sal_Int8 >(aFontIdPoolId[nIdx]), 0, eLanguage );
315             if(nFontHeight <= 0)
316                 nFontHeight = pStdFont->GetDefaultHeightFor( aFontIdPoolId[nIdx], eLanguage );
317             if(!pColl)
318                 pColl = pDoc->GetTxtCollFromPool(aFontIdPoolId[nIdx + 1]);
319             SvxFontHeightItem aFontHeight( (const SvxFontHeightItem&)pColl->GetFmtAttr( nFontHeightWhich, sal_True ));
320             if(aFontHeight.GetHeight() != sal::static_int_cast<sal_uInt32, sal_Int32>(nFontHeight))
321             {
322                 aFontHeight.SetHeight(nFontHeight);
323                 pColl->SetFmtAttr( aFontHeight );
324             }
325         }
326 
327         // the default for documents created via 'File/New' should be 'on'
328         // (old documents, where this property was not yet implemented, will get the
329         // value 'false' in the SwDoc c-tor)
330         pDoc->set( IDocumentSettingAccess::MATH_BASELINE_ALIGNMENT,
331                 SW_MOD()->GetUsrPref( bWeb )->IsAlignMathObjectsToBaseline() );
332     }
333 
334     /* #106748# If the default frame direction of a document is RTL
335         the default adjusment is to the right. */
336     if( !bHTMLTemplSet &&
337         FRMDIR_HORI_RIGHT_TOP == GetDefaultFrameDirection(GetAppLanguage()) )
338         pDoc->SetDefault( SvxAdjustItem(SVX_ADJUST_RIGHT, RES_PARATR_ADJUST ) );
339 
340     // OD 09.10.2003 #i18732# - set dynamic pool default for
341     // item RES_FOLLOW_TEXT_FLOW to sal_False for *new document*.
342     // Thus, redo this change in method <SwDoc::RemoveAllFmtLanguageDependencies()>,
343     // which is called from <SwDocShell::ConvertFrom(..)> in order to restore
344     // the static pool default.
345     pDoc->SetDefault( SwFmtFollowTextFlow( sal_False ) );
346 
347 // --> collapsing borders FME 2005-05-27 #i29550#
348     pDoc->SetDefault( SfxBoolItem( RES_COLLAPSING_BORDERS, sal_True ) );
349 // <-- collapsing
350 
351     //#i16874# AutoKerning as default for new documents
352     pDoc->SetDefault( SvxAutoKernItem( sal_True, RES_CHRATR_AUTOKERN ) );
353 
354     pDoc->SetDrawDefaults();
355 
356     // --> OD 2005-02-10 #i42080# - Due to the several calls of method <SetDefault(..)>
357     // at the document instance, the document is modified. Thus, reset this
358     // status here. Note: In method <SubInitNew()> this is also done.
359     pDoc->ResetModified();
360     // <--
361 
362     return bRet;
363 }
364 
365 /*--------------------------------------------------------------------
366     Beschreibung:   Ctor mit SfxCreateMode ?????
367  --------------------------------------------------------------------*/
368 
369 
370 SwDocShell::SwDocShell( SfxObjectCreateMode eMode ) :
371     SfxObjectShell ( eMode ),
372     pDoc(0),
373     pFontList(0),
374     pView( 0 ),
375     pWrtShell( 0 ),
376     pOLEChildList( 0 ),
377     nUpdateDocMode(document::UpdateDocMode::ACCORDING_TO_CONFIG),
378     bInUpdateFontList(false)
379 {
380     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDocShell::SwDocShell" );
381     Init_Impl();
382 }
383 
384 /*--------------------------------------------------------------------
385     Beschreibung: Ctor / Dtor
386  --------------------------------------------------------------------*/
387 
388 
389 SwDocShell::SwDocShell( const sal_uInt64 i_nSfxCreationFlags ) :
390     SfxObjectShell ( i_nSfxCreationFlags ),
391     pDoc(0),
392     pFontList(0),
393     pView( 0 ),
394     pWrtShell( 0 ),
395     pOLEChildList( 0 ),
396     nUpdateDocMode(document::UpdateDocMode::ACCORDING_TO_CONFIG),
397     bInUpdateFontList(false)
398 {
399     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDocShell::SwDocShell" );
400     Init_Impl();
401 }
402 
403 /*--------------------------------------------------------------------
404     Beschreibung: Ctor / Dtor
405  --------------------------------------------------------------------*/
406 
407 
408 SwDocShell::SwDocShell( SwDoc *pD, SfxObjectCreateMode eMode ):
409     SfxObjectShell ( eMode ),
410     pDoc(pD),
411     pFontList(0),
412     pView( 0 ),
413     pWrtShell( 0 ),
414     pOLEChildList( 0 ),
415     nUpdateDocMode(document::UpdateDocMode::ACCORDING_TO_CONFIG),
416     bInUpdateFontList(false)
417 {
418     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDocShell::SwDocShell" );
419     Init_Impl();
420 }
421 
422 /*--------------------------------------------------------------------
423     Beschreibung:   Dtor
424  --------------------------------------------------------------------*/
425 
426 
427  SwDocShell::~SwDocShell()
428 {
429     // disable chart related objects now because in ~SwDoc it may be to late for this
430     if( pDoc )
431     {
432         pDoc->GetChartControllerHelper().Disconnect();
433         SwChartDataProvider *pPCD = pDoc->GetChartDataProvider();
434         if (pPCD)
435             pPCD->dispose();
436     }
437 
438     RemoveLink();
439     delete pFontList;
440 
441     // wir als BroadCaster werden auch unser eigener Listener
442     // (fuer DocInfo/FileNamen/....)
443     EndListening( *this );
444     SvxColorTableItem* pColItem = (SvxColorTableItem*)GetItem(SID_COLOR_TABLE);
445     // wird nur die DocInfo fuer den Explorer gelesen, ist das Item nicht da
446     if(pColItem)
447     {
448         XColorTable* pTable = pColItem->GetColorTable();
449         // wurde eine neue Table angelegt, muss sie auch geloescht werden.
450         if((void*)pTable  != (void*)(XColorTable::GetStdColorTable()) )
451             delete pTable;
452     }
453 
454     delete pOLEChildList;
455 }
456 /* -----------------------------10.09.2001 15:59------------------------------
457 
458  ---------------------------------------------------------------------------*/
459 void  SwDocShell::Init_Impl()
460 {
461     SetPool(&SW_MOD()->GetPool());
462     SetBaseModel(new SwXTextDocument(this));
463     // wir als BroadCaster werden auch unser eigener Listener
464     // (fuer DocInfo/FileNamen/....)
465     StartListening( *this );
466     //position of the "Automatic" style filter for the stylist (app.src)
467     SetAutoStyleFilterIndex(3);
468 
469     // set map unit to twip
470     SetMapUnit( MAP_TWIP );
471 }
472 /*--------------------------------------------------------------------
473     Beschreibung: AddLink
474  --------------------------------------------------------------------*/
475 
476 
477 void SwDocShell::AddLink()
478 {
479     if( !pDoc )
480     {
481         SwDocFac aFactory;
482         pDoc = aFactory.GetDoc();
483         pDoc->acquire();
484         pDoc->set(IDocumentSettingAccess::HTML_MODE, ISA(SwWebDocShell) );
485     }
486     else
487         pDoc->acquire();
488     pDoc->SetDocShell( this );      // am Doc den DocShell-Pointer setzen
489     uno::Reference< text::XTextDocument >  xDoc(GetBaseModel(), uno::UNO_QUERY);
490     ((SwXTextDocument*)xDoc.get())->Reactivate(this);
491 
492     SetPool(&pDoc->GetAttrPool());
493 
494     // am besten erst wenn eine sdbcx::View erzeugt wird !!!
495     pDoc->SetOle2Link(LINK(this, SwDocShell, Ole2ModifiedHdl));
496 }
497 
498 /*--------------------------------------------------------------------
499     Beschreibung:   neue FontList erzeugen Aenderung Drucker
500  --------------------------------------------------------------------*/
501 
502 
503 void SwDocShell::UpdateFontList()
504 {
505     if(!bInUpdateFontList)
506     {
507         bInUpdateFontList = true;
508         ASSERT(pDoc, "Kein Doc keine FontList");
509         if( pDoc )
510         {
511             delete pFontList;
512             pFontList = new FontList( pDoc->getReferenceDevice( true ) );
513             PutItem( SvxFontListItem( pFontList, SID_ATTR_CHAR_FONTLIST ) );
514         }
515         bInUpdateFontList = false;
516     }
517 }
518 
519 /*--------------------------------------------------------------------
520     Beschreibung: RemoveLink
521  --------------------------------------------------------------------*/
522 
523 
524 void SwDocShell::RemoveLink()
525 {
526     // Uno-Object abklemmen
527     uno::Reference< text::XTextDocument >  xDoc(GetBaseModel(), uno::UNO_QUERY);
528     ((SwXTextDocument*)xDoc.get())->Invalidate();
529     aFinishedTimer.Stop();
530     if(pDoc)
531     {
532         if( mxBasePool.is() )
533         {
534             static_cast<SwDocStyleSheetPool*>(mxBasePool.get())->dispose();
535             mxBasePool.clear();
536         }
537         sal_Int8 nRefCt = static_cast< sal_Int8 >(pDoc->release());
538         pDoc->SetOle2Link(Link());
539         pDoc->SetDocShell( 0 );
540         if( !nRefCt )
541             delete pDoc;
542         pDoc = 0;       // wir haben das Doc nicht mehr !!
543     }
544 }
545 void SwDocShell::InvalidateModel()
546 {
547     // Uno-Object abklemmen
548     uno::Reference< text::XTextDocument >  xDoc(GetBaseModel(), uno::UNO_QUERY);
549     ((SwXTextDocument*)xDoc.get())->Invalidate();
550 }
551 void SwDocShell::ReactivateModel()
552 {
553     // Uno-Object abklemmen
554     uno::Reference< text::XTextDocument >  xDoc(GetBaseModel(), uno::UNO_QUERY);
555     ((SwXTextDocument*)xDoc.get())->Reactivate(this);
556 }
557 
558 /*--------------------------------------------------------------------
559     Beschreibung: Laden, Default-Format
560  --------------------------------------------------------------------*/
561 
562 
563 sal_Bool  SwDocShell::Load( SfxMedium& rMedium )
564 {
565     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDocShell::Load" );
566     sal_Bool bRet = sal_False;
567     if( SfxObjectShell::Load( rMedium ))
568     {
569         RTL_LOGFILE_CONTEXT_TRACE( aLog, "after SfxInPlaceObject::Load" );
570         if( pDoc )              // fuer Letzte Version !!
571             RemoveLink();       // das existierende Loslassen
572 
573         AddLink();      // Link setzen und Daten updaten !!
574 
575         // Das Laden
576         // fuer MD
577             ASSERT( !mxBasePool.is(), "wer hat seinen Pool nicht zerstoert?" );
578             mxBasePool = new SwDocStyleSheetPool( *pDoc, SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
579             if(GetCreateMode() != SFX_CREATE_MODE_ORGANIZER)
580             {
581                 SFX_ITEMSET_ARG( rMedium.GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False);
582                 nUpdateDocMode = pUpdateDocItem ? pUpdateDocItem->GetValue() : document::UpdateDocMode::NO_UPDATE;
583             }
584 
585         SwWait aWait( *this, sal_True );
586         sal_uInt32 nErr = ERR_SWG_READ_ERROR;
587         switch( GetCreateMode() )
588         {
589 //      case SFX_CREATE_MODE_INTERNAL:
590 //          nErr = 0;
591 //          break;
592 
593         case SFX_CREATE_MODE_ORGANIZER:
594             {
595                 if( ReadXML )
596                 {
597                     ReadXML->SetOrganizerMode( sal_True );
598                     SwReader aRdr( rMedium, aEmptyStr, pDoc );
599                     nErr = aRdr.Read( *ReadXML );
600                     ReadXML->SetOrganizerMode( sal_False );
601                 }
602             }
603             break;
604 
605         case SFX_CREATE_MODE_INTERNAL:
606         case SFX_CREATE_MODE_EMBEDDED:
607             {
608                 // fuer MWERKS (Mac-Compiler): kann nicht selbststaendig casten
609                 SwTransferable::InitOle( this, *pDoc );
610             }
611             // SfxProgress unterdruecken, wenn man Embedded ist
612             SW_MOD()->SetEmbeddedLoadSave( sal_True );
613             // kein break;
614 
615         case SFX_CREATE_MODE_STANDARD:
616         case SFX_CREATE_MODE_PREVIEW:
617             {
618                 Reader *pReader = ReadXML;
619                 if( pReader )
620                 {
621                     // die DocInfo vom Doc am DocShell-Medium setzen
622                     RTL_LOGFILE_CONTEXT_TRACE( aLog, "before ReadDocInfo" );
623                     SwReader aRdr( rMedium, aEmptyStr, pDoc );
624                     RTL_LOGFILE_CONTEXT_TRACE( aLog, "before Read" );
625                     nErr = aRdr.Read( *pReader );
626                     RTL_LOGFILE_CONTEXT_TRACE( aLog, "after Read" );
627 
628                     // If a XML document is loaded, the global doc/web doc
629                     // flags have to be set, because they aren't loaded
630                     // by this formats.
631                     if( ISA( SwWebDocShell ) )
632                     {
633                         if( !pDoc->get(IDocumentSettingAccess::HTML_MODE) )
634                             pDoc->set(IDocumentSettingAccess::HTML_MODE, true);
635                     }
636                     if( ISA( SwGlobalDocShell ) )
637                     {
638                         if( !pDoc->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
639                             pDoc->set(IDocumentSettingAccess::GLOBAL_DOCUMENT, true);
640                     }
641                 }
642 #ifdef DBG_UTIL
643                 else
644                     ASSERT( !this, "ohne Sw3Reader geht nichts" );
645 #endif
646             }
647             break;
648 
649         default:
650             ASSERT( !this, "Load: new CreateMode?" );
651 
652         }
653 
654         UpdateFontList();
655         InitDraw();
656 
657         SetError( nErr, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
658         bRet = !IsError( nErr );
659 
660         // --> OD 2006-11-07 #i59688#
661 //        // StartFinishedLoading rufen.
662 //        if( bRet && !pDoc->IsInLoadAsynchron() &&
663 //            GetCreateMode() == SFX_CREATE_MODE_STANDARD )
664 //            StartLoadFinishedTimer();
665         if ( bRet && !pDoc->IsInLoadAsynchron() &&
666              GetCreateMode() == SFX_CREATE_MODE_STANDARD )
667         {
668             LoadingFinished();
669         }
670         // <--
671 
672         // SfxProgress unterdruecken, wenn man Embedded ist
673         SW_MOD()->SetEmbeddedLoadSave( sal_False );
674     }
675 
676     return bRet;
677 }
678 
679 /*--------------------------------------------------------------------
680     Beschreibung:
681  --------------------------------------------------------------------*/
682 
683 
684 sal_Bool  SwDocShell::LoadFrom( SfxMedium& rMedium )
685 {
686     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDocShell::LoadFrom" );
687     sal_Bool bRet = sal_False;
688     if( pDoc )
689         RemoveLink();
690 
691     AddLink();      // Link setzen und Daten updaten !!
692 
693     do {        // middle check loop
694         sal_uInt32 nErr = ERR_SWG_READ_ERROR;
695         //const String& rNm = pStor->GetName();
696         String aStreamName;
697         aStreamName = String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("styles.xml"));
698         uno::Reference < container::XNameAccess > xAccess( rMedium.GetStorage(), uno::UNO_QUERY );
699         if ( xAccess->hasByName( aStreamName ) && rMedium.GetStorage()->isStreamElement( aStreamName ) )
700         {
701             // Das Laden
702             SwWait aWait( *this, sal_True );
703             {
704                 ASSERT( !mxBasePool.is(), "wer hat seinen Pool nicht zerstoert?" );
705                 mxBasePool = new SwDocStyleSheetPool( *pDoc, SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
706                 if( ReadXML )
707                 {
708                     ReadXML->SetOrganizerMode( sal_True );
709                     SwReader aRdr( rMedium, aEmptyStr, pDoc );
710                     nErr = aRdr.Read( *ReadXML );
711                     ReadXML->SetOrganizerMode( sal_False );
712                 }
713             }
714         }
715         else
716         {
717             DBG_ERROR("Code removed!");
718         /*
719         //TODO/LATER: looks like some binary stuff?!
720             // sollte es sich um eine 2. Vrolage handeln ??
721             if( SvStorage::IsStorageFile( rNm ) )
722                 break;
723 
724             const SfxFilter* pFltr = SwIoSystem::GetFileFilter( rNm, aEmptyStr );
725             if( !pFltr || !pFltr->GetUserData().EqualsAscii( FILTER_SWG ))
726                 break;
727 
728             SfxMedium aMed( rNm, STREAM_STD_READ, sal_False );
729             if( 0 == ( nErr = aMed.GetInStream()->GetError() ) )
730             {
731                 SwWait aWait( *this, sal_True );
732                 SwReader aRead( aMed, rNm, pDoc );
733                 nErr = aRead.Read( *ReadSwg );
734             }
735          */
736         }
737 
738         SetError( nErr, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
739         bRet = !IsError( nErr );
740 
741     } while( sal_False );
742 
743     SfxObjectShell::LoadFrom( rMedium );
744     pDoc->ResetModified();
745     return bRet;
746 }
747 
748 
749 void SwDocShell::SubInitNew()
750 {
751     ASSERT( !mxBasePool.is(), "wer hat seinen Pool nicht zerstoert?" );
752     mxBasePool = new SwDocStyleSheetPool( *pDoc, SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
753     UpdateFontList();
754     InitDraw();
755 
756     pDoc->setLinkUpdateMode( GLOBALSETTING );
757     pDoc->setFieldUpdateFlags( AUTOUPD_GLOBALSETTING );
758 
759     sal_Bool bWeb = ISA(SwWebDocShell);
760 
761     sal_uInt16 nRange[] =   {
762         RES_PARATR_ADJUST, RES_PARATR_ADJUST,
763         RES_CHRATR_COLOR, RES_CHRATR_COLOR,
764         RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
765         RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_LANGUAGE,
766         RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
767         0, 0, 0  };
768     if(!bWeb)
769     {
770         nRange[ (sizeof(nRange)/sizeof(nRange[0])) - 3 ] = RES_PARATR_TABSTOP;
771         nRange[ (sizeof(nRange)/sizeof(nRange[0])) - 2 ] = RES_PARATR_HYPHENZONE;
772     }
773     SfxItemSet aDfltSet( pDoc->GetAttrPool(), nRange );
774 
775     //! get lingu options without loading lingu DLL
776     SvtLinguOptions aLinguOpt;
777 
778     SvtLinguConfig().GetOptions( aLinguOpt );
779 
780     sal_Int16   nVal = MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage, ::com::sun::star::i18n::ScriptType::LATIN),
781                 eCJK = MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage_CJK, ::com::sun::star::i18n::ScriptType::ASIAN),
782                 eCTL = MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage_CTL, ::com::sun::star::i18n::ScriptType::COMPLEX);
783     aDfltSet.Put( SvxLanguageItem( nVal, RES_CHRATR_LANGUAGE ) );
784     aDfltSet.Put( SvxLanguageItem( eCJK, RES_CHRATR_CJK_LANGUAGE ) );
785     aDfltSet.Put( SvxLanguageItem( eCTL, RES_CHRATR_CTL_LANGUAGE ) );
786 
787     if(!bWeb)
788     {
789         SvxHyphenZoneItem aHyp( (SvxHyphenZoneItem&) pDoc->GetDefault(
790                                                         RES_PARATR_HYPHENZONE) );
791         aHyp.GetMinLead()   = static_cast< sal_uInt8 >(aLinguOpt.nHyphMinLeading);
792         aHyp.GetMinTrail()  = static_cast< sal_uInt8 >(aLinguOpt.nHyphMinTrailing);
793 
794         aDfltSet.Put( aHyp );
795 
796         sal_uInt16 nNewPos = static_cast< sal_uInt16 >(SW_MOD()->GetUsrPref(sal_False)->GetDefTab());
797         if( nNewPos )
798             aDfltSet.Put( SvxTabStopItem( 1, nNewPos,
799                                           SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP ) );
800     }
801     aDfltSet.Put( SvxColorItem( Color( COL_AUTO ), RES_CHRATR_COLOR ) );
802 
803     pDoc->SetDefault( aDfltSet );
804 
805     //default page mode for text grid
806     if(!bWeb)
807     {
808         sal_Bool bSquaredPageMode = SW_MOD()->GetUsrPref(sal_False)->IsSquaredPageMode();
809         pDoc->SetDefaultPageMode( bSquaredPageMode );
810     }
811 
812     pDoc->ResetModified();
813 }
814 
815 /*
816  * Document Interface Access
817  */
818 IDocumentDeviceAccess* SwDocShell::getIDocumentDeviceAccess() { return pDoc; }
819 const IDocumentSettingAccess* SwDocShell::getIDocumentSettingAccess() const { return pDoc; }
820 IDocumentChartDataProviderAccess* SwDocShell::getIDocumentChartDataProviderAccess() { return pDoc; }
821