xref: /aoo4110/main/sw/source/ui/app/docsh2.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28 #include <com/sun/star/frame/XDispatchHelper.hpp>
29 
30 #include <comphelper/processfactory.hxx>
31 
32 #include <hintids.hxx>
33 #include <tools/urlobj.hxx>
34 #include <unotools/tempfile.hxx>
35 #include <vcl/wrkwin.hxx>
36 #include <vcl/msgbox.hxx>
37 #include <svl/lckbitem.hxx>
38 #include <svl/eitem.hxx>
39 #include <svl/zforlist.hxx>
40 #include <svl/zformat.hxx>
41 #include <unotools/pathoptions.hxx>
42 #include <svtools/transfer.hxx>
43 #include <sfx2/dialogs.hrc>
44 #include <sfx2/dinfdlg.hxx>
45 #include <sfx2/request.hxx>
46 #include <sfx2/dispatch.hxx>
47 #include <sfx2/new.hxx>
48 #include <sfx2/filedlghelper.hxx>
49 #include <sfx2/printer.hxx>
50 #include <sfx2/evntconf.hxx>
51 #include <svtools/sfxecode.hxx>
52 #include <sfx2/docfile.hxx>
53 #include <sfx2/docfilt.hxx>
54 #include <svx/svxids.hrc>
55 #include <svx/drawitem.hxx>
56 #include <editeng/svxacorr.hxx>
57 #include <editeng/langitem.hxx>
58 #include <svx/fmshell.hxx>
59 
60 #include <svtools/htmlcfg.hxx>
61 //#include <svx/paletteitem.hxx>
62 #include <SwSmartTagMgr.hxx>
63 #include <sfx2/app.hxx>
64 #include <basic/sbstar.hxx>
65 #include <basic/basmgr.hxx>
66 #include <sot/storage.hxx>
67 #include <sot/clsids.hxx>
68 #include <swunodef.hxx>
69 #include <fmtcol.hxx>
70 #include <swevent.hxx>
71 #include <view.hxx> 		// fuer die aktuelle Sicht
72 #include <docsh.hxx>	  	// Dokumenterzeugung
73 #include <wrtsh.hxx>
74 #include <fldbas.hxx>
75 #include <viewopt.hxx>
76 #include <globdoc.hxx>
77 #include <fldwrap.hxx>
78 #include <redlndlg.hxx>
79 #include <docstyle.hxx>
80 #include <doc.hxx>
81 #include <IDocumentUndoRedo.hxx>
82 #include <pagedesc.hxx>
83 #include <shellio.hxx>
84 #include <pview.hxx>
85 #include <srcview.hxx>
86 #include <poolfmt.hxx>
87 #include <usrpref.hxx>
88 #include <wdocsh.hxx>
89 #include <unotxdoc.hxx>
90 #include <acmplwrd.hxx>
91 #include <swmodule.hxx>
92 #include <unobaseclass.hxx>
93 #include <swwait.hxx>
94 #include <swcli.hxx>
95 
96 #include <cmdid.h>
97 #include <globals.h>
98 #include <helpid.h>
99 #include <app.hrc>
100 #include <poolfmt.hrc>
101 #include <globals.hrc>
102 #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
103 #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
104 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
105 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
106 #include <com/sun/star/ui/dialogs/ListboxControlActions.hpp>
107 #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
108 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
109 #ifdef FUTURE_VBA
110 #include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
111 #include <com/sun/star/script/vba/VBAEventId.hpp>
112 #endif
113 #include <editeng/acorrcfg.hxx>
114 #include <SwStyleNameMapper.hxx>
115 
116 #include <sfx2/fcontnr.hxx>
117 
118 #include "swabstdlg.hxx"
119 #include "dialog.hrc"
120 #include "swabstdlg.hxx"
121 
122 #include <ndtxt.hxx>	//#outline level,add by zhaojianwei
123 
124 using namespace ::com::sun::star::ui::dialogs;
125 using namespace ::com::sun::star::lang;
126 using namespace ::com::sun::star::uno;
127 using namespace ::com::sun::star;
128 using ::rtl::OUString;
129 using namespace ::sfx2;
130 extern sal_Bool FindPhyStyle( SwDoc& , const String& , SfxStyleFamily );
131 
132 /*--------------------------------------------------------------------
133 	Beschreibung:	DocInfo kreieren (virtuell)
134  --------------------------------------------------------------------*/
135 
CreateDocumentInfoDialog(Window * pParent,const SfxItemSet & rSet)136 SfxDocumentInfoDialog* SwDocShell::CreateDocumentInfoDialog(
137 								Window *pParent, const SfxItemSet &rSet)
138 {
139 	SfxDocumentInfoDialog* pDlg = new SfxDocumentInfoDialog(pParent, rSet);
140 	//nur mit Statistik, wenn dieses Doc auch angezeigt wird, nicht
141 	//aus dem Doc-Manager
142 	SwDocShell* pDocSh = (SwDocShell*) SfxObjectShell::Current();
143 	if( pDocSh == this )
144 	{
145 		//Nicht fuer SourceView.
146 		SfxViewShell *pVSh = SfxViewShell::Current();
147 		if ( pVSh && !pVSh->ISA(SwSrcView) )
148 		{
149             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
150             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
151 			pDlg->AddTabPage(TP_DOC_STAT, SW_RESSTR(STR_DOC_STAT),pFact->GetTabPageCreatorFunc( TP_DOC_STAT ),0);
152 		}
153 	}
154 	return pDlg;
155 }
156 
157 // Disable "multiple layout"
158 
ToggleBrowserMode(sal_Bool bSet,SwView * _pView)159 void    SwDocShell::ToggleBrowserMode(sal_Bool bSet, SwView* _pView )
160 {
161 	GetDoc()->set(IDocumentSettingAccess::BROWSE_MODE, bSet );
162 	UpdateFontList();
163     SwView* pTempView = _pView ? _pView : (SwView*)GetView();
164 	if( pTempView )
165 	{
166         pTempView->GetViewFrame()->GetBindings().Invalidate(FN_SHADOWCURSOR);
167         if( !GetDoc()->getPrinter( false ) )
168             pTempView->SetPrinter( GetDoc()->getPrinter( false ), SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP );
169         GetDoc()->CheckDefaultPageFmt();
170 		SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this, sal_False);
171 		do {
172 			if( pTmpFrm != pTempView->GetViewFrame() )
173 			{
174 				pTmpFrm->DoClose();
175 				pTmpFrm = SfxViewFrame::GetFirst(this, sal_False);
176 			}
177 			else
178 				pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this, sal_False);
179 
180 		} while ( pTmpFrm );
181         const SwViewOption& rViewOptions = *pTempView->GetWrtShell().GetViewOptions();
182 		pTempView->GetWrtShell().CheckBrowseView( sal_True );
183 		pTempView->CheckVisArea();
184 		if( bSet )
185         {
186     		const SvxZoomType eType = (SvxZoomType)rViewOptions.GetZoomType();
187             if ( SVX_ZOOM_PERCENT != eType)
188 			    ((SwView*)GetView())->SetZoom( eType );
189         }
190 		pTempView->InvalidateBorder();
191 		pTempView->SetNewWindowAllowed(!bSet);
192 	}
193 }
194 // End of disabled "multiple layout"
195 
196 /// update text fields on document properties changes
DoFlushDocInfo()197 void SwDocShell::DoFlushDocInfo()
198 {
199 	if ( !mpDoc ) return;
200 
201     bool bUnlockView(true);
202     if ( mpWrtShell ) {
203         bUnlockView = !mpWrtShell->IsViewLocked();
204         mpWrtShell->LockView( sal_True );	// lock visible section
205         mpWrtShell->StartAllAction();
206     }
207 
208     mpDoc->DocInfoChgd();
209 
210     if ( mpWrtShell ) {
211         mpWrtShell->EndAllAction();
212         if ( bUnlockView ) {
213             mpWrtShell->LockView( sal_False );
214         }
215     }
216 }
217 
218 #ifdef FUTURE_VBA
lcl_processCompatibleSfxHint(const uno::Reference<script::vba::XVBAEventProcessor> & xVbaEvents,const SfxHint & rHint)219 void lcl_processCompatibleSfxHint( const uno::Reference< script::vba::XVBAEventProcessor >& xVbaEvents, const SfxHint& rHint )
220 {
221     using namespace com::sun::star::script::vba::VBAEventId;
222     if ( rHint.ISA( SfxEventHint ) )
223     {
224         uno::Sequence< uno::Any > aArgs;
225         sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId();
226         switch( nEventId )
227         {
228             case SFX_EVENT_CREATEDOC:
229                 xVbaEvents->processVbaEvent( DOCUMENT_NEW, aArgs );
230             break;
231             case SFX_EVENT_OPENDOC:
232                 xVbaEvents->processVbaEvent( DOCUMENT_OPEN, aArgs );
233             break;
234         }
235     }
236 }
237 #endif
238 
239 /*--------------------------------------------------------------------
240 	Beschreibung: 	Benachrichtigung bei geaenderter DocInfo
241  --------------------------------------------------------------------*/
242 
Notify(SfxBroadcaster &,const SfxHint & rHint)243 void SwDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
244 {
245     if( !mpDoc )
246     {
247         return ;
248     }
249 
250 #ifdef FUTURE_VBA
251     uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = mpDoc->GetVbaEventProcessor();
252     if( xVbaEvents.is() )
253         lcl_processCompatibleSfxHint( xVbaEvents, rHint );
254 #endif
255 
256     sal_uInt16 nAction = 0;
257     if( rHint.ISA(SfxSimpleHint) )
258     {
259         // swithc for more actions
260         switch( ((SfxSimpleHint&) rHint).GetId() )
261         {
262         case SFX_HINT_TITLECHANGED:
263             if( GetMedium() )
264                 nAction = 2;
265             break;
266         }
267     }
268     else if( rHint.ISA(SfxEventHint) &&
269         ((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_LOADFINISHED )
270     {
271         nAction = 3;
272     }
273 
274     if( nAction )
275     {
276         sal_Bool bUnlockView = sal_True; //initializing prevents warning
277         if( mpWrtShell )
278         {
279             bUnlockView = !mpWrtShell->IsViewLocked();
280             mpWrtShell->LockView( sal_True );	//lock visible section
281             mpWrtShell->StartAllAction();
282         }
283         switch( nAction )
284         {
285         case 2:
286             mpDoc->GetSysFldType( RES_FILENAMEFLD )->UpdateFlds();
287             break;
288 
289         // own action for event LOADFINISHED in order to avoid a modified document.
290         // Also for the instance of <SwDoc> it has to be assured, that it's not modified.
291         // Perform the same as for action id 1, but disable <SetModified>.
292         case 3:
293             {
294                 const bool bResetModified = IsEnableSetModified();
295                 if ( bResetModified )
296                     EnableSetModified( sal_False );
297                 const bool bIsDocModified = mpDoc->IsModified();
298 
299                 mpDoc->DocInfoChgd( );
300 
301                 if ( !bIsDocModified )
302                     mpDoc->ResetModified();
303                 if ( bResetModified )
304                     EnableSetModified( sal_True );
305             }
306             break;
307         }
308 
309         if( mpWrtShell )
310         {
311             mpWrtShell->EndAllAction();
312             if( bUnlockView )
313                 mpWrtShell->LockView( sal_False );
314         }
315     }
316 }
317 
318 /*--------------------------------------------------------------------
319 	Beschreibung: 	Benachrichtigung Doc schliessen
320  --------------------------------------------------------------------*/
321 
PrepareClose(sal_Bool bUI,sal_Bool bForBrowsing)322 sal_uInt16 SwDocShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
323 {
324 	sal_uInt16 nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing );
325 
326 	if( sal_True == nRet ) //Unbedingt auf sal_True abfragen! (RET_NEWTASK)
327 		EndListening( *this );
328 
329 #ifdef FUTURE_VBA
330     if( mpDoc && IsInPrepareClose() )
331     {
332         uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = mpDoc->GetVbaEventProcessor();
333         if( xVbaEvents.is() )
334         {
335             using namespace com::sun::star::script::vba::VBAEventId;
336             uno::Sequence< uno::Any > aArgs;
337             xVbaEvents->processVbaEvent( DOCUMENT_CLOSE, aArgs );
338         }
339     }
340 #endif
341 	return nRet;
342 }
343 
344 /*--------------------------------------------------------------------
345 	Beschreibung:	Organizer
346  --------------------------------------------------------------------*/
347 
Insert(SfxObjectShell & rSource,sal_uInt16 nSourceIdx1,sal_uInt16 nSourceIdx2,sal_uInt16 nSourceIdx3,sal_uInt16 & rIdx1,sal_uInt16 & rIdx2,sal_uInt16 & rIdx3,sal_uInt16 & rRemovedIdx)348 sal_Bool SwDocShell::Insert( SfxObjectShell &rSource,
349 	sal_uInt16	nSourceIdx1,		// SourcePool: oberste Inhaltsebene (Vorlagen/Makros)
350 	sal_uInt16	nSourceIdx2,		// Index in den Inhalt
351 	sal_uInt16	nSourceIdx3,		// Index in die Inhaltsebene
352 	sal_uInt16 &rIdx1,				// und das gleiche fuer den DestinationPool
353 	sal_uInt16 &rIdx2,				//		""
354 	sal_uInt16 &rIdx3,				//		""
355 	sal_uInt16 &rRemovedIdx )		// falls doppelte geloescht werden, Pos zurueck
356 {
357     // --> OD 2005-05-10 #i48949# - actions aren't undoable. Thus, allow no undo
358     // actions
359     // Note: The undo action stack is cleared at the end of this method.
360     ::sw::UndoGuard const undoGuard(GetDoc()->GetIDocumentUndoRedo());
361     // <--
362 
363     sal_Bool bRet = sal_False;
364 
365 	if (INDEX_IGNORE == rIdx1 && CONTENT_STYLE == nSourceIdx1)
366 		rIdx1 = CONTENT_STYLE;
367 
368 	if (CONTENT_STYLE == nSourceIdx1 && CONTENT_STYLE == rIdx1)
369 	{
370 		SfxStyleSheetBasePool* pHisPool  = rSource.GetStyleSheetPool();
371 		SwDocStyleSheetPool* pMyPool =
372 			(SwDocStyleSheetPool*)GetStyleSheetPool();
373 
374 		//	wir koennen nicht in uns selbst hin und her moven
375 		if( pHisPool == pMyPool )
376 			return sal_False;
377 
378 		if( INDEX_IGNORE == rIdx2 )
379 			rIdx2 = pMyPool->Count();
380 
381 		// erstmal auf die Such-Maske "positionieren"
382 		pHisPool->First();
383 		SfxStyleSheetBase* pHisSheet = (*pHisPool)[nSourceIdx2];
384 
385 		// wenn so eine Vorlage schon existiert: loeschen!
386 		const String& rOldName = pHisSheet->GetName();
387 		SfxStyleFamily eOldFamily( pHisSheet->GetFamily() );
388 
389 		// dflt. PageDesc und StandardZeichenvorlage nie loeschen !!!
390 		if( ( SFX_STYLE_FAMILY_PAGE == eOldFamily &&
391 			  const_cast<const SwDoc *>(mpDoc)->GetPageDesc(0).GetName() ==
392               rOldName ) ||
393 			  ( SFX_STYLE_FAMILY_CHAR == eOldFamily &&
394 				rOldName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD -
395 												RES_POOLCOLL_TEXT_BEGIN ] ))
396 			return sal_False;
397 
398 		SfxStyleFamily eMyOldFamily( pMyPool->GetSearchFamily() );
399 		sal_uInt16 nMySrchMask = pMyPool->GetSearchMask();
400 
401 		SfxStyleSheetBase* pExist;
402 		if( ::FindPhyStyle( *mpDoc, rOldName, eOldFamily ) )
403 		{
404 			// Bug 20365: nur uebernehmen, wenn das gewuenscht ist!
405 			if( ERRCODE_BUTTON_OK != ErrorHandler::HandleError(
406 				*new MessageInfo( ERRCODE_SFXMSG_STYLEREPLACE, rOldName )) )
407 			{
408 				return sal_False;
409 			}
410 
411 			// Da Replace den aStyleSheet-Member selbst benoetigt, muss
412 			// das Ergebnis vom Find kopiert werden (s.u.))
413 			rtl::Reference< SwDocStyleSheet > xExist( new SwDocStyleSheet(
414 					*(SwDocStyleSheet*)pMyPool->Find( rOldName, eOldFamily ) ) );
415 			pMyPool->Replace( *pHisSheet, *xExist.get() );
416 
417 			// An der Reihenfolge der Vorlagen im Pool aendert sich nichts.
418 			rIdx2 = rIdx1 = INDEX_IGNORE;
419 
420 			GetDoc()->SetModified();
421 
422 			return sal_True;
423 		}
424 
425 		pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
426 
427 		// MIB 18.12.98: SwDocStyleSheetPool::Make liefert einen
428 		// Pointer auf SwDocStyleSheetPool::aStyleSheet zurueck.
429 		// Der gleiche Member von SwDocStyleSheetPool::Find benutzt.
430 		// Deshalb muss hier mit einer Kopie gearbeitet werden.
431 		// Vorsicht: SfxStyleSheetBase::SetFollow ruft seinerseits
432 		// ein SwDocStyleSheetPool::Find auf, do dass es nicht genuegt
433 		// die Find-Aufrufe in dieser Methode zu eleminieren.
434 
435 		rtl::Reference< SwDocStyleSheet > xNewSheet( new SwDocStyleSheet( (SwDocStyleSheet&)pMyPool
436 				->Make(rOldName, eOldFamily, pHisSheet->GetMask() ) ) );
437 		if( SFX_STYLE_FAMILY_PAGE == eOldFamily && rSource.ISA(SwDocShell) )
438 		{
439 			// gesondert behandeln!!
440 			SwPageDesc* pDestDsc = (SwPageDesc*)xNewSheet->GetPageDesc();
441 			SwPageDesc* pCpyDsc = (SwPageDesc*)((SwDocStyleSheet*)pHisSheet)->GetPageDesc();
442 			mpDoc->CopyPageDesc( *pCpyDsc, *pDestDsc );
443 		}
444 		else
445 			// die neue Vorlage mit den Attributen fuellen
446 			xNewSheet->SetItemSet( pHisSheet->GetItemSet() );
447 
448 		pMyPool->SetSearchMask( SFX_STYLE_FAMILY_ALL, nMySrchMask );
449 
450 		if(	xNewSheet->IsUserDefined() || xNewSheet->IsUsed() )
451 		{
452 			// Benutzte und Benutzer-definierte Vorlagen werden angezeigt.
453 			// Dshalb muss hier der Index der neuen Vorlage im Pool
454 			// ermittelt werden.
455 			pExist = pMyPool->First();
456 			sal_uInt16 nIdx = 0;
457 			while( pExist )
458 			{
459 				if( pExist->GetName() == rOldName &&
460 				   eOldFamily == pExist->GetFamily() )
461 				{
462 					rIdx2 = nIdx;
463 					break;
464 				}
465 				pExist = pMyPool->Next();
466 				nIdx++;
467 			}
468 		}
469 		else
470 		{
471 			// Andere Vorlagen werden nicht angezeigt.
472 			rIdx1 = rIdx2 = INDEX_IGNORE;
473 		}
474 
475 /*		  pMyPool->Count(); 	  //interne Liste neu fuellen lassen!!!!!
476 
477 		// suchen, um die richige Insert-Position returnen zu koennen
478 		pMyPool->Find( rOldName, SFX_STYLE_FAMILY_ALL, nMySrchMask );
479 		rIdx2 = pMyPool->GetFindPos();*/
480 
481 		// wer bekommt den Neuen als Parent? wer benutzt den Neuen als Follow?
482 		// (immer nur ueber die Instanziierten!!!)
483 		pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
484 		pMyPool->SetOrganizerMode( sal_True );
485 		SfxStyleSheetBase* pTestSheet = pMyPool->First();
486 		while (pTestSheet)
487 		{
488 			if (pTestSheet->GetFamily() == eOldFamily &&
489 				pTestSheet->HasParentSupport()		  &&
490 				pTestSheet->GetParent() == rOldName)
491 			{
492 				pTestSheet->SetParent(rOldName); // Verknuepfung neu aufbauen
493 			}
494 
495 			if (pTestSheet->GetFamily() == eOldFamily &&
496 				pTestSheet->HasFollowSupport()		  &&
497 				pTestSheet->GetFollow() == rOldName)
498 			{
499 				pTestSheet->SetFollow(rOldName); // Verknuepfung neu aufbauen
500 			}
501 
502 			pTestSheet = pMyPool->Next();
503 		}
504 		pMyPool->SetOrganizerMode( SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
505 
506 		// hat der Neue einen Parent? wenn ja, mit gleichem Namen bei uns suchen
507 		if (pHisSheet->HasParentSupport())
508 		{
509 			const String& rParentName = pHisSheet->GetParent();
510 			if (0 != rParentName.Len())
511 			{
512 				SfxStyleSheetBase* pParentOfNew = pMyPool->Find(rParentName,
513 																eOldFamily);
514 				if (pParentOfNew)
515 				{
516 					xNewSheet->SetParent(rParentName);
517 				}
518 				pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
519 			}
520 		}
521 
522 		// hat der Neue einen Follow? wenn ja, mit gleichem Namen bei uns suchen
523 		if (pHisSheet->HasFollowSupport())
524 		{
525 			const String& rFollowName = pHisSheet->GetFollow();
526 			if (0 != rFollowName.Len())
527 			{
528 				SfxStyleSheetBase* pFollowOfNew = pMyPool->Find(rFollowName,
529 																eOldFamily);
530 				if (pFollowOfNew)
531 				{
532 					xNewSheet->SetFollow(rFollowName);
533 				}
534 				pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
535 			}
536 		}
537 
538 		// Bug 27347: alte Einstellung wieder setzen
539 		pMyPool->SetSearchMask( eMyOldFamily, nMySrchMask );
540 
541 		// Model geaendert
542 		ASSERT(mpDoc, "Doc fehlt");
543 		GetDoc()->SetModified();
544 
545 		bRet = sal_True;
546 	}
547 	else
548 		bRet = SfxObjectShell::Insert( rSource,
549 					nSourceIdx1,
550 					nSourceIdx2,
551 					nSourceIdx3,
552 					rIdx1,
553 					rIdx2,
554 					rIdx3,
555 					rRemovedIdx);
556 
557     // --> OD 2005-05-10 #i48949# - actions aren't undoable and could have change
558     // the document node array. Thus, clear the undo action stack.
559     if (undoGuard.UndoWasEnabled())
560     {
561         GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj();
562     }
563     // <--
564 
565     return bRet;
566 }
567 
568 /*--------------------------------------------------------------------
569 	Beschreibung:	Vorlagen Remove
570  --------------------------------------------------------------------*/
571 
Remove(sal_uInt16 nIdx1,sal_uInt16 nIdx2,sal_uInt16 nIdx3)572 sal_Bool SwDocShell::Remove(sal_uInt16 nIdx1,		// siehe Insert
573 						sal_uInt16 nIdx2,
574 						sal_uInt16 nIdx3)
575 {
576 	sal_Bool bRet = sal_False;
577 
578 	if (CONTENT_STYLE == nIdx1)
579 	{
580 		SwDocStyleSheetPool* pMyPool = (SwDocStyleSheetPool*)GetStyleSheetPool();
581 
582 		pMyPool->First();		// vorm Zugriff Pool aktualisieren!!
583 		SfxStyleSheetBase* pMySheet = (*pMyPool)[nIdx2];
584 
585 		String aName( pMySheet->GetName() );
586 		SfxStyleFamily eFamily( pMySheet->GetFamily() );
587 
588 		// dflt. PageDesc und StandardZeichenvorlage nie loeschen !!!
589 		if( ( SFX_STYLE_FAMILY_PAGE == eFamily &&
590 			  const_cast<const SwDoc *>(mpDoc)->GetPageDesc(0).GetName()
591               == aName ) ||
592 			  ( SFX_STYLE_FAMILY_CHAR == eFamily &&
593 				aName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD -
594 												RES_POOLCOLL_TEXT_BEGIN ] ))
595 			return sal_False;
596 
597 		// also loeschen
598 		pMyPool->Remove( pMySheet );
599 
600 		// jetzt noch die Parents/Follows aller Instanziierten korrigieren
601 		pMyPool->SetOrganizerMode( sal_True );
602 		SfxStyleSheetBase* pTestSheet = pMyPool->First();
603 		while (pTestSheet)
604 		{
605 			if (pTestSheet->GetFamily() == eFamily &&
606 				pTestSheet->HasParentSupport()	   &&
607 				pTestSheet->GetParent() == aName)
608 			{
609 				pTestSheet->SetParent( aEmptyStr ); // Verknuepfung aufloesen
610 			}
611 
612 			if (pTestSheet->GetFamily() == eFamily &&
613 				pTestSheet->HasFollowSupport()		  &&
614 				pTestSheet->GetFollow() == aName)
615 			{
616 				pTestSheet->SetFollow( aEmptyStr ); // Verknuepfung aufloesen
617 			}
618 
619 			pTestSheet = pMyPool->Next();
620 		}
621 		pMyPool->SetOrganizerMode( SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
622 
623 		bRet = sal_True;
624 	}
625 	else
626 		bRet = SfxObjectShell::Remove( 	nIdx1,
627 										nIdx2,
628 										nIdx3 );
629 
630 
631 	// Model geaendert
632 	ASSERT(mpDoc, "Doc fehlt");
633 	GetDoc()->SetModified();
634 
635 	return bRet;
636 }
637 
638 /*--------------------------------------------------------------------
639 	Beschreibung:
640  --------------------------------------------------------------------*/
641 
Execute(SfxRequest & rReq)642 void SwDocShell::Execute(SfxRequest& rReq)
643 {
644 	const SfxItemSet* pArgs = rReq.GetArgs();
645 	const SfxPoolItem* pItem;
646 	sal_uInt16 nWhich = rReq.GetSlot();
647 	sal_Bool bDone = sal_False;
648 	switch ( nWhich )
649 	{
650         case SID_AUTO_CORRECT_DLG:
651 		{
652 			SvxSwAutoFmtFlags* pAFlags = &SvxAutoCorrCfg::Get()->GetAutoCorrect()->GetSwFlags();
653 			SwAutoCompleteWord& rACW = SwDoc::GetAutoCompleteWords();
654 
655 			sal_Bool bOldLocked = rACW.IsLockWordLstLocked(),
656 				 bOldAutoCmpltCollectWords = pAFlags->bAutoCmpltCollectWords;
657 
658 			rACW.SetLockWordLstLocked( sal_True );
659 
660 			SvStringsISortDtor aTmpLst;
661 			aTmpLst.Insert( &rACW.GetWordList() );
662 			pAFlags->pAutoCmpltList = &aTmpLst;
663 
664 			SfxApplication* pApp = SFX_APP();
665 			SfxRequest aAppReq(SID_AUTO_CORRECT_DLG, SFX_CALLMODE_SYNCHRON, pApp->GetPool());
666             SfxBoolItem aSwOptions( SID_AUTO_CORRECT_DLG, sal_True );
667 			aAppReq.AppendItem(aSwOptions);
668 
669             // SMARTTAGS
670             pAFlags->pSmartTagMgr = &SwSmartTagMgr::Get();
671 
672 			//pApp->ExecuteSlot(aAppReq);
673 
674             SfxItemSet aSet( pApp->GetPool(), SID_AUTO_CORRECT_DLG, SID_AUTO_CORRECT_DLG, SID_OPEN_SMARTTAGOPTIONS, SID_OPEN_SMARTTAGOPTIONS, 0 );
675             aSet.Put( aSwOptions );
676 
677             const SfxPoolItem* pOpenSmartTagOptionsItem = 0;
678             if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_OPEN_SMARTTAGOPTIONS, sal_False, &pOpenSmartTagOptionsItem ) )
679                 aSet.Put( *static_cast<const SfxBoolItem*>(pOpenSmartTagOptionsItem) );
680 
681 			SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
682     	  	SfxAbstractTabDialog* pDlg = pFact->CreateTabDialog( RID_OFA_AUTOCORR_DLG, NULL, &aSet, NULL );
683 		  	pDlg->Execute();
684 		  	delete pDlg;
685 
686 			rACW.SetLockWordLstLocked( bOldLocked );
687 
688 			SwEditShell::SetAutoFmtFlags( pAFlags );
689 			rACW.SetMinWordLen( pAFlags->nAutoCmpltWordLen );
690 			rACW.SetMaxCount( pAFlags->nAutoCmpltListLen );
691 			if( pAFlags->pAutoCmpltList )  // any changes?
692 			{
693 				rACW.CheckChangedList( aTmpLst );
694 				// clear the temp WordList pointer
695 				pAFlags->pAutoCmpltList = 0;
696 			}
697 			// remove all pointer we never delete the strings
698 			aTmpLst.Remove( (sal_uInt16)0, aTmpLst.Count() );
699 
700 			if( !bOldAutoCmpltCollectWords && bOldAutoCmpltCollectWords !=
701 				pAFlags->bAutoCmpltCollectWords )
702 			{
703 				// call on all Docs the idle formatter to start
704 				// the collection of Words
705 				TypeId aType = TYPE(SwDocShell);
706 				for( SwDocShell *pDocSh = (SwDocShell*)SfxObjectShell::GetFirst(&aType);
707 			 		pDocSh;
708 			 		pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) )
709 				{
710 					SwDoc* pTmp = pDocSh->GetDoc();
711 					if ( pTmp->GetCurrentViewShell() )	//swmod 071108//swmod 071225
712 						pTmp->InvalidateAutoCompleteFlag();
713 				}
714 			}
715 		}
716 		break;
717 
718 		case SID_PRINTPREVIEW:
719 			{
720 				sal_Bool bSet = sal_False, bFound = sal_False, bOnly = sal_True;
721 				SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this);
722 				SfxViewShell* pViewShell = SfxViewShell::Current();
723                 SwView* pCurrView = dynamic_cast< SwView *> ( pViewShell );
724 				sal_Bool bCurrent = IS_TYPE( SwPagePreView, pViewShell );
725 
726 				while( pTmpFrm ) 	// search PreView
727 				{
728 					if( IS_TYPE( SwView, pTmpFrm->GetViewShell()) )
729 						bOnly = sal_False;
730 					else if( IS_TYPE( SwPagePreView, pTmpFrm->GetViewShell()))
731 					{
732 						pTmpFrm->GetFrame().Appear();
733 						bFound = sal_True;
734 					}
735 					if( bFound && !bOnly )
736 						break;
737 					pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this);
738 				}
739 
740 				if( pArgs && SFX_ITEM_SET ==
741 					pArgs->GetItemState( SID_PRINTPREVIEW, sal_False, &pItem ))
742 					bSet = ((SfxBoolItem*)pItem)->GetValue();
743 				else
744 					bSet = !bCurrent;
745 
746 				sal_uInt16 nSlotId = 0;
747 				if( bSet && !bFound )	// Keine gefunden, daher neue Preview anlegen
748 						nSlotId = SID_VIEWSHELL1;
749 				else if( bFound && !bSet )
750 					nSlotId = bOnly ? SID_VIEWSHELL0 : SID_VIEWSHELL1;
751 
752 				if( nSlotId )
753 				{
754 					//JP 23.8.2001: Bug 91360 - PagePreView in the WebDocShell
755 					//				is found under Id ViewShell2.
756 					if( ISA(SwWebDocShell) && SID_VIEWSHELL1 == nSlotId )
757 						nSlotId = SID_VIEWSHELL2;
758 
759                     if( pCurrView && pCurrView->GetDocShell() == this )
760                         pTmpFrm = pCurrView->GetViewFrame();
761 					else
762 						pTmpFrm = SfxViewFrame::GetFirst( this );
763 
764                     pTmpFrm->GetDispatcher()->Execute( nSlotId, 0, 0, SFX_CALLMODE_ASYNCHRON );
765 				}
766 
767 				rReq.SetReturnValue(SfxBoolItem(SID_PRINTPREVIEW, bSet ));
768 			}
769 			break;
770 		case SID_TEMPLATE_LOAD:
771 			{
772 				String aFileName;
773                 static sal_Bool bText = sal_True;
774                 static sal_Bool bFrame = sal_False;
775                 static sal_Bool bPage =  sal_False;
776                 static sal_Bool bNum =   sal_False;
777                 static sal_Bool bMerge = sal_False;
778 				sal_uInt16 nRet = USHRT_MAX;
779 
780                 sal_uInt16 nFlags = bFrame ? SFX_LOAD_FRAME_STYLES : 0;
781                 if(bPage)
782                     nFlags|= SFX_LOAD_PAGE_STYLES;
783                 if(bNum)
784                     nFlags|= SFX_LOAD_NUM_STYLES;
785                 if(!nFlags || bText)
786                     nFlags|= SFX_LOAD_TEXT_STYLES;
787                 if(bMerge)
788                     nFlags|= SFX_MERGE_STYLES;
789 
790                 if ( pArgs )
791                 {
792                     SFX_REQUEST_ARG( rReq, pTemplateItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False );
793                     if ( pTemplateItem )
794                     {
795                         aFileName = pTemplateItem->GetValue();
796                         SFX_REQUEST_ARG( rReq, pFlagsItem, SfxInt32Item, SID_TEMPLATE_LOAD, sal_False );
797                         if ( pFlagsItem )
798                             nFlags = (sal_uInt16) pFlagsItem->GetValue();
799                     }
800                 }
801 
802                 if ( !aFileName.Len() )
803                 {
804                     SvtPathOptions aPathOpt;
805                     SfxNewFileDialog* pNewFileDlg =
806                         new SfxNewFileDialog(&GetView()->GetViewFrame()->GetWindow(), SFXWB_LOAD_TEMPLATE);
807                     pNewFileDlg->SetTemplateFlags(nFlags);
808 
809                     nRet = pNewFileDlg->Execute();
810                     if(RET_TEMPLATE_LOAD == nRet)
811                     {
812                         FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 );
813                         uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
814 
815                         xFP->setDisplayDirectory( aPathOpt.GetWorkPath() );
816 
817                         SfxObjectFactory &rFact = GetFactory();
818 						SfxFilterMatcher aMatcher( String::CreateFromAscii(rFact.GetShortName()) );
819 						SfxFilterMatcherIter aIter( &aMatcher );
820                         uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
821                         const SfxFilter* pFlt = aIter.First();
822                         while( pFlt )
823                         {
824                             // --> OD #i117339#
825 //                            if( pFlt && pFlt->IsAllowedAsTemplate() )
826                             if( pFlt && pFlt->IsAllowedAsTemplate() &&
827                                 ( pFlt->GetUserData().EqualsAscii("CXML") ||
828                                   pFlt->GetUserData().EqualsAscii("CXMLV") ) )
829                             {
830                                 const String sWild = ((WildCard&)pFlt->GetWildcard()).GetWildCard();
831                                 xFltMgr->appendFilter( pFlt->GetUIName(), sWild );
832                             }
833 							pFlt = aIter.Next();
834                         }
835                         sal_Bool bWeb = 0 != dynamic_cast< SwWebDocShell *>( this );
836                         const SfxFilter *pOwnFlt =
837                                 SwDocShell::Factory().GetFilterContainer()->
838                                 GetFilter4FilterName(String::CreateFromAscii("writer8"));
839 
840                         //#b6439685# make sure the default file format is also available
841                         if(bWeb)
842                         {
843                             const String sWild = ((WildCard&)pOwnFlt->GetWildcard()).GetWildCard();
844                             xFltMgr->appendFilter( pOwnFlt->GetUIName(), sWild );
845                         }
846 
847                         bool bError = false;
848                         //#b6439685# catch expception if wrong filter is selected - should not happen anymore
849                         try
850                         {
851                             xFltMgr->setCurrentFilter( pOwnFlt->GetUIName() );
852                         }
853                         catch( const uno::Exception& )
854                         {
855                             bError = true;
856                         }
857 
858                         if( !bError && ERRCODE_NONE == aDlgHelper.Execute() )
859                         {
860                             aFileName = xFP->getFiles().getConstArray()[0];
861                         }
862                     }
863                     else if( RET_OK == nRet)
864                     {
865                         aFileName = pNewFileDlg->GetTemplateFileName();
866                     }
867 
868                     nFlags = pNewFileDlg->GetTemplateFlags();
869                     rReq.AppendItem( SfxStringItem( SID_TEMPLATE_NAME, aFileName ) );
870                     rReq.AppendItem( SfxInt32Item( SID_TEMPLATE_LOAD, (long) nFlags ) );
871                     delete pNewFileDlg;
872                 }
873 
874                 if( aFileName.Len() )
875                 {
876                     SwgReaderOption aOpt;
877                     aOpt.SetTxtFmts(    bText = (0 != (nFlags&SFX_LOAD_TEXT_STYLES) ));
878                     aOpt.SetFrmFmts(    bFrame = (0 != (nFlags&SFX_LOAD_FRAME_STYLES)));
879                     aOpt.SetPageDescs(  bPage = (0 != (nFlags&SFX_LOAD_PAGE_STYLES )));
880                     aOpt.SetNumRules(   bNum = (0 != (nFlags&SFX_LOAD_NUM_STYLES  )));
881                     //different meaning between SFX_MERGE_STYLES and aOpt.SetMerge!
882                     bMerge = 0 != (nFlags&SFX_MERGE_STYLES);
883                     aOpt.SetMerge( !bMerge );
884 
885 					SetError( LoadStylesFromFile( aFileName, aOpt, sal_False ), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
886                     if ( !GetError() )
887                         rReq.Done();
888                 }
889             }
890 			break;
891 			case SID_SOURCEVIEW:
892 			{
893 				SfxViewShell* pViewShell = GetView()
894 											? (SfxViewShell*)GetView()
895 											: SfxViewShell::Current();
896 				SfxViewFrame*  pViewFrm = pViewShell->GetViewFrame();
897                 SwSrcView* pSrcView = dynamic_cast< SwSrcView *>( pViewShell );
898 				if(!pSrcView)
899 				{
900                     // 3 possible state:
901                     // 1 - file unsaved -> save as HTML
902                     // 2 - file modified and HTML filter active -> save
903                     // 3 - file saved in non-HTML -> QueryBox to save as HTML
904                     const SfxFilter* pHtmlFlt =
905                                     SwIoSystem::GetFilterOfFormat(
906                                         String::CreateFromAscii("HTML"),
907                                         SwWebDocShell::Factory().GetFilterContainer() );
908                     sal_Bool bLocalHasName = HasName();
909                     if(bLocalHasName)
910                     {
911                         //check for filter type
912                         const SfxFilter* pFlt = GetMedium()->GetFilter();
913                         if(!pFlt || pFlt->GetUserData() != pHtmlFlt->GetUserData())
914                         {
915                             QueryBox aQuery(&pViewFrm->GetWindow(), SW_RES(MSG_SAVEAS_HTML_QUERY));
916                             if(RET_YES == aQuery.Execute())
917                                 bLocalHasName = sal_False;
918                             else
919                                 break;
920                         }
921                     }
922                     if(!bLocalHasName)
923 					{
924                         FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION, 0 );
925                         aDlgHelper.AddFilter( pHtmlFlt->GetFilterName(), pHtmlFlt->GetDefaultExtension() );
926                         aDlgHelper.SetCurrentFilter( pHtmlFlt->GetFilterName() );
927 	                    if( ERRCODE_NONE != aDlgHelper.Execute())
928                         {
929                             break;
930                         }
931                         String sPath = aDlgHelper.GetPath();
932                         SfxStringItem aName(SID_FILE_NAME, sPath);
933                         SfxStringItem aFilter(SID_FILTER_NAME, pHtmlFlt->GetName());
934                         const SfxBoolItem* pBool = (const SfxBoolItem*)
935 								pViewFrm->GetDispatcher()->Execute(
936                                         SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON, &aName, &aFilter, 0L );
937 						if(!pBool || !pBool->GetValue())
938                             break;
939 					}
940 				}
941 #ifdef DBG_UTIL
942 				{
943                     sal_Bool bWeb = 0 != dynamic_cast<SwWebDocShell*>(this);
944 					DBG_ASSERT(bWeb == sal_True, "SourceView nur in der WebDocShell");
945 				}
946 #endif
947 				// die SourceView ist fuer die SwWebDocShell die 1
948 				sal_uInt16 nSlot = SID_VIEWSHELL1;
949 				sal_Bool bSetModified = sal_False;
950 				SfxPrinter* pSavePrinter = 0;
951 				if( 0 != pSrcView)
952 				{
953                     SfxPrinter* pTemp = GetDoc()->getPrinter( false );
954 					if(pTemp)
955 						pSavePrinter = new SfxPrinter(*pTemp);
956 					bSetModified = IsModified() || pSrcView->IsModified();
957 					if(pSrcView->IsModified()||pSrcView->HasSourceSaved())
958 					{
959 						utl::TempFile aTempFile;
960 						aTempFile.EnableKillingFile();
961 						pSrcView->SaveContent(aTempFile.GetURL());
962 						bDone = sal_True;
963 						SvxMacro aMac(aEmptyStr, aEmptyStr, STARBASIC);
964                         SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_OPENDOC ), aMac, this);
965 						SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_PREPARECLOSEDOC ), aMac, this);
966 						SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_ACTIVATEDOC ), 	aMac, this);
967 						SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_DEACTIVATEDOC ), aMac, this);
968 						ReloadFromHtml(aTempFile.GetURL(), pSrcView);
969 						nSlot = 0;
970 					}
971 					else
972 					{
973 						nSlot = SID_VIEWSHELL0;
974 					}
975 				}
976 /*	 OS 10.04.97 14.20: Im Web-Writer gibt es keinen Unterschied zwischen
977 						Export in den SourceMode und dem Speichern des Docs
978 				else if(IsModified())
979 				{
980 					sal_uInt16 nRet = QueryBox( SFX_APPWINDOW ,SW_RES(MSG_SAVE_HTML_QUERY)).Execute();
981 					if(RET_YES == nRet)
982 					{
983 						S F X _DISPATCHER().Execute(SID_SAVEDOC,
984 									SFX_CALLMODE_SYNCHRON);
985 						// der ReturnValue von SID_SAVEDOC ist etwas schwer verstaendlich
986 						if(IsModified())
987 							nSlot = 0;
988 					}
989 					else if( RET_CANCEL == nRet )
990 					{
991 						nSlot = 0;
992 					}
993 				}*/
994 				if(nSlot)
995 					pViewFrm->GetDispatcher()->Execute(nSlot, SFX_CALLMODE_SYNCHRON);
996 				if(bSetModified)
997 					GetDoc()->SetModified();
998 				if(pSavePrinter)
999 				{
1000                     GetDoc()->setPrinter( pSavePrinter, true, true);
1001 					//pSavePrinter darf nicht wieder geloescht werden
1002 				}
1003 				pViewFrm->GetBindings().SetState(SfxBoolItem(SID_SOURCEVIEW, nSlot == SID_VIEWSHELL2));
1004                 pViewFrm->GetBindings().Invalidate( SID_NEWWINDOW );
1005 				pViewFrm->GetBindings().Invalidate( SID_BROWSER_MODE );
1006 				pViewFrm->GetBindings().Invalidate( FN_PRINT_LAYOUT );
1007 			}
1008 			break;
1009 			case SID_GET_COLORTABLE:
1010 			{
1011 				const SvxColorTableItem* pColItem = static_cast< const SvxColorTableItem* >(GetItem(SID_COLOR_TABLE));
1012 				XColorListSharedPtr aTable = pColItem->GetColorTable();
1013 
1014 				rReq.SetReturnValue(SvxColorTableItem(aTable, SID_GET_COLORTABLE));
1015 			}
1016 			break;
1017 		case FN_ABSTRACT_STARIMPRESS:
1018 		case FN_ABSTRACT_NEWDOC:
1019 		{
1020             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
1021             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
1022 
1023             AbstractSwInsertAbstractDlg* pDlg = pFact->CreateSwInsertAbstractDlg(0, DLG_INSERT_ABSTRACT );
1024             DBG_ASSERT(pDlg, "Dialogdiet fail!");
1025 			if(RET_OK == pDlg->Execute())
1026 			{
1027 				sal_uInt8 nLevel = pDlg->GetLevel();
1028 				sal_uInt8 nPara = pDlg->GetPara();
1029 				SwDoc* pSmryDoc = new SwDoc();
1030 				SfxObjectShellLock xDocSh( new SwDocShell( pSmryDoc, SFX_CREATE_MODE_STANDARD));
1031 				xDocSh->DoInitNew( 0 );
1032 
1033 				sal_Bool bImpress = FN_ABSTRACT_STARIMPRESS == nWhich;
1034 				mpDoc->Summary( pSmryDoc, nLevel, nPara, bImpress );
1035 				if( bImpress )
1036 				{
1037 					WriterRef xWrt;
1038                     // mba: looks as if relative URLs don't make sense here
1039                     ::GetRTFWriter( aEmptyStr, String(), xWrt );
1040 					SvMemoryStream *pStrm = new SvMemoryStream();
1041 					pStrm->SetBufferSize( 16348 );
1042 					SwWriter aWrt( *pStrm, *pSmryDoc );
1043 					ErrCode eErr = aWrt.Write( xWrt );
1044 					if( !ERRCODE_TOERROR( eErr ) )
1045 					{
1046                         uno::Reference< lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory();
1047                         uno::Reference< frame::XDispatchProvider > xProv(
1048 							xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.drawing.ModuleDispatcher")), UNO_QUERY );
1049 						if ( xProv.is() )
1050 						{
1051 							::rtl::OUString aCmd = ::rtl::OUString::createFromAscii( "SendOutlineToImpress" );
1052                             uno::Reference< frame::XDispatchHelper > xHelper(
1053 								xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.frame.DispatchHelper")), UNO_QUERY );
1054 							if ( xHelper.is() )
1055 							{
1056 								pStrm->Seek( STREAM_SEEK_TO_END );
1057 								*pStrm << '\0';
1058 								pStrm->Seek( STREAM_SEEK_TO_BEGIN );
1059 
1060 								// Transfer ownership of stream to a lockbytes object
1061 								SvLockBytes aLockBytes( pStrm, sal_True );
1062 								SvLockBytesStat aStat;
1063 								if ( aLockBytes.Stat( &aStat, SVSTATFLAG_DEFAULT ) == ERRCODE_NONE )
1064 								{
1065 									sal_uInt32 nLen = aStat.nSize;
1066 									sal_uLong nRead = 0;
1067                                     uno::Sequence< sal_Int8 > aSeq( nLen );
1068 									aLockBytes.ReadAt( 0, aSeq.getArray(), nLen, &nRead );
1069 
1070                                     uno::Sequence< beans::PropertyValue > aArgs(1);
1071 									aArgs[0].Name = ::rtl::OUString::createFromAscii("RtfOutline");
1072 									aArgs[0].Value <<= aSeq;
1073 									xHelper->executeDispatch( xProv, aCmd, ::rtl::OUString(), 0, aArgs );
1074 								}
1075 							}
1076 						}
1077 					}
1078 					else
1079 						ErrorHandler::HandleError(ErrCode( eErr ));
1080 				}
1081 				else
1082 				{
1083 					// Neues Dokument erzeugen.
1084                     SfxViewFrame *pFrame = SfxViewFrame::LoadDocument( *xDocSh, 0 );
1085                     SwView      *pCurrView = (SwView*) pFrame->GetViewShell();
1086 
1087 					// Dokumenttitel setzen
1088 					String aTmp( SW_RES(STR_ABSTRACT_TITLE) );
1089 					aTmp += GetTitle();
1090 					xDocSh->SetTitle( aTmp );
1091                     pCurrView->GetWrtShell().SetNewDoc();
1092 					pFrame->Show();
1093 					pSmryDoc->SetModified();
1094 				}
1095 
1096 			}
1097 			delete pDlg;
1098 		}
1099 		break;
1100 		case FN_OUTLINE_TO_CLIPBOARD:
1101 		case FN_OUTLINE_TO_IMPRESS:
1102 			{
1103 				sal_Bool bEnable = IsEnableSetModified();
1104 				EnableSetModified( sal_False );
1105 				WriterRef xWrt;
1106                 // mba: looks as if relative URLs don't make sense here
1107                 ::GetRTFWriter( 'O', String(), xWrt );
1108 				SvMemoryStream *pStrm = new SvMemoryStream();
1109 				pStrm->SetBufferSize( 16348 );
1110 				SwWriter aWrt( *pStrm, *GetDoc() );
1111 				ErrCode eErr = aWrt.Write( xWrt );
1112 				EnableSetModified( bEnable );
1113 				if( !ERRCODE_TOERROR( eErr ) )
1114 				{
1115 					pStrm->Seek( STREAM_SEEK_TO_END );
1116 					*pStrm << '\0';
1117 					pStrm->Seek( STREAM_SEEK_TO_BEGIN );
1118 					if ( nWhich == FN_OUTLINE_TO_IMPRESS )
1119 					{
1120                         uno::Reference< lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory();
1121                         uno::Reference< frame::XDispatchProvider > xProv(
1122 							xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.drawing.ModuleDispatcher")), UNO_QUERY );
1123 						if ( xProv.is() )
1124 						{
1125 							::rtl::OUString aCmd = ::rtl::OUString::createFromAscii( "SendOutlineToImpress" );
1126                             uno::Reference< frame::XDispatchHelper > xHelper(
1127 								xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.frame.DispatchHelper")), UNO_QUERY );
1128 							if ( xHelper.is() )
1129 							{
1130 								pStrm->Seek( STREAM_SEEK_TO_END );
1131 								*pStrm << '\0';
1132 								pStrm->Seek( STREAM_SEEK_TO_BEGIN );
1133 
1134 								// Transfer ownership of stream to a lockbytes object
1135 								SvLockBytes aLockBytes( pStrm, sal_True );
1136 								SvLockBytesStat aStat;
1137 								if ( aLockBytes.Stat( &aStat, SVSTATFLAG_DEFAULT ) == ERRCODE_NONE )
1138 								{
1139 									sal_uInt32 nLen = aStat.nSize;
1140 									sal_uLong nRead = 0;
1141                                     uno::Sequence< sal_Int8 > aSeq( nLen );
1142 									aLockBytes.ReadAt( 0, aSeq.getArray(), nLen, &nRead );
1143 
1144                                     uno::Sequence< beans::PropertyValue > aArgs(1);
1145 									aArgs[0].Name = ::rtl::OUString::createFromAscii("RtfOutline");
1146 									aArgs[0].Value <<= aSeq;
1147 									xHelper->executeDispatch( xProv, aCmd, ::rtl::OUString(), 0, aArgs );
1148 								}
1149 							}
1150 						}
1151 					}
1152 					else
1153 					{
1154 						TransferDataContainer* pClipCntnr =
1155 													new TransferDataContainer;
1156 						STAR_REFERENCE( datatransfer::XTransferable )
1157 														xRef( pClipCntnr );
1158 
1159 						pClipCntnr->CopyAnyData( FORMAT_RTF, (sal_Char*)
1160                                     pStrm->GetData(), pStrm->GetEndOfData() );
1161 						pClipCntnr->CopyToClipboard(
1162 							GetView()? (Window*)&GetView()->GetEditWin() : 0 );
1163 						delete pStrm;
1164 					}
1165 				}
1166 				else
1167 					ErrorHandler::HandleError(ErrCode( eErr ));
1168 			}
1169 			break;
1170 			case SID_SPELLCHECKER_CHANGED:
1171 				//! sal_False, sal_True, sal_True is on the save side but a probably overdone
1172 				SW_MOD()->CheckSpellChanges(sal_False, sal_True, sal_True, sal_False );
1173 			break;
1174 
1175         case SID_MAIL_PREPAREEXPORT:
1176         {
1177             //pWrtShell is not set in page preview
1178             if(mpWrtShell)
1179                 mpWrtShell->StartAllAction();
1180             mpDoc->UpdateFlds( NULL, false );
1181             mpDoc->EmbedAllLinks();
1182             mpDoc->RemoveInvisibleContent();
1183             if(mpWrtShell)
1184                 mpWrtShell->EndAllAction();
1185         }
1186         break;
1187 
1188         case SID_MAIL_EXPORT_FINISHED:
1189         {
1190                 if(mpWrtShell)
1191                     mpWrtShell->StartAllAction();
1192                 //try to undo the removal of invisible content
1193                 mpDoc->RestoreInvisibleContent();
1194                 if(mpWrtShell)
1195                     mpWrtShell->EndAllAction();
1196         }
1197         break;
1198 		case FN_NEW_HTML_DOC:
1199 		case FN_NEW_GLOBAL_DOC:
1200 			{
1201 				bDone = sal_False;
1202                 sal_Bool bCreateHtml = FN_NEW_HTML_DOC == nWhich;
1203 
1204 				sal_Bool bCreateByOutlineLevel = false;		//#outline level,add by zhaojianwei
1205 				sal_Int32  nTemplateOutlineLevel = 0 ;		//#outline level,add by zhaojianwei
1206 
1207                 String aFileName, aTemplateName;
1208                 if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich, sal_False, &pItem ) )
1209                 {
1210                     aFileName = ((const SfxStringItem*)pItem)->GetValue();
1211                     SFX_ITEMSET_ARG( pArgs, pTemplItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False );
1212                     if ( pTemplItem )
1213                         aTemplateName = pTemplItem->GetValue();
1214                 }
1215                 bool bError = false;
1216                 if ( !aFileName.Len() )
1217                 {
1218                     FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE, 0 );
1219 
1220                     const sal_Int16 nControlIds[] = {
1221                         CommonFilePickerElementIds::PUSHBUTTON_OK,
1222                         CommonFilePickerElementIds::PUSHBUTTON_CANCEL,
1223                         CommonFilePickerElementIds::LISTBOX_FILTER,
1224                         CommonFilePickerElementIds::CONTROL_FILEVIEW,
1225                         CommonFilePickerElementIds::EDIT_FILEURL,
1226                         ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION,
1227                         ExtendedFilePickerElementIds::LISTBOX_TEMPLATE,
1228                         0
1229                     };
1230 
1231                     const char* aHTMLHelpIds[] =
1232                     {
1233                          HID_SEND_HTML_CTRL_PUSHBUTTON_OK,
1234                          HID_SEND_HTML_CTRL_PUSHBUTTON_CANCEL,
1235                          HID_SEND_HTML_CTRL_LISTBOX_FILTER,
1236                          HID_SEND_HTML_CTRL_CONTROL_FILEVIEW,
1237                          HID_SEND_HTML_CTRL_EDIT_FILEURL,
1238                          HID_SEND_HTML_CTRL_CHECKBOX_AUTOEXTENSION,
1239                          HID_SEND_HTML_CTRL_LISTBOX_TEMPLATE,
1240                          ""
1241                     };
1242 
1243                     const char* aMasterHelpIds[] =
1244                     {
1245                          HID_SEND_MASTER_CTRL_PUSHBUTTON_OK,
1246                          HID_SEND_MASTER_CTRL_PUSHBUTTON_CANCEL,
1247                          HID_SEND_MASTER_CTRL_LISTBOX_FILTER,
1248                          HID_SEND_MASTER_CTRL_CONTROL_FILEVIEW,
1249                          HID_SEND_MASTER_CTRL_EDIT_FILEURL,
1250                          HID_SEND_MASTER_CTRL_CHECKBOX_AUTOEXTENSION,
1251                          HID_SEND_MASTER_CTRL_LISTBOX_TEMPLATE,
1252                          ""
1253                     };
1254 
1255                     const char** pHelpIds = bCreateHtml ? aHTMLHelpIds : aMasterHelpIds;
1256                     aDlgHelper.SetControlHelpIds( nControlIds, pHelpIds );
1257                     uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
1258 
1259                     const SfxFilter* pFlt;
1260                     sal_uInt16 nStrId;
1261 
1262                     if( bCreateHtml )
1263                     {
1264                         // fuer HTML gibts es nur einen Filter!!
1265                         pFlt = SwIoSystem::GetFilterOfFormat(
1266                                 String::CreateFromAscii("HTML"),
1267                                 SwWebDocShell::Factory().GetFilterContainer() );
1268                         nStrId = STR_LOAD_HTML_DOC;
1269                     }
1270                     else
1271                     {
1272                         // Fuer Global-Dokumente bieten wir jetzt auch nur
1273                         // noch den aktuellen an.
1274                         pFlt = SwGlobalDocShell::Factory().GetFilterContainer()->
1275                                     GetFilter4Extension( String::CreateFromAscii("odm")  );
1276                         nStrId = STR_LOAD_GLOBAL_DOC;
1277                     }
1278 
1279                     if( pFlt )
1280                     {
1281                         uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
1282                         const String sWild = ((WildCard&)pFlt->GetWildcard()).GetWildCard();
1283                         xFltMgr->appendFilter( pFlt->GetUIName(), sWild );
1284                         try
1285                         {
1286                             xFltMgr->setCurrentFilter( pFlt->GetUIName() ) ;
1287                         }
1288                         catch( const uno::Exception& )
1289                         {
1290                             bError = true;
1291                         }
1292                     }
1293                     if(!bError)
1294                     {
1295                         uno::Reference<XFilePickerControlAccess> xCtrlAcc(xFP, UNO_QUERY);
1296 
1297 				//#removed by zhaojianwei
1298 
1299         //             const sal_uInt16 nCount = pDoc->GetTxtFmtColls()->Count();
1300         //                Sequence<OUString> aListBoxEntries(nCount);
1301         //                OUString* pEntries = aListBoxEntries.getArray();
1302         //                sal_Int32 nIdx = 0;
1303         //                sal_Int16 nSelect = 0;
1304         //                OUString sStartTemplate;
1305         //                SwTxtFmtColl *pFnd = 0, *pAny = 0;
1306         //                for(sal_uInt16 i = 0; i < nCount; ++i)
1307         //                {
1308         //                    SwTxtFmtColl &rTxtColl =
1309         //                                    *pDoc->GetTxtFmtColls()->GetObject( i );
1310         //                    if( !rTxtColl.IsDefault() && rTxtColl.IsAtDocNodeSet() )
1311         //                    {
1312         //                        //if( MAXLEVEL >= rTxtColl.GetOutlineLevel() && ( !pFnd ||			//#outline level,zhaojianwei
1313 								//if(  rTxtColl.IsAssignedToListLevelOfOutlineStyle()  && ( !pFnd ||	//<-end,zhaojianwei
1314         //                            pFnd->GetAssignedOutlineStyleLevel() > rTxtColl.GetAssignedOutlineStyleLevel() ))
1315         //                        {
1316         //                                nSelect = (sal_Int16)nIdx;
1317         //                                pFnd = &rTxtColl;
1318         //                                sStartTemplate = rTxtColl.GetName();
1319         //                        }
1320         //                        else if( !pAny )
1321         //                            pAny = &rTxtColl;
1322         //                        //pEntries[nIdx++] = rTxtColl.GetName();			//#outline level,remove by zhaojianwei
1323         //                        pEntries[nIdx++] = sStyles + rTxtColl.GetName();	//#outline level,add by zhaojianwei
1324         //                    }
1325         //                }
1326         //                if(!sStartTemplate.getLength() && pAny)
1327         //                    sStartTemplate = pAny->GetName();
1328         //                aListBoxEntries.realloc(nIdx);
1329 				//<-end,zhaojianwei
1330 
1331 
1332 					//#outline level,add by zhaojianwei
1333 					/////////////////////////////////////////////////////////////////////
1334 
1335 						bool	bOutline[MAXLEVEL] = {false};
1336 						const SwOutlineNodes& rOutlNds = mpDoc->GetNodes().GetOutLineNds();
1337 						if( rOutlNds.Count() )
1338 						{
1339 							int nLevel;
1340 							for(sal_uInt16 n = 0; n < rOutlNds.Count(); ++n )
1341 								if( ( nLevel = rOutlNds[n]->GetTxtNode()->GetAttrOutlineLevel()) > 0 &&
1342 									! bOutline[nLevel-1] )
1343 								{
1344 									bOutline[nLevel-1] = true;
1345 								}
1346 						}
1347 
1348 						const sal_uInt16 nStyleCount = mpDoc->GetTxtFmtColls()->Count();
1349 						Sequence<OUString> aListBoxEntries( MAXLEVEL + nStyleCount);
1350 						OUString* pEntries = aListBoxEntries.getArray();
1351 						sal_Int32	nIdx = 0 ;
1352 
1353 						OUString	sOutline( SW_RESSTR(STR_FDLG_OUTLINE_LEVEL) );
1354 						for( sal_uInt16 i = 0; i < MAXLEVEL; ++i )
1355 						{
1356 							if( bOutline[i] )
1357 								pEntries[nIdx++] = sOutline + String::CreateFromInt32( i+1 );
1358 						}
1359 
1360 						OUString	sStyle( SW_RESSTR(STR_FDLG_STYLE) );
1361 						for(sal_uInt16 i = 0; i < nStyleCount; ++i)
1362 						{
1363 							SwTxtFmtColl &rTxtColl =
1364 								*mpDoc->GetTxtFmtColls()->GetObject( i );
1365 							if( !rTxtColl.IsDefault() && rTxtColl.IsAtDocNodeSet() )
1366 							{
1367 								pEntries[nIdx++] = sStyle + rTxtColl.GetName();
1368 							}
1369 						}
1370 
1371 						aListBoxEntries.realloc(nIdx);
1372 						sal_Int16 nSelect = 0;
1373  					/////////////////////////////////////////////////////////////////////
1374 					//<-end,zhaojianwei
1375 
1376 						try
1377                         {
1378                             Any aTemplates(&aListBoxEntries, ::getCppuType(&aListBoxEntries));
1379 
1380                             xCtrlAcc->setValue( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE,
1381                                 ListboxControlActions::ADD_ITEMS , aTemplates );
1382                             Any aSelectPos(&nSelect, ::getCppuType(&nSelect));
1383                             xCtrlAcc->setValue( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE,
1384                                 ListboxControlActions::SET_SELECT_ITEM, aSelectPos );
1385                             xCtrlAcc->setLabel( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE,
1386                                                     String(SW_RES( STR_FDLG_TEMPLATE_NAME )));
1387                         }
1388                         catch(Exception& )
1389                         {
1390                             DBG_ERROR("control acces failed");
1391                         }
1392 
1393                         xFP->setTitle( SW_RESSTR( nStrId ));
1394                         SvtPathOptions aPathOpt;
1395                         xFP->setDisplayDirectory( aPathOpt.GetWorkPath() );
1396                         if( ERRCODE_NONE == aDlgHelper.Execute())
1397                         {
1398                             aFileName = xFP->getFiles().getConstArray()[0];
1399                             Any aTemplateValue = xCtrlAcc->getValue(
1400                                 ExtendedFilePickerElementIds::LISTBOX_TEMPLATE,
1401                                 ListboxControlActions::GET_SELECTED_ITEM );
1402                             OUString sTmpl;
1403                             aTemplateValue >>= sTmpl;
1404 							//aTemplateName = sTmpl;	//#outline level,removed by zhaojianwei
1405 							//#outline level,add by zhaojianwei
1406 
1407 							sal_Int32 nColonPos = sTmpl.indexOf( sal_Unicode(':') );
1408 							OUString sPrefix = sTmpl.copy( 0L, nColonPos );
1409 							if( sPrefix.equalsAscii("Style"))
1410 							{
1411 								aTemplateName = sTmpl.copy( 7L );	//get string behind "Style: "
1412 							}
1413 							else if( sPrefix.equalsAscii("Outline"))
1414 							{
1415 								nTemplateOutlineLevel =	( sTmpl.copy( 15L )).toInt32();	//get string behind "Outline: Leve  ";
1416 								bCreateByOutlineLevel = true;
1417 							}
1418 							//<-end,zhaojianwei
1419 
1420                             if ( aFileName.Len() )
1421                             {
1422                                 rReq.AppendItem( SfxStringItem( nWhich, aFileName ) );
1423                                 if( aTemplateName.Len() )
1424                                     rReq.AppendItem( SfxStringItem( SID_TEMPLATE_NAME, aTemplateName ) );
1425                             }
1426                         }
1427                     }
1428                 }
1429 
1430 				//const SwTxtFmtColl* pSplitColl = 0;		//#outline level,removed by zhaojianwei
1431     //            if ( aTemplateName.Len() )
1432     //                pSplitColl = pDoc->FindTxtFmtCollByName(aTemplateName);
1433 															//<-end,zhaojianwei
1434 				if( aFileName.Len() )
1435 				{
1436 					if( PrepareClose( sal_False ) )
1437 					{
1438 						SwWait aWait( *this, true );
1439 
1440 						//bDone = bCreateHtml			//#outline level,removed by zhaojianwei
1441 						//	? pDoc->GenerateHTMLDoc( aFileName, pSplitColl )
1442 						//	: pDoc->GenerateGlobalDoc( aFileName, pSplitColl );
1443 						if ( bCreateByOutlineLevel )	//add by zhaojianwei
1444 						{
1445 							bDone = bCreateHtml			//#outline level,removed by zhaojianwei
1446 								? mpDoc->GenerateHTMLDoc( aFileName, nTemplateOutlineLevel )
1447 								: mpDoc->GenerateGlobalDoc( aFileName, nTemplateOutlineLevel );
1448 						}
1449 						else
1450 						{
1451 							const SwTxtFmtColl* pSplitColl = 0;
1452 							if ( aTemplateName.Len() )
1453 								pSplitColl = mpDoc->FindTxtFmtCollByName(aTemplateName);
1454 							bDone = bCreateHtml			//#outline level,removed by zhaojianwei
1455 								? mpDoc->GenerateHTMLDoc( aFileName, pSplitColl )
1456 								: mpDoc->GenerateGlobalDoc( aFileName, pSplitColl );
1457 						}
1458 						//<-end,zhaojianwei
1459 						if( bDone )
1460 						{
1461 							SfxStringItem aName( SID_FILE_NAME, aFileName );
1462 							SfxStringItem aReferer( SID_REFERER, aEmptyStr );
1463                             SfxViewShell* pViewShell = SfxViewShell::GetFirst();
1464                             while(pViewShell)
1465                             {
1466                                 //search for the view that created the call
1467                                 if(pViewShell->GetObjectShell() == this && pViewShell->GetDispatcher())
1468                                 {
1469                                     SfxFrameItem* pFrameItem = new SfxFrameItem( SID_DOCFRAME,
1470                                                         pViewShell->GetViewFrame() );
1471                                     SfxDispatcher* pDispatch = pViewShell->GetDispatcher();
1472                                     pDispatch->Execute(
1473                                             SID_OPENDOC,
1474                                             SFX_CALLMODE_ASYNCHRON,
1475                                             &aName,
1476                                             &aReferer,
1477                                             pFrameItem, 0L );
1478 
1479                                     delete pFrameItem;
1480                                     break;
1481                                 }
1482                                 pViewShell = SfxViewShell::GetNext(*pViewShell);
1483                             }
1484                         }
1485 					}
1486 					if( !bDone && !rReq.IsAPI() )
1487 					{
1488 						InfoBox( 0, SW_RESSTR( STR_CANTCREATE )).Execute();
1489 					}
1490 				}
1491 			}
1492 			rReq.SetReturnValue(SfxBoolItem( nWhich, bDone ));
1493 			if (bDone)
1494 				rReq.Done();
1495 			else
1496 				rReq.Ignore();
1497 			break;
1498 
1499 		case SID_ATTR_YEAR2000:
1500 			if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , sal_False, &pItem ))
1501 			{
1502 				DBG_ASSERT(pItem->ISA(SfxUInt16Item), "falsches Item");
1503 				sal_uInt16 nYear2K = ((SfxUInt16Item*)pItem)->GetValue();
1504 				//ueber Views iterieren und den State an den FormShells setzen
1505 
1506 				SfxViewFrame* pVFrame = SfxViewFrame::GetFirst( this );
1507 				SfxViewShell* pViewShell = pVFrame ? pVFrame->GetViewShell() : 0;
1508                 SwView* pCurrView = dynamic_cast< SwView* >( pViewShell );
1509                 while(pCurrView)
1510 				{
1511                     FmFormShell* pFormShell = pCurrView->GetFormShell();
1512 					if(pFormShell)
1513 						pFormShell->SetY2KState(nYear2K);
1514 					pVFrame = SfxViewFrame::GetNext( *pVFrame, this );
1515 					pViewShell = pVFrame ? pVFrame->GetViewShell() : 0;
1516                     pCurrView = dynamic_cast<SwView*>( pViewShell );
1517 				}
1518 				mpDoc->GetNumberFormatter(sal_True)->SetYear2000(nYear2K);
1519 			}
1520 		break;
1521 
1522 		default: DBG_ERROR("falscher Dispatcher");
1523 	}
1524 }
1525 
1526 
1527 /*--------------------------------------------------------------------
1528 	Beschreibung:
1529  --------------------------------------------------------------------*/
1530 
DdeGetData(const String & rItem,const String & rMimeType,uno::Any & rValue)1531 long SwDocShell::DdeGetData( const String& rItem, const String& rMimeType,
1532                                 uno::Any & rValue )
1533 {
1534 	return mpDoc->GetData( rItem, rMimeType, rValue );
1535 }
1536 
1537 
1538 /*--------------------------------------------------------------------
1539 	Beschreibung:
1540  --------------------------------------------------------------------*/
1541 
DdeSetData(const String & rItem,const String & rMimeType,const uno::Any & rValue)1542 long SwDocShell::DdeSetData( const String& rItem, const String& rMimeType,
1543                             const uno::Any & rValue )
1544 {
1545 	return mpDoc->SetData( rItem, rMimeType, rValue );
1546 }
1547 
1548 
1549 /*--------------------------------------------------------------------
1550 	Beschreibung:
1551  --------------------------------------------------------------------*/
1552 
DdeCreateLinkSource(const String & rItem)1553 ::sfx2::SvLinkSource* SwDocShell::DdeCreateLinkSource( const String& rItem )
1554 {
1555 	return mpDoc->CreateLinkSource( rItem );
1556 }
1557 
1558 /*--------------------------------------------------------------------
1559 	Beschreibung:
1560  --------------------------------------------------------------------*/
1561 
FillClass(SvGlobalName * pClassName,sal_uInt32 * pClipFormat,String *,String * pLongUserName,String * pUserName,sal_Int32 nVersion,sal_Bool bTemplate) const1562 void SwDocShell::FillClass( SvGlobalName * pClassName,
1563 								   sal_uInt32 * pClipFormat,
1564 								   String * /*pAppName*/,
1565 								   String * pLongUserName,
1566                                    String * pUserName,
1567                                    sal_Int32 nVersion,
1568                                    sal_Bool bTemplate /* = sal_False */) const
1569 {
1570 	if (nVersion == SOFFICE_FILEFORMAT_60)
1571 	{
1572 		*pClassName		= SvGlobalName( SO3_SW_CLASSID_60 );
1573 		*pClipFormat	= SOT_FORMATSTR_ID_STARWRITER_60;
1574 		*pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE);
1575 	}
1576 	else if (nVersion == SOFFICE_FILEFORMAT_8)
1577 	{
1578 		*pClassName		= SvGlobalName( SO3_SW_CLASSID_60 );
1579         *pClipFormat	= bTemplate ? SOT_FORMATSTR_ID_STARWRITER_8_TEMPLATE : SOT_FORMATSTR_ID_STARWRITER_8;
1580 		*pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE);
1581 	}
1582 
1583 	*pUserName = SW_RESSTR(STR_HUMAN_SWDOC_NAME);
1584 }
1585 
1586 
1587 /*--------------------------------------------------------------------
1588 	Beschreibung:
1589  --------------------------------------------------------------------*/
1590 
SetModified(sal_Bool bSet)1591 void SwDocShell::SetModified( sal_Bool bSet )
1592 {
1593     SfxObjectShell::SetModified( bSet );
1594 	if( IsEnableSetModified())
1595 	{
1596 		 if (!mpDoc->IsInCallModified() )
1597 		 {
1598 			EnableSetModified( sal_False );
1599 			if( bSet )
1600 			{
1601 				sal_Bool bOld = mpDoc->IsModified();
1602 				mpDoc->SetModified();
1603 				if( !bOld )
1604                 {
1605                     mpDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
1606                 }
1607 			}
1608 			else
1609 				mpDoc->ResetModified();
1610 
1611 			EnableSetModified( sal_True );
1612 		 }
1613 
1614 		UpdateChildWindows();
1615 		Broadcast(SfxSimpleHint(SFX_HINT_DOCCHANGED));
1616 	}
1617 }
1618 
1619 /*--------------------------------------------------------------------
1620 	Beschreibung:
1621  --------------------------------------------------------------------*/
1622 
UpdateChildWindows()1623 void SwDocShell::UpdateChildWindows()
1624 {
1625 	// Flddlg ggf neu initialisieren (z.B. fuer TYP_SETVAR)
1626 	if(!GetView())
1627 		return;
1628 	SfxViewFrame* pVFrame = GetView()->GetViewFrame();
1629 	SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame->
1630 			GetChildWindow( SwFldDlgWrapper::GetChildWindowId() );
1631 	if( pWrp )
1632 		pWrp->ReInitDlg( this );
1633 
1634 	// RedlineDlg ggf neu initialisieren
1635 	SwRedlineAcceptChild *pRed = (SwRedlineAcceptChild*)pVFrame->
1636 			GetChildWindow( SwRedlineAcceptChild::GetChildWindowId() );
1637 	if( pRed )
1638 		pRed->ReInitDlg( this );
1639 }
1640 
1641 /*--------------------------------------------------------------------
1642 	Beschreibung:
1643  --------------------------------------------------------------------*/
1644 // --> OD 2005-08-02 #i48748#
1645 class SwReloadFromHtmlReader : public SwReader
1646 {
1647     public:
SwReloadFromHtmlReader(SfxMedium & _rTmpMedium,const String & _rFilename,SwDoc * _pDoc)1648         SwReloadFromHtmlReader( SfxMedium& _rTmpMedium,
1649                                 const String& _rFilename,
1650                                 SwDoc* _pDoc )
1651             : SwReader( _rTmpMedium, _rFilename, _pDoc )
1652         {
1653             SetBaseURL( _rFilename );
1654         }
1655 };
1656 // <--
ReloadFromHtml(const String & rStreamName,SwSrcView * pSrcView)1657 void SwDocShell::ReloadFromHtml( const String& rStreamName, SwSrcView* pSrcView )
1658 {
1659 	sal_Bool bModified = IsModified();
1660 
1661 	// MIB 23.6.97: Die HTTP-Header-Felder muessen geloescht werden,
1662 	// sonst gibt es welche aus Meta-Tags hinter doppelt und dreifach.
1663 	ClearHeaderAttributesForSourceViewHack();
1664 
1665 	// MIB 24.07.97: Das Dokument-Basic muss auch noch d'ran glauben ...
1666 	SvxHtmlOptions* pHtmlOptions = SvxHtmlOptions::Get();
1667 	//#59620# HasBasic() zeigt an, dass es schon einen BasicManager an der DocShell
1668 	//			gibt. Der wurde im HTML-Import immer angelegt, wenn Macros im Quelltext
1669 	//			vorhanden sind.
1670 	if( pHtmlOptions && pHtmlOptions->IsStarBasic() && HasBasic())
1671 	{
1672 		BasicManager *pBasicMan = GetBasicManager();
1673 		if( pBasicMan && (pBasicMan != SFX_APP()->GetBasicManager()) )
1674 		{
1675 			sal_uInt16 nLibCount = pBasicMan->GetLibCount();
1676 			while( nLibCount )
1677 			{
1678 				StarBASIC *pBasic = pBasicMan->GetLib( --nLibCount );
1679 				if( pBasic )
1680 				{
1681 					// Die IDE benachrichtigen
1682                     SfxUsrAnyItem aShellItem( SID_BASICIDE_ARG_DOCUMENT_MODEL, makeAny( GetModel() ) );
1683                     String aLibName( pBasic->GetName() );
1684                     SfxStringItem aLibNameItem( SID_BASICIDE_ARG_LIBNAME, aLibName );
1685 					pSrcView->GetViewFrame()->GetDispatcher()->Execute(
1686 											SID_BASICIDE_LIBREMOVED,
1687 											SFX_CALLMODE_SYNCHRON,
1688 											&aShellItem, &aLibNameItem, 0L );
1689 
1690 					// Aus der Standard-Lib werden nur die Module geloescht
1691 					if( nLibCount )
1692 						pBasicMan->RemoveLib( nLibCount, sal_True );
1693 					else
1694 						pBasic->Clear();
1695 				}
1696 			}
1697 
1698 			ASSERT( pBasicMan->GetLibCount() <= 1,
1699 					"Loschen des Basics hat nicht geklappt" );
1700 		}
1701 	}
1702     sal_Bool bWasBrowseMode = mpDoc->get(IDocumentSettingAccess::BROWSE_MODE);
1703 	RemoveLink();
1704 
1705 	//jetzt muss auch das UNO-Model ueber das neue Doc informiert werden #51535#
1706 	uno::Reference<text::XTextDocument> xDoc(GetBaseModel(), uno::UNO_QUERY);
1707 	text::XTextDocument* pxDoc = xDoc.get();
1708 	((SwXTextDocument*)pxDoc)->InitNewDoc();
1709 
1710 	AddLink();
1711 	//#116402# update font list when new document is created
1712 	UpdateFontList();
1713 	mpDoc->set(IDocumentSettingAccess::BROWSE_MODE, bWasBrowseMode);
1714 	pSrcView->SetPool(&GetPool());
1715 
1716 
1717 	const String& rMedname = GetMedium()->GetName();
1718 
1719 	// fix #51032#: Die HTML-Vorlage muss noch gesetzt werden
1720 	SetHTMLTemplate( *GetDoc() );	//Styles aus HTML.vor
1721 
1722 	SfxViewShell* pViewShell = GetView() ? (SfxViewShell*)GetView()
1723 										 : SfxViewShell::Current();
1724 	SfxViewFrame*  pViewFrm = pViewShell->GetViewFrame();
1725 	pViewFrm->GetDispatcher()->Execute( SID_VIEWSHELL0, SFX_CALLMODE_SYNCHRON );
1726 
1727 	SubInitNew();
1728 
1729 	SfxMedium aMed( rStreamName, STREAM_READ, sal_False );
1730     // --> OD 2005-08-01 #i48748# - use class <SwReloadFromHtmlReader>, because
1731     // the base URL has to be set to the filename of the document <rMedname>
1732     // and not to the base URL of the temporary file <aMed> in order to get
1733     // the URLs of the linked graphics correctly resolved.
1734     SwReloadFromHtmlReader aReader( aMed, rMedname, mpDoc );
1735     // <--
1736     aReader.Read( *ReadHTML );
1737 
1738     const SwView* pCurrView = GetView();
1739     //in print layout the first page(s) may have been formatted as a mix of browse
1740     //and print layout
1741     if(!bWasBrowseMode && pCurrView)
1742     {
1743         SwWrtShell& rWrtSh = pCurrView->GetWrtShell();
1744         if( rWrtSh.GetLayout())
1745             rWrtSh.CheckBrowseView( sal_True );
1746     }
1747 
1748 
1749 	// MIB 23.6.97: Die HTTP-Header-Attribute wieder in die DokInfo
1750 	// uebernehmen. Die Base-URL ist hier egal, da TLX zum absolutieren die
1751 	// vom Dokument nimmt.
1752 	SetHeaderAttributesForSourceViewHack();
1753 
1754 	if(bModified && !IsReadOnly())
1755 		SetModified();
1756 	else
1757 		mpDoc->ResetModified();
1758 }
1759 
LoadStylesFromFile(const String & rURL,SwgReaderOption & rOpt,sal_Bool bUnoCall)1760 sal_uLong SwDocShell::LoadStylesFromFile( const String& rURL,
1761 					SwgReaderOption& rOpt, sal_Bool bUnoCall )
1762 {
1763 	sal_uLong nErr = 0;
1764 
1765 	// Create a URL from filename
1766 	INetURLObject aURLObj( rURL );
1767 	String sURL( aURLObj.GetMainURL( INetURLObject::NO_DECODE ) );
1768 
1769 	// Filter bestimmen:
1770 //  const SfxFilter* pFlt = SwIoSystem::GetFileFilter( rURL, aEmptyStr );
1771     String sFactory(String::CreateFromAscii(SwDocShell::Factory().GetShortName()));
1772     SfxFilterMatcher aMatcher( sFactory );
1773 
1774 	//#b6445961#  search for filter in WebDocShell, too
1775     SfxMedium aMed( rURL, STREAM_STD_READ, sal_False );
1776     const SfxFilter* pFlt = 0;
1777     aMatcher.DetectFilter( aMed, &pFlt, sal_False, sal_False );
1778     if(!pFlt)
1779     {
1780         String sWebFactory(String::CreateFromAscii(SwWebDocShell::Factory().GetShortName()));
1781         SfxFilterMatcher aWebMatcher( sWebFactory );
1782         aWebMatcher.DetectFilter( aMed, &pFlt, sal_False, sal_False );
1783     }
1784     // --> OD #i117339# - trigger import only for own formats
1785 //    if( aMed.IsStorage() )
1786     bool bImport( false );
1787     {
1788         if ( aMed.IsStorage() )
1789         {
1790             // As <SfxMedium.GetFilter().IsOwnFormat() resp. IsOwnTemplateFormat()
1791             // does not work correct (e.g., MS Word 2007 XML Template),
1792             // use workaround provided by MAV.
1793             uno::Reference< embed::XStorage > xStorage = aMed.GetStorage();
1794             if ( xStorage.is() )
1795             {
1796                 // use <try-catch> on retrieving <MediaType> in order to check,
1797                 // if the storage is one of our own ones.
1798                 try
1799                 {
1800                     uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY_THROW );
1801                     const ::rtl::OUString aMediaTypePropName( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) );
1802                     xProps->getPropertyValue( aMediaTypePropName );
1803                     bImport = true;
1804                 }
1805                 catch( const uno::Exception& )
1806                 {
1807                     bImport = false;
1808                 }
1809             }
1810         }
1811     }
1812     if ( bImport )
1813     // <--
1814 	{
1815         DBG_ASSERT((pFlt ? pFlt->GetVersion() : 0) >= SOFFICE_FILEFORMAT_60, "which file version?");
1816         SwRead pRead =  ReadXML;
1817         SwReader* pReader = 0;
1818         SwPaM* pPam = 0;
1819 		// the SW3IO - Reader need the pam/wrtshell, because only then he
1820 		// insert the styles!
1821 		if( bUnoCall )
1822 		{
1823 			SwNodeIndex aIdx( mpDoc->GetNodes().GetEndOfContent(), -1 );
1824 			pPam = new SwPaM( aIdx );
1825 			pReader = new SwReader( aMed, rURL, *pPam );
1826 		}
1827 		else
1828         {
1829 			pReader = new SwReader( aMed, rURL, *mpWrtShell->GetCrsr() );
1830         }
1831 
1832 		pRead->GetReaderOpt().SetTxtFmts( rOpt.IsTxtFmts() );
1833 		pRead->GetReaderOpt().SetFrmFmts( rOpt.IsFrmFmts() );
1834 		pRead->GetReaderOpt().SetPageDescs( rOpt.IsPageDescs() );
1835 		pRead->GetReaderOpt().SetNumRules( rOpt.IsNumRules() );
1836 		pRead->GetReaderOpt().SetMerge( rOpt.IsMerge() );
1837 
1838         if( bUnoCall )
1839 		{
1840 			UnoActionContext aAction( mpDoc );
1841 			nErr = pReader->Read( *pRead );
1842 		}
1843 		else
1844 		{
1845 			mpWrtShell->StartAllAction();
1846 			nErr = pReader->Read( *pRead );
1847 			mpWrtShell->EndAllAction();
1848 		}
1849         delete pPam;
1850         delete pReader;
1851 	}
1852 
1853     return nErr;
1854 }
1855 
1856 /*--------------------------------------------------------------------
1857     Get a client for an embedded object if possible.
1858  --------------------------------------------------------------------*/
GetIPClient(const::svt::EmbeddedObjectRef & xObjRef)1859 SfxInPlaceClient* SwDocShell::GetIPClient( const ::svt::EmbeddedObjectRef& xObjRef )
1860 {
1861     SfxInPlaceClient* pResult = NULL;
1862 
1863     SwWrtShell* pShell = GetWrtShell();
1864     if ( pShell )
1865     {
1866         pResult = pShell->GetView().FindIPClient( xObjRef.GetObject(), (Window*)&pShell->GetView().GetEditWin() );
1867         if ( !pResult )
1868             pResult = new SwOleClient( &pShell->GetView(), &pShell->GetView().GetEditWin(), xObjRef );
1869     }
1870 
1871     return pResult;
1872 }
1873 
1874