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 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 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 197 void SwDocShell::DoFlushDocInfo() 198 { 199 if ( !pDoc ) return; 200 201 bool bUnlockView(true); 202 if ( pWrtShell ) { 203 bUnlockView = !pWrtShell->IsViewLocked(); 204 pWrtShell->LockView( sal_True ); // lock visible section 205 pWrtShell->StartAllAction(); 206 } 207 208 pDoc->DocInfoChgd(); 209 210 if ( pWrtShell ) { 211 pWrtShell->EndAllAction(); 212 if ( bUnlockView ) { 213 pWrtShell->LockView( sal_False ); 214 } 215 } 216 } 217 218 #ifdef FUTURE_VBA 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 243 void SwDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint ) 244 { 245 if( !pDoc ) 246 { 247 return ; 248 } 249 250 #ifdef FUTURE_VBA 251 uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->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( pWrtShell ) 278 { 279 bUnlockView = !pWrtShell->IsViewLocked(); 280 pWrtShell->LockView( sal_True ); //lock visible section 281 pWrtShell->StartAllAction(); 282 } 283 switch( nAction ) 284 { 285 case 2: 286 pDoc->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 = pDoc->IsModified(); 298 299 pDoc->DocInfoChgd( ); 300 301 if ( !bIsDocModified ) 302 pDoc->ResetModified(); 303 if ( bResetModified ) 304 EnableSetModified( sal_True ); 305 } 306 break; 307 } 308 309 if( pWrtShell ) 310 { 311 pWrtShell->EndAllAction(); 312 if( bUnlockView ) 313 pWrtShell->LockView( sal_False ); 314 } 315 } 316 } 317 318 /*-------------------------------------------------------------------- 319 Beschreibung: Benachrichtigung Doc schliessen 320 --------------------------------------------------------------------*/ 321 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( pDoc && IsInPrepareClose() ) 331 { 332 uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->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 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 *>(pDoc)->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( *pDoc, 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 pDoc->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(pDoc, "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 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 *>(pDoc)->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(pDoc, "Doc fehlt"); 633 GetDoc()->SetModified(); 634 635 return bRet; 636 } 637 638 /*-------------------------------------------------------------------- 639 Beschreibung: 640 --------------------------------------------------------------------*/ 641 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 pDoc->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(pWrtShell) 1179 pWrtShell->StartAllAction(); 1180 pDoc->UpdateFlds( NULL, false ); 1181 pDoc->EmbedAllLinks(); 1182 pDoc->RemoveInvisibleContent(); 1183 if(pWrtShell) 1184 pWrtShell->EndAllAction(); 1185 } 1186 break; 1187 1188 case SID_MAIL_EXPORT_FINISHED: 1189 { 1190 if(pWrtShell) 1191 pWrtShell->StartAllAction(); 1192 //try to undo the removal of invisible content 1193 pDoc->RestoreInvisibleContent(); 1194 if(pWrtShell) 1195 pWrtShell->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 = pDoc->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 = pDoc->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 *pDoc->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 ? pDoc->GenerateHTMLDoc( aFileName, nTemplateOutlineLevel ) 1447 : pDoc->GenerateGlobalDoc( aFileName, nTemplateOutlineLevel ); 1448 } 1449 else 1450 { 1451 const SwTxtFmtColl* pSplitColl = 0; 1452 if ( aTemplateName.Len() ) 1453 pSplitColl = pDoc->FindTxtFmtCollByName(aTemplateName); 1454 bDone = bCreateHtml //#outline level,removed by zhaojianwei 1455 ? pDoc->GenerateHTMLDoc( aFileName, pSplitColl ) 1456 : pDoc->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 pDoc->GetNumberFormatter(sal_True)->SetYear2000(nYear2K); 1519 } 1520 break; 1521 1522 default: DBG_ERROR("falscher Dispatcher"); 1523 } 1524 } 1525 1526 1527 /*-------------------------------------------------------------------- 1528 Beschreibung: 1529 --------------------------------------------------------------------*/ 1530 1531 long SwDocShell::DdeGetData( const String& rItem, const String& rMimeType, 1532 uno::Any & rValue ) 1533 { 1534 return pDoc->GetData( rItem, rMimeType, rValue ); 1535 } 1536 1537 1538 /*-------------------------------------------------------------------- 1539 Beschreibung: 1540 --------------------------------------------------------------------*/ 1541 1542 long SwDocShell::DdeSetData( const String& rItem, const String& rMimeType, 1543 const uno::Any & rValue ) 1544 { 1545 return pDoc->SetData( rItem, rMimeType, rValue ); 1546 } 1547 1548 1549 /*-------------------------------------------------------------------- 1550 Beschreibung: 1551 --------------------------------------------------------------------*/ 1552 1553 ::sfx2::SvLinkSource* SwDocShell::DdeCreateLinkSource( const String& rItem ) 1554 { 1555 return pDoc->CreateLinkSource( rItem ); 1556 } 1557 1558 /*-------------------------------------------------------------------- 1559 Beschreibung: 1560 --------------------------------------------------------------------*/ 1561 1562 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 1591 void SwDocShell::SetModified( sal_Bool bSet ) 1592 { 1593 SfxObjectShell::SetModified( bSet ); 1594 if( IsEnableSetModified()) 1595 { 1596 if (!pDoc->IsInCallModified() ) 1597 { 1598 EnableSetModified( sal_False ); 1599 if( bSet ) 1600 { 1601 sal_Bool bOld = pDoc->IsModified(); 1602 pDoc->SetModified(); 1603 if( !bOld ) 1604 { 1605 pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified(); 1606 } 1607 } 1608 else 1609 pDoc->ResetModified(); 1610 1611 EnableSetModified( sal_True ); 1612 } 1613 1614 UpdateChildWindows(); 1615 Broadcast(SfxSimpleHint(SFX_HINT_DOCCHANGED)); 1616 } 1617 } 1618 1619 /*-------------------------------------------------------------------- 1620 Beschreibung: 1621 --------------------------------------------------------------------*/ 1622 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: 1648 SwReloadFromHtmlReader( SfxMedium& _rTmpMedium, 1649 const String& _rFilename, 1650 SwDoc* _pDoc ) 1651 : SwReader( _rTmpMedium, _rFilename, _pDoc ) 1652 { 1653 SetBaseURL( _rFilename ); 1654 } 1655 }; 1656 // <-- 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 = pDoc->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 pDoc->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, pDoc ); 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 pDoc->ResetModified(); 1758 } 1759 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( pDoc->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, *pWrtShell->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( pDoc ); 1841 nErr = pReader->Read( *pRead ); 1842 } 1843 else 1844 { 1845 pWrtShell->StartAllAction(); 1846 nErr = pReader->Read( *pRead ); 1847 pWrtShell->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 --------------------------------------------------------------------*/ 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