/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include // fuer die aktuelle Sicht #include // Dokumenterzeugung #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "com/sun/star/ui/dialogs/TemplateDescription.hpp" #ifdef FUTURE_VBA #include #include #endif #include #include #include #include "swabstdlg.hxx" #include "dialog.hrc" #include "swabstdlg.hxx" #include //#outline level,add by zhaojianwei using namespace ::com::sun::star::ui::dialogs; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; using namespace ::com::sun::star; using ::rtl::OUString; using namespace ::sfx2; extern sal_Bool FindPhyStyle( SwDoc& , const String& , SfxStyleFamily ); /*-------------------------------------------------------------------- Beschreibung: DocInfo kreieren (virtuell) --------------------------------------------------------------------*/ SfxDocumentInfoDialog* SwDocShell::CreateDocumentInfoDialog( Window *pParent, const SfxItemSet &rSet) { SfxDocumentInfoDialog* pDlg = new SfxDocumentInfoDialog(pParent, rSet); //nur mit Statistik, wenn dieses Doc auch angezeigt wird, nicht //aus dem Doc-Manager SwDocShell* pDocSh = (SwDocShell*) SfxObjectShell::Current(); if( pDocSh == this ) { //Nicht fuer SourceView. SfxViewShell *pVSh = SfxViewShell::Current(); if ( pVSh && !pVSh->ISA(SwSrcView) ) { SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); pDlg->AddTabPage(TP_DOC_STAT, SW_RESSTR(STR_DOC_STAT),pFact->GetTabPageCreatorFunc( TP_DOC_STAT ),0); } } return pDlg; } // Disable "multiple layout" void SwDocShell::ToggleBrowserMode(sal_Bool bSet, SwView* _pView ) { GetDoc()->set(IDocumentSettingAccess::BROWSE_MODE, bSet ); UpdateFontList(); SwView* pTempView = _pView ? _pView : (SwView*)GetView(); if( pTempView ) { pTempView->GetViewFrame()->GetBindings().Invalidate(FN_SHADOWCURSOR); if( !GetDoc()->getPrinter( false ) ) pTempView->SetPrinter( GetDoc()->getPrinter( false ), SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP ); GetDoc()->CheckDefaultPageFmt(); SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this, sal_False); do { if( pTmpFrm != pTempView->GetViewFrame() ) { pTmpFrm->DoClose(); pTmpFrm = SfxViewFrame::GetFirst(this, sal_False); } else pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this, sal_False); } while ( pTmpFrm ); const SwViewOption& rViewOptions = *pTempView->GetWrtShell().GetViewOptions(); pTempView->GetWrtShell().CheckBrowseView( sal_True ); pTempView->CheckVisArea(); if( bSet ) { const SvxZoomType eType = (SvxZoomType)rViewOptions.GetZoomType(); if ( SVX_ZOOM_PERCENT != eType) ((SwView*)GetView())->SetZoom( eType ); } pTempView->InvalidateBorder(); pTempView->SetNewWindowAllowed(!bSet); } } // End of disabled "multiple layout" /// update text fields on document properties changes void SwDocShell::DoFlushDocInfo() { if ( !pDoc ) return; bool bUnlockView(true); if ( pWrtShell ) { bUnlockView = !pWrtShell->IsViewLocked(); pWrtShell->LockView( sal_True ); // lock visible section pWrtShell->StartAllAction(); } pDoc->DocInfoChgd(); if ( pWrtShell ) { pWrtShell->EndAllAction(); if ( bUnlockView ) { pWrtShell->LockView( sal_False ); } } } #ifdef FUTURE_VBA void lcl_processCompatibleSfxHint( const uno::Reference< script::vba::XVBAEventProcessor >& xVbaEvents, const SfxHint& rHint ) { using namespace com::sun::star::script::vba::VBAEventId; if ( rHint.ISA( SfxEventHint ) ) { uno::Sequence< uno::Any > aArgs; sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId(); switch( nEventId ) { case SFX_EVENT_CREATEDOC: xVbaEvents->processVbaEvent( DOCUMENT_NEW, aArgs ); break; case SFX_EVENT_OPENDOC: xVbaEvents->processVbaEvent( DOCUMENT_OPEN, aArgs ); break; } } } #endif /*-------------------------------------------------------------------- Beschreibung: Benachrichtigung bei geaenderter DocInfo --------------------------------------------------------------------*/ void SwDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint ) { if( !pDoc ) { return ; } #ifdef FUTURE_VBA uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->GetVbaEventProcessor(); if( xVbaEvents.is() ) lcl_processCompatibleSfxHint( xVbaEvents, rHint ); #endif sal_uInt16 nAction = 0; if( rHint.ISA(SfxSimpleHint) ) { // swithc for more actions switch( ((SfxSimpleHint&) rHint).GetId() ) { case SFX_HINT_TITLECHANGED: if( GetMedium() ) nAction = 2; break; } } else if( rHint.ISA(SfxEventHint) && ((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_LOADFINISHED ) { nAction = 3; } if( nAction ) { sal_Bool bUnlockView = sal_True; //initializing prevents warning if( pWrtShell ) { bUnlockView = !pWrtShell->IsViewLocked(); pWrtShell->LockView( sal_True ); //lock visible section pWrtShell->StartAllAction(); } switch( nAction ) { case 2: pDoc->GetSysFldType( RES_FILENAMEFLD )->UpdateFlds(); break; // own action for event LOADFINISHED in order to avoid a modified document. // Also for the instance of it has to be assured, that it's not modified. // Perform the same as for action id 1, but disable . case 3: { const bool bResetModified = IsEnableSetModified(); if ( bResetModified ) EnableSetModified( sal_False ); const bool bIsDocModified = pDoc->IsModified(); pDoc->DocInfoChgd( ); if ( !bIsDocModified ) pDoc->ResetModified(); if ( bResetModified ) EnableSetModified( sal_True ); } break; } if( pWrtShell ) { pWrtShell->EndAllAction(); if( bUnlockView ) pWrtShell->LockView( sal_False ); } } } /*-------------------------------------------------------------------- Beschreibung: Benachrichtigung Doc schliessen --------------------------------------------------------------------*/ sal_uInt16 SwDocShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing ) { sal_uInt16 nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing ); if( sal_True == nRet ) //Unbedingt auf sal_True abfragen! (RET_NEWTASK) EndListening( *this ); #ifdef FUTURE_VBA if( pDoc && IsInPrepareClose() ) { uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->GetVbaEventProcessor(); if( xVbaEvents.is() ) { using namespace com::sun::star::script::vba::VBAEventId; uno::Sequence< uno::Any > aArgs; xVbaEvents->processVbaEvent( DOCUMENT_CLOSE, aArgs ); } } #endif return nRet; } /*-------------------------------------------------------------------- Beschreibung: Organizer --------------------------------------------------------------------*/ sal_Bool SwDocShell::Insert( SfxObjectShell &rSource, sal_uInt16 nSourceIdx1, // SourcePool: oberste Inhaltsebene (Vorlagen/Makros) sal_uInt16 nSourceIdx2, // Index in den Inhalt sal_uInt16 nSourceIdx3, // Index in die Inhaltsebene sal_uInt16 &rIdx1, // und das gleiche fuer den DestinationPool sal_uInt16 &rIdx2, // "" sal_uInt16 &rIdx3, // "" sal_uInt16 &rRemovedIdx ) // falls doppelte geloescht werden, Pos zurueck { // --> OD 2005-05-10 #i48949# - actions aren't undoable. Thus, allow no undo // actions // Note: The undo action stack is cleared at the end of this method. ::sw::UndoGuard const undoGuard(GetDoc()->GetIDocumentUndoRedo()); // <-- sal_Bool bRet = sal_False; if (INDEX_IGNORE == rIdx1 && CONTENT_STYLE == nSourceIdx1) rIdx1 = CONTENT_STYLE; if (CONTENT_STYLE == nSourceIdx1 && CONTENT_STYLE == rIdx1) { SfxStyleSheetBasePool* pHisPool = rSource.GetStyleSheetPool(); SwDocStyleSheetPool* pMyPool = (SwDocStyleSheetPool*)GetStyleSheetPool(); // wir koennen nicht in uns selbst hin und her moven if( pHisPool == pMyPool ) return sal_False; if( INDEX_IGNORE == rIdx2 ) rIdx2 = pMyPool->Count(); // erstmal auf die Such-Maske "positionieren" pHisPool->First(); SfxStyleSheetBase* pHisSheet = (*pHisPool)[nSourceIdx2]; // wenn so eine Vorlage schon existiert: loeschen! const String& rOldName = pHisSheet->GetName(); SfxStyleFamily eOldFamily( pHisSheet->GetFamily() ); // dflt. PageDesc und StandardZeichenvorlage nie loeschen !!! if( ( SFX_STYLE_FAMILY_PAGE == eOldFamily && const_cast(pDoc)->GetPageDesc(0).GetName() == rOldName ) || ( SFX_STYLE_FAMILY_CHAR == eOldFamily && rOldName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ] )) return sal_False; SfxStyleFamily eMyOldFamily( pMyPool->GetSearchFamily() ); sal_uInt16 nMySrchMask = pMyPool->GetSearchMask(); SfxStyleSheetBase* pExist; if( ::FindPhyStyle( *pDoc, rOldName, eOldFamily ) ) { // Bug 20365: nur uebernehmen, wenn das gewuenscht ist! if( ERRCODE_BUTTON_OK != ErrorHandler::HandleError( *new MessageInfo( ERRCODE_SFXMSG_STYLEREPLACE, rOldName )) ) { return sal_False; } // Da Replace den aStyleSheet-Member selbst benoetigt, muss // das Ergebnis vom Find kopiert werden (s.u.)) rtl::Reference< SwDocStyleSheet > xExist( new SwDocStyleSheet( *(SwDocStyleSheet*)pMyPool->Find( rOldName, eOldFamily ) ) ); pMyPool->Replace( *pHisSheet, *xExist.get() ); // An der Reihenfolge der Vorlagen im Pool aendert sich nichts. rIdx2 = rIdx1 = INDEX_IGNORE; GetDoc()->SetModified(); return sal_True; } pMyPool->SetSearchMask( eOldFamily, nMySrchMask ); // MIB 18.12.98: SwDocStyleSheetPool::Make liefert einen // Pointer auf SwDocStyleSheetPool::aStyleSheet zurueck. // Der gleiche Member von SwDocStyleSheetPool::Find benutzt. // Deshalb muss hier mit einer Kopie gearbeitet werden. // Vorsicht: SfxStyleSheetBase::SetFollow ruft seinerseits // ein SwDocStyleSheetPool::Find auf, do dass es nicht genuegt // die Find-Aufrufe in dieser Methode zu eleminieren. rtl::Reference< SwDocStyleSheet > xNewSheet( new SwDocStyleSheet( (SwDocStyleSheet&)pMyPool ->Make(rOldName, eOldFamily, pHisSheet->GetMask() ) ) ); if( SFX_STYLE_FAMILY_PAGE == eOldFamily && rSource.ISA(SwDocShell) ) { // gesondert behandeln!! SwPageDesc* pDestDsc = (SwPageDesc*)xNewSheet->GetPageDesc(); SwPageDesc* pCpyDsc = (SwPageDesc*)((SwDocStyleSheet*)pHisSheet)->GetPageDesc(); pDoc->CopyPageDesc( *pCpyDsc, *pDestDsc ); } else // die neue Vorlage mit den Attributen fuellen xNewSheet->SetItemSet( pHisSheet->GetItemSet() ); pMyPool->SetSearchMask( SFX_STYLE_FAMILY_ALL, nMySrchMask ); if( xNewSheet->IsUserDefined() || xNewSheet->IsUsed() ) { // Benutzte und Benutzer-definierte Vorlagen werden angezeigt. // Dshalb muss hier der Index der neuen Vorlage im Pool // ermittelt werden. pExist = pMyPool->First(); sal_uInt16 nIdx = 0; while( pExist ) { if( pExist->GetName() == rOldName && eOldFamily == pExist->GetFamily() ) { rIdx2 = nIdx; break; } pExist = pMyPool->Next(); nIdx++; } } else { // Andere Vorlagen werden nicht angezeigt. rIdx1 = rIdx2 = INDEX_IGNORE; } /* pMyPool->Count(); //interne Liste neu fuellen lassen!!!!! // suchen, um die richige Insert-Position returnen zu koennen pMyPool->Find( rOldName, SFX_STYLE_FAMILY_ALL, nMySrchMask ); rIdx2 = pMyPool->GetFindPos();*/ // wer bekommt den Neuen als Parent? wer benutzt den Neuen als Follow? // (immer nur ueber die Instanziierten!!!) pMyPool->SetSearchMask( eOldFamily, nMySrchMask ); pMyPool->SetOrganizerMode( sal_True ); SfxStyleSheetBase* pTestSheet = pMyPool->First(); while (pTestSheet) { if (pTestSheet->GetFamily() == eOldFamily && pTestSheet->HasParentSupport() && pTestSheet->GetParent() == rOldName) { pTestSheet->SetParent(rOldName); // Verknuepfung neu aufbauen } if (pTestSheet->GetFamily() == eOldFamily && pTestSheet->HasFollowSupport() && pTestSheet->GetFollow() == rOldName) { pTestSheet->SetFollow(rOldName); // Verknuepfung neu aufbauen } pTestSheet = pMyPool->Next(); } pMyPool->SetOrganizerMode( SFX_CREATE_MODE_ORGANIZER == GetCreateMode() ); // hat der Neue einen Parent? wenn ja, mit gleichem Namen bei uns suchen if (pHisSheet->HasParentSupport()) { const String& rParentName = pHisSheet->GetParent(); if (0 != rParentName.Len()) { SfxStyleSheetBase* pParentOfNew = pMyPool->Find(rParentName, eOldFamily); if (pParentOfNew) { xNewSheet->SetParent(rParentName); } pMyPool->SetSearchMask( eOldFamily, nMySrchMask ); } } // hat der Neue einen Follow? wenn ja, mit gleichem Namen bei uns suchen if (pHisSheet->HasFollowSupport()) { const String& rFollowName = pHisSheet->GetFollow(); if (0 != rFollowName.Len()) { SfxStyleSheetBase* pFollowOfNew = pMyPool->Find(rFollowName, eOldFamily); if (pFollowOfNew) { xNewSheet->SetFollow(rFollowName); } pMyPool->SetSearchMask( eOldFamily, nMySrchMask ); } } // Bug 27347: alte Einstellung wieder setzen pMyPool->SetSearchMask( eMyOldFamily, nMySrchMask ); // Model geaendert ASSERT(pDoc, "Doc fehlt"); GetDoc()->SetModified(); bRet = sal_True; } else bRet = SfxObjectShell::Insert( rSource, nSourceIdx1, nSourceIdx2, nSourceIdx3, rIdx1, rIdx2, rIdx3, rRemovedIdx); // --> OD 2005-05-10 #i48949# - actions aren't undoable and could have change // the document node array. Thus, clear the undo action stack. if (undoGuard.UndoWasEnabled()) { GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj(); } // <-- return bRet; } /*-------------------------------------------------------------------- Beschreibung: Vorlagen Remove --------------------------------------------------------------------*/ sal_Bool SwDocShell::Remove(sal_uInt16 nIdx1, // siehe Insert sal_uInt16 nIdx2, sal_uInt16 nIdx3) { sal_Bool bRet = sal_False; if (CONTENT_STYLE == nIdx1) { SwDocStyleSheetPool* pMyPool = (SwDocStyleSheetPool*)GetStyleSheetPool(); pMyPool->First(); // vorm Zugriff Pool aktualisieren!! SfxStyleSheetBase* pMySheet = (*pMyPool)[nIdx2]; String aName( pMySheet->GetName() ); SfxStyleFamily eFamily( pMySheet->GetFamily() ); // dflt. PageDesc und StandardZeichenvorlage nie loeschen !!! if( ( SFX_STYLE_FAMILY_PAGE == eFamily && const_cast(pDoc)->GetPageDesc(0).GetName() == aName ) || ( SFX_STYLE_FAMILY_CHAR == eFamily && aName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ] )) return sal_False; // also loeschen pMyPool->Remove( pMySheet ); // jetzt noch die Parents/Follows aller Instanziierten korrigieren pMyPool->SetOrganizerMode( sal_True ); SfxStyleSheetBase* pTestSheet = pMyPool->First(); while (pTestSheet) { if (pTestSheet->GetFamily() == eFamily && pTestSheet->HasParentSupport() && pTestSheet->GetParent() == aName) { pTestSheet->SetParent( aEmptyStr ); // Verknuepfung aufloesen } if (pTestSheet->GetFamily() == eFamily && pTestSheet->HasFollowSupport() && pTestSheet->GetFollow() == aName) { pTestSheet->SetFollow( aEmptyStr ); // Verknuepfung aufloesen } pTestSheet = pMyPool->Next(); } pMyPool->SetOrganizerMode( SFX_CREATE_MODE_ORGANIZER == GetCreateMode() ); bRet = sal_True; } else bRet = SfxObjectShell::Remove( nIdx1, nIdx2, nIdx3 ); // Model geaendert ASSERT(pDoc, "Doc fehlt"); GetDoc()->SetModified(); return bRet; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDocShell::Execute(SfxRequest& rReq) { const SfxItemSet* pArgs = rReq.GetArgs(); const SfxPoolItem* pItem; sal_uInt16 nWhich = rReq.GetSlot(); sal_Bool bDone = sal_False; switch ( nWhich ) { case SID_AUTO_CORRECT_DLG: { SvxSwAutoFmtFlags* pAFlags = &SvxAutoCorrCfg::Get()->GetAutoCorrect()->GetSwFlags(); SwAutoCompleteWord& rACW = SwDoc::GetAutoCompleteWords(); sal_Bool bOldLocked = rACW.IsLockWordLstLocked(), bOldAutoCmpltCollectWords = pAFlags->bAutoCmpltCollectWords; rACW.SetLockWordLstLocked( sal_True ); SvStringsISortDtor aTmpLst; aTmpLst.Insert( &rACW.GetWordList() ); pAFlags->pAutoCmpltList = &aTmpLst; SfxApplication* pApp = SFX_APP(); SfxRequest aAppReq(SID_AUTO_CORRECT_DLG, SFX_CALLMODE_SYNCHRON, pApp->GetPool()); SfxBoolItem aSwOptions( SID_AUTO_CORRECT_DLG, sal_True ); aAppReq.AppendItem(aSwOptions); // SMARTTAGS pAFlags->pSmartTagMgr = &SwSmartTagMgr::Get(); //pApp->ExecuteSlot(aAppReq); SfxItemSet aSet( pApp->GetPool(), SID_AUTO_CORRECT_DLG, SID_AUTO_CORRECT_DLG, SID_OPEN_SMARTTAGOPTIONS, SID_OPEN_SMARTTAGOPTIONS, 0 ); aSet.Put( aSwOptions ); const SfxPoolItem* pOpenSmartTagOptionsItem = 0; if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_OPEN_SMARTTAGOPTIONS, sal_False, &pOpenSmartTagOptionsItem ) ) aSet.Put( *static_cast(pOpenSmartTagOptionsItem) ); SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); SfxAbstractTabDialog* pDlg = pFact->CreateTabDialog( RID_OFA_AUTOCORR_DLG, NULL, &aSet, NULL ); pDlg->Execute(); delete pDlg; rACW.SetLockWordLstLocked( bOldLocked ); SwEditShell::SetAutoFmtFlags( pAFlags ); rACW.SetMinWordLen( pAFlags->nAutoCmpltWordLen ); rACW.SetMaxCount( pAFlags->nAutoCmpltListLen ); if( pAFlags->pAutoCmpltList ) // any changes? { rACW.CheckChangedList( aTmpLst ); // clear the temp WordList pointer pAFlags->pAutoCmpltList = 0; } // remove all pointer we never delete the strings aTmpLst.Remove( (sal_uInt16)0, aTmpLst.Count() ); if( !bOldAutoCmpltCollectWords && bOldAutoCmpltCollectWords != pAFlags->bAutoCmpltCollectWords ) { // call on all Docs the idle formatter to start // the collection of Words TypeId aType = TYPE(SwDocShell); for( SwDocShell *pDocSh = (SwDocShell*)SfxObjectShell::GetFirst(&aType); pDocSh; pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) ) { SwDoc* pTmp = pDocSh->GetDoc(); if ( pTmp->GetCurrentViewShell() ) //swmod 071108//swmod 071225 pTmp->InvalidateAutoCompleteFlag(); } } } break; case SID_PRINTPREVIEW: { sal_Bool bSet = sal_False, bFound = sal_False, bOnly = sal_True; SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this); SfxViewShell* pViewShell = SfxViewShell::Current(); SwView* pCurrView = dynamic_cast< SwView *> ( pViewShell ); sal_Bool bCurrent = IS_TYPE( SwPagePreView, pViewShell ); while( pTmpFrm ) // search PreView { if( IS_TYPE( SwView, pTmpFrm->GetViewShell()) ) bOnly = sal_False; else if( IS_TYPE( SwPagePreView, pTmpFrm->GetViewShell())) { pTmpFrm->GetFrame().Appear(); bFound = sal_True; } if( bFound && !bOnly ) break; pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this); } if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_PRINTPREVIEW, sal_False, &pItem )) bSet = ((SfxBoolItem*)pItem)->GetValue(); else bSet = !bCurrent; sal_uInt16 nSlotId = 0; if( bSet && !bFound ) // Keine gefunden, daher neue Preview anlegen nSlotId = SID_VIEWSHELL1; else if( bFound && !bSet ) nSlotId = bOnly ? SID_VIEWSHELL0 : SID_VIEWSHELL1; if( nSlotId ) { //JP 23.8.2001: Bug 91360 - PagePreView in the WebDocShell // is found under Id ViewShell2. if( ISA(SwWebDocShell) && SID_VIEWSHELL1 == nSlotId ) nSlotId = SID_VIEWSHELL2; if( pCurrView && pCurrView->GetDocShell() == this ) pTmpFrm = pCurrView->GetViewFrame(); else pTmpFrm = SfxViewFrame::GetFirst( this ); pTmpFrm->GetDispatcher()->Execute( nSlotId, 0, 0, SFX_CALLMODE_ASYNCHRON ); } rReq.SetReturnValue(SfxBoolItem(SID_PRINTPREVIEW, bSet )); } break; case SID_TEMPLATE_LOAD: { String aFileName; static sal_Bool bText = sal_True; static sal_Bool bFrame = sal_False; static sal_Bool bPage = sal_False; static sal_Bool bNum = sal_False; static sal_Bool bMerge = sal_False; sal_uInt16 nRet = USHRT_MAX; sal_uInt16 nFlags = bFrame ? SFX_LOAD_FRAME_STYLES : 0; if(bPage) nFlags|= SFX_LOAD_PAGE_STYLES; if(bNum) nFlags|= SFX_LOAD_NUM_STYLES; if(!nFlags || bText) nFlags|= SFX_LOAD_TEXT_STYLES; if(bMerge) nFlags|= SFX_MERGE_STYLES; if ( pArgs ) { SFX_REQUEST_ARG( rReq, pTemplateItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False ); if ( pTemplateItem ) { aFileName = pTemplateItem->GetValue(); SFX_REQUEST_ARG( rReq, pFlagsItem, SfxInt32Item, SID_TEMPLATE_LOAD, sal_False ); if ( pFlagsItem ) nFlags = (sal_uInt16) pFlagsItem->GetValue(); } } if ( !aFileName.Len() ) { SvtPathOptions aPathOpt; SfxNewFileDialog* pNewFileDlg = new SfxNewFileDialog(&GetView()->GetViewFrame()->GetWindow(), SFXWB_LOAD_TEMPLATE); pNewFileDlg->SetTemplateFlags(nFlags); nRet = pNewFileDlg->Execute(); if(RET_TEMPLATE_LOAD == nRet) { FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 ); uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); xFP->setDisplayDirectory( aPathOpt.GetWorkPath() ); SfxObjectFactory &rFact = GetFactory(); SfxFilterMatcher aMatcher( String::CreateFromAscii(rFact.GetShortName()) ); SfxFilterMatcherIter aIter( &aMatcher ); uno::Reference xFltMgr(xFP, UNO_QUERY); const SfxFilter* pFlt = aIter.First(); while( pFlt ) { // --> OD #i117339# // if( pFlt && pFlt->IsAllowedAsTemplate() ) if( pFlt && pFlt->IsAllowedAsTemplate() && ( pFlt->GetUserData().EqualsAscii("CXML") || pFlt->GetUserData().EqualsAscii("CXMLV") ) ) { const String sWild = ((WildCard&)pFlt->GetWildcard()).GetWildCard(); xFltMgr->appendFilter( pFlt->GetUIName(), sWild ); } pFlt = aIter.Next(); } sal_Bool bWeb = 0 != dynamic_cast< SwWebDocShell *>( this ); const SfxFilter *pOwnFlt = SwDocShell::Factory().GetFilterContainer()-> GetFilter4FilterName(String::CreateFromAscii("writer8")); //#b6439685# make sure the default file format is also available if(bWeb) { const String sWild = ((WildCard&)pOwnFlt->GetWildcard()).GetWildCard(); xFltMgr->appendFilter( pOwnFlt->GetUIName(), sWild ); } bool bError = false; //#b6439685# catch expception if wrong filter is selected - should not happen anymore try { xFltMgr->setCurrentFilter( pOwnFlt->GetUIName() ); } catch( const uno::Exception& ) { bError = true; } if( !bError && ERRCODE_NONE == aDlgHelper.Execute() ) { aFileName = xFP->getFiles().getConstArray()[0]; } } else if( RET_OK == nRet) { aFileName = pNewFileDlg->GetTemplateFileName(); } nFlags = pNewFileDlg->GetTemplateFlags(); rReq.AppendItem( SfxStringItem( SID_TEMPLATE_NAME, aFileName ) ); rReq.AppendItem( SfxInt32Item( SID_TEMPLATE_LOAD, (long) nFlags ) ); delete pNewFileDlg; } if( aFileName.Len() ) { SwgReaderOption aOpt; aOpt.SetTxtFmts( bText = (0 != (nFlags&SFX_LOAD_TEXT_STYLES) )); aOpt.SetFrmFmts( bFrame = (0 != (nFlags&SFX_LOAD_FRAME_STYLES))); aOpt.SetPageDescs( bPage = (0 != (nFlags&SFX_LOAD_PAGE_STYLES ))); aOpt.SetNumRules( bNum = (0 != (nFlags&SFX_LOAD_NUM_STYLES ))); //different meaning between SFX_MERGE_STYLES and aOpt.SetMerge! bMerge = 0 != (nFlags&SFX_MERGE_STYLES); aOpt.SetMerge( !bMerge ); SetError( LoadStylesFromFile( aFileName, aOpt, sal_False ), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) )); if ( !GetError() ) rReq.Done(); } } break; case SID_SOURCEVIEW: { SfxViewShell* pViewShell = GetView() ? (SfxViewShell*)GetView() : SfxViewShell::Current(); SfxViewFrame* pViewFrm = pViewShell->GetViewFrame(); SwSrcView* pSrcView = dynamic_cast< SwSrcView *>( pViewShell ); if(!pSrcView) { // 3 possible state: // 1 - file unsaved -> save as HTML // 2 - file modified and HTML filter active -> save // 3 - file saved in non-HTML -> QueryBox to save as HTML const SfxFilter* pHtmlFlt = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii("HTML"), SwWebDocShell::Factory().GetFilterContainer() ); sal_Bool bLocalHasName = HasName(); if(bLocalHasName) { //check for filter type const SfxFilter* pFlt = GetMedium()->GetFilter(); if(!pFlt || pFlt->GetUserData() != pHtmlFlt->GetUserData()) { QueryBox aQuery(&pViewFrm->GetWindow(), SW_RES(MSG_SAVEAS_HTML_QUERY)); if(RET_YES == aQuery.Execute()) bLocalHasName = sal_False; else break; } } if(!bLocalHasName) { FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION, 0 ); aDlgHelper.AddFilter( pHtmlFlt->GetFilterName(), pHtmlFlt->GetDefaultExtension() ); aDlgHelper.SetCurrentFilter( pHtmlFlt->GetFilterName() ); if( ERRCODE_NONE != aDlgHelper.Execute()) { break; } String sPath = aDlgHelper.GetPath(); SfxStringItem aName(SID_FILE_NAME, sPath); SfxStringItem aFilter(SID_FILTER_NAME, pHtmlFlt->GetName()); const SfxBoolItem* pBool = (const SfxBoolItem*) pViewFrm->GetDispatcher()->Execute( SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON, &aName, &aFilter, 0L ); if(!pBool || !pBool->GetValue()) break; } } #ifdef DBG_UTIL { sal_Bool bWeb = 0 != dynamic_cast(this); DBG_ASSERT(bWeb == sal_True, "SourceView nur in der WebDocShell"); } #endif // die SourceView ist fuer die SwWebDocShell die 1 sal_uInt16 nSlot = SID_VIEWSHELL1; sal_Bool bSetModified = sal_False; SfxPrinter* pSavePrinter = 0; if( 0 != pSrcView) { SfxPrinter* pTemp = GetDoc()->getPrinter( false ); if(pTemp) pSavePrinter = new SfxPrinter(*pTemp); bSetModified = IsModified() || pSrcView->IsModified(); if(pSrcView->IsModified()||pSrcView->HasSourceSaved()) { utl::TempFile aTempFile; aTempFile.EnableKillingFile(); pSrcView->SaveContent(aTempFile.GetURL()); bDone = sal_True; SvxMacro aMac(aEmptyStr, aEmptyStr, STARBASIC); SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_OPENDOC ), aMac, this); SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_PREPARECLOSEDOC ), aMac, this); SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_ACTIVATEDOC ), aMac, this); SfxEventConfiguration::ConfigureEvent(GlobalEventConfig::GetEventName( STR_EVENT_DEACTIVATEDOC ), aMac, this); ReloadFromHtml(aTempFile.GetURL(), pSrcView); nSlot = 0; } else { nSlot = SID_VIEWSHELL0; } } /* OS 10.04.97 14.20: Im Web-Writer gibt es keinen Unterschied zwischen Export in den SourceMode und dem Speichern des Docs else if(IsModified()) { sal_uInt16 nRet = QueryBox( SFX_APPWINDOW ,SW_RES(MSG_SAVE_HTML_QUERY)).Execute(); if(RET_YES == nRet) { S F X _DISPATCHER().Execute(SID_SAVEDOC, SFX_CALLMODE_SYNCHRON); // der ReturnValue von SID_SAVEDOC ist etwas schwer verstaendlich if(IsModified()) nSlot = 0; } else if( RET_CANCEL == nRet ) { nSlot = 0; } }*/ if(nSlot) pViewFrm->GetDispatcher()->Execute(nSlot, SFX_CALLMODE_SYNCHRON); if(bSetModified) GetDoc()->SetModified(); if(pSavePrinter) { GetDoc()->setPrinter( pSavePrinter, true, true); //pSavePrinter darf nicht wieder geloescht werden } pViewFrm->GetBindings().SetState(SfxBoolItem(SID_SOURCEVIEW, nSlot == SID_VIEWSHELL2)); pViewFrm->GetBindings().Invalidate( SID_NEWWINDOW ); pViewFrm->GetBindings().Invalidate( SID_BROWSER_MODE ); pViewFrm->GetBindings().Invalidate( FN_PRINT_LAYOUT ); } break; case SID_GET_COLORTABLE: { const SvxColorTableItem* pColItem = static_cast< const SvxColorTableItem* >(GetItem(SID_COLOR_TABLE)); XColorListSharedPtr aTable = pColItem->GetColorTable(); rReq.SetReturnValue(SvxColorTableItem(aTable, SID_GET_COLORTABLE)); } break; case FN_ABSTRACT_STARIMPRESS: case FN_ABSTRACT_NEWDOC: { SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); AbstractSwInsertAbstractDlg* pDlg = pFact->CreateSwInsertAbstractDlg(0, DLG_INSERT_ABSTRACT ); DBG_ASSERT(pDlg, "Dialogdiet fail!"); if(RET_OK == pDlg->Execute()) { sal_uInt8 nLevel = pDlg->GetLevel(); sal_uInt8 nPara = pDlg->GetPara(); SwDoc* pSmryDoc = new SwDoc(); SfxObjectShellLock xDocSh( new SwDocShell( pSmryDoc, SFX_CREATE_MODE_STANDARD)); xDocSh->DoInitNew( 0 ); sal_Bool bImpress = FN_ABSTRACT_STARIMPRESS == nWhich; pDoc->Summary( pSmryDoc, nLevel, nPara, bImpress ); if( bImpress ) { WriterRef xWrt; // mba: looks as if relative URLs don't make sense here ::GetRTFWriter( aEmptyStr, String(), xWrt ); SvMemoryStream *pStrm = new SvMemoryStream(); pStrm->SetBufferSize( 16348 ); SwWriter aWrt( *pStrm, *pSmryDoc ); ErrCode eErr = aWrt.Write( xWrt ); if( !ERRCODE_TOERROR( eErr ) ) { uno::Reference< lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory(); uno::Reference< frame::XDispatchProvider > xProv( xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.drawing.ModuleDispatcher")), UNO_QUERY ); if ( xProv.is() ) { ::rtl::OUString aCmd = ::rtl::OUString::createFromAscii( "SendOutlineToImpress" ); uno::Reference< frame::XDispatchHelper > xHelper( xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.frame.DispatchHelper")), UNO_QUERY ); if ( xHelper.is() ) { pStrm->Seek( STREAM_SEEK_TO_END ); *pStrm << '\0'; pStrm->Seek( STREAM_SEEK_TO_BEGIN ); // Transfer ownership of stream to a lockbytes object SvLockBytes aLockBytes( pStrm, sal_True ); SvLockBytesStat aStat; if ( aLockBytes.Stat( &aStat, SVSTATFLAG_DEFAULT ) == ERRCODE_NONE ) { sal_uInt32 nLen = aStat.nSize; sal_uLong nRead = 0; uno::Sequence< sal_Int8 > aSeq( nLen ); aLockBytes.ReadAt( 0, aSeq.getArray(), nLen, &nRead ); uno::Sequence< beans::PropertyValue > aArgs(1); aArgs[0].Name = ::rtl::OUString::createFromAscii("RtfOutline"); aArgs[0].Value <<= aSeq; xHelper->executeDispatch( xProv, aCmd, ::rtl::OUString(), 0, aArgs ); } } } } else ErrorHandler::HandleError(ErrCode( eErr )); } else { // Neues Dokument erzeugen. SfxViewFrame *pFrame = SfxViewFrame::LoadDocument( *xDocSh, 0 ); SwView *pCurrView = (SwView*) pFrame->GetViewShell(); // Dokumenttitel setzen String aTmp( SW_RES(STR_ABSTRACT_TITLE) ); aTmp += GetTitle(); xDocSh->SetTitle( aTmp ); pCurrView->GetWrtShell().SetNewDoc(); pFrame->Show(); pSmryDoc->SetModified(); } } delete pDlg; } break; case FN_OUTLINE_TO_CLIPBOARD: case FN_OUTLINE_TO_IMPRESS: { sal_Bool bEnable = IsEnableSetModified(); EnableSetModified( sal_False ); WriterRef xWrt; // mba: looks as if relative URLs don't make sense here ::GetRTFWriter( 'O', String(), xWrt ); SvMemoryStream *pStrm = new SvMemoryStream(); pStrm->SetBufferSize( 16348 ); SwWriter aWrt( *pStrm, *GetDoc() ); ErrCode eErr = aWrt.Write( xWrt ); EnableSetModified( bEnable ); if( !ERRCODE_TOERROR( eErr ) ) { pStrm->Seek( STREAM_SEEK_TO_END ); *pStrm << '\0'; pStrm->Seek( STREAM_SEEK_TO_BEGIN ); if ( nWhich == FN_OUTLINE_TO_IMPRESS ) { uno::Reference< lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory(); uno::Reference< frame::XDispatchProvider > xProv( xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.drawing.ModuleDispatcher")), UNO_QUERY ); if ( xProv.is() ) { ::rtl::OUString aCmd = ::rtl::OUString::createFromAscii( "SendOutlineToImpress" ); uno::Reference< frame::XDispatchHelper > xHelper( xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.frame.DispatchHelper")), UNO_QUERY ); if ( xHelper.is() ) { pStrm->Seek( STREAM_SEEK_TO_END ); *pStrm << '\0'; pStrm->Seek( STREAM_SEEK_TO_BEGIN ); // Transfer ownership of stream to a lockbytes object SvLockBytes aLockBytes( pStrm, sal_True ); SvLockBytesStat aStat; if ( aLockBytes.Stat( &aStat, SVSTATFLAG_DEFAULT ) == ERRCODE_NONE ) { sal_uInt32 nLen = aStat.nSize; sal_uLong nRead = 0; uno::Sequence< sal_Int8 > aSeq( nLen ); aLockBytes.ReadAt( 0, aSeq.getArray(), nLen, &nRead ); uno::Sequence< beans::PropertyValue > aArgs(1); aArgs[0].Name = ::rtl::OUString::createFromAscii("RtfOutline"); aArgs[0].Value <<= aSeq; xHelper->executeDispatch( xProv, aCmd, ::rtl::OUString(), 0, aArgs ); } } } } else { TransferDataContainer* pClipCntnr = new TransferDataContainer; STAR_REFERENCE( datatransfer::XTransferable ) xRef( pClipCntnr ); pClipCntnr->CopyAnyData( FORMAT_RTF, (sal_Char*) pStrm->GetData(), pStrm->GetEndOfData() ); pClipCntnr->CopyToClipboard( GetView()? (Window*)&GetView()->GetEditWin() : 0 ); delete pStrm; } } else ErrorHandler::HandleError(ErrCode( eErr )); } break; case SID_SPELLCHECKER_CHANGED: //! sal_False, sal_True, sal_True is on the save side but a probably overdone SW_MOD()->CheckSpellChanges(sal_False, sal_True, sal_True, sal_False ); break; case SID_MAIL_PREPAREEXPORT: { //pWrtShell is not set in page preview if(pWrtShell) pWrtShell->StartAllAction(); pDoc->UpdateFlds( NULL, false ); pDoc->EmbedAllLinks(); pDoc->RemoveInvisibleContent(); if(pWrtShell) pWrtShell->EndAllAction(); } break; case SID_MAIL_EXPORT_FINISHED: { if(pWrtShell) pWrtShell->StartAllAction(); //try to undo the removal of invisible content pDoc->RestoreInvisibleContent(); if(pWrtShell) pWrtShell->EndAllAction(); } break; case FN_NEW_HTML_DOC: case FN_NEW_GLOBAL_DOC: { bDone = sal_False; sal_Bool bCreateHtml = FN_NEW_HTML_DOC == nWhich; sal_Bool bCreateByOutlineLevel = false; //#outline level,add by zhaojianwei sal_Int32 nTemplateOutlineLevel = 0 ; //#outline level,add by zhaojianwei String aFileName, aTemplateName; if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich, sal_False, &pItem ) ) { aFileName = ((const SfxStringItem*)pItem)->GetValue(); SFX_ITEMSET_ARG( pArgs, pTemplItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False ); if ( pTemplItem ) aTemplateName = pTemplItem->GetValue(); } bool bError = false; if ( !aFileName.Len() ) { FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE, 0 ); const sal_Int16 nControlIds[] = { CommonFilePickerElementIds::PUSHBUTTON_OK, CommonFilePickerElementIds::PUSHBUTTON_CANCEL, CommonFilePickerElementIds::LISTBOX_FILTER, CommonFilePickerElementIds::CONTROL_FILEVIEW, CommonFilePickerElementIds::EDIT_FILEURL, ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, 0 }; const char* aHTMLHelpIds[] = { HID_SEND_HTML_CTRL_PUSHBUTTON_OK, HID_SEND_HTML_CTRL_PUSHBUTTON_CANCEL, HID_SEND_HTML_CTRL_LISTBOX_FILTER, HID_SEND_HTML_CTRL_CONTROL_FILEVIEW, HID_SEND_HTML_CTRL_EDIT_FILEURL, HID_SEND_HTML_CTRL_CHECKBOX_AUTOEXTENSION, HID_SEND_HTML_CTRL_LISTBOX_TEMPLATE, "" }; const char* aMasterHelpIds[] = { HID_SEND_MASTER_CTRL_PUSHBUTTON_OK, HID_SEND_MASTER_CTRL_PUSHBUTTON_CANCEL, HID_SEND_MASTER_CTRL_LISTBOX_FILTER, HID_SEND_MASTER_CTRL_CONTROL_FILEVIEW, HID_SEND_MASTER_CTRL_EDIT_FILEURL, HID_SEND_MASTER_CTRL_CHECKBOX_AUTOEXTENSION, HID_SEND_MASTER_CTRL_LISTBOX_TEMPLATE, "" }; const char** pHelpIds = bCreateHtml ? aHTMLHelpIds : aMasterHelpIds; aDlgHelper.SetControlHelpIds( nControlIds, pHelpIds ); uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); const SfxFilter* pFlt; sal_uInt16 nStrId; if( bCreateHtml ) { // fuer HTML gibts es nur einen Filter!! pFlt = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii("HTML"), SwWebDocShell::Factory().GetFilterContainer() ); nStrId = STR_LOAD_HTML_DOC; } else { // Fuer Global-Dokumente bieten wir jetzt auch nur // noch den aktuellen an. pFlt = SwGlobalDocShell::Factory().GetFilterContainer()-> GetFilter4Extension( String::CreateFromAscii("odm") ); nStrId = STR_LOAD_GLOBAL_DOC; } if( pFlt ) { uno::Reference xFltMgr(xFP, UNO_QUERY); const String sWild = ((WildCard&)pFlt->GetWildcard()).GetWildCard(); xFltMgr->appendFilter( pFlt->GetUIName(), sWild ); try { xFltMgr->setCurrentFilter( pFlt->GetUIName() ) ; } catch( const uno::Exception& ) { bError = true; } } if(!bError) { uno::Reference xCtrlAcc(xFP, UNO_QUERY); //#removed by zhaojianwei // const sal_uInt16 nCount = pDoc->GetTxtFmtColls()->Count(); // Sequence aListBoxEntries(nCount); // OUString* pEntries = aListBoxEntries.getArray(); // sal_Int32 nIdx = 0; // sal_Int16 nSelect = 0; // OUString sStartTemplate; // SwTxtFmtColl *pFnd = 0, *pAny = 0; // for(sal_uInt16 i = 0; i < nCount; ++i) // { // SwTxtFmtColl &rTxtColl = // *pDoc->GetTxtFmtColls()->GetObject( i ); // if( !rTxtColl.IsDefault() && rTxtColl.IsAtDocNodeSet() ) // { // //if( MAXLEVEL >= rTxtColl.GetOutlineLevel() && ( !pFnd || //#outline level,zhaojianwei //if( rTxtColl.IsAssignedToListLevelOfOutlineStyle() && ( !pFnd || //<-end,zhaojianwei // pFnd->GetAssignedOutlineStyleLevel() > rTxtColl.GetAssignedOutlineStyleLevel() )) // { // nSelect = (sal_Int16)nIdx; // pFnd = &rTxtColl; // sStartTemplate = rTxtColl.GetName(); // } // else if( !pAny ) // pAny = &rTxtColl; // //pEntries[nIdx++] = rTxtColl.GetName(); //#outline level,remove by zhaojianwei // pEntries[nIdx++] = sStyles + rTxtColl.GetName(); //#outline level,add by zhaojianwei // } // } // if(!sStartTemplate.getLength() && pAny) // sStartTemplate = pAny->GetName(); // aListBoxEntries.realloc(nIdx); //<-end,zhaojianwei //#outline level,add by zhaojianwei ///////////////////////////////////////////////////////////////////// bool bOutline[MAXLEVEL] = {false}; const SwOutlineNodes& rOutlNds = pDoc->GetNodes().GetOutLineNds(); if( rOutlNds.Count() ) { int nLevel; for(sal_uInt16 n = 0; n < rOutlNds.Count(); ++n ) if( ( nLevel = rOutlNds[n]->GetTxtNode()->GetAttrOutlineLevel()) > 0 && ! bOutline[nLevel-1] ) { bOutline[nLevel-1] = true; } } const sal_uInt16 nStyleCount = pDoc->GetTxtFmtColls()->Count(); Sequence aListBoxEntries( MAXLEVEL + nStyleCount); OUString* pEntries = aListBoxEntries.getArray(); sal_Int32 nIdx = 0 ; OUString sOutline( SW_RESSTR(STR_FDLG_OUTLINE_LEVEL) ); for( sal_uInt16 i = 0; i < MAXLEVEL; ++i ) { if( bOutline[i] ) pEntries[nIdx++] = sOutline + String::CreateFromInt32( i+1 ); } OUString sStyle( SW_RESSTR(STR_FDLG_STYLE) ); for(sal_uInt16 i = 0; i < nStyleCount; ++i) { SwTxtFmtColl &rTxtColl = *pDoc->GetTxtFmtColls()->GetObject( i ); if( !rTxtColl.IsDefault() && rTxtColl.IsAtDocNodeSet() ) { pEntries[nIdx++] = sStyle + rTxtColl.GetName(); } } aListBoxEntries.realloc(nIdx); sal_Int16 nSelect = 0; ///////////////////////////////////////////////////////////////////// //<-end,zhaojianwei try { Any aTemplates(&aListBoxEntries, ::getCppuType(&aListBoxEntries)); xCtrlAcc->setValue( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, ListboxControlActions::ADD_ITEMS , aTemplates ); Any aSelectPos(&nSelect, ::getCppuType(&nSelect)); xCtrlAcc->setValue( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, ListboxControlActions::SET_SELECT_ITEM, aSelectPos ); xCtrlAcc->setLabel( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, String(SW_RES( STR_FDLG_TEMPLATE_NAME ))); } catch(Exception& ) { DBG_ERROR("control acces failed"); } xFP->setTitle( SW_RESSTR( nStrId )); SvtPathOptions aPathOpt; xFP->setDisplayDirectory( aPathOpt.GetWorkPath() ); if( ERRCODE_NONE == aDlgHelper.Execute()) { aFileName = xFP->getFiles().getConstArray()[0]; Any aTemplateValue = xCtrlAcc->getValue( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, ListboxControlActions::GET_SELECTED_ITEM ); OUString sTmpl; aTemplateValue >>= sTmpl; //aTemplateName = sTmpl; //#outline level,removed by zhaojianwei //#outline level,add by zhaojianwei sal_Int32 nColonPos = sTmpl.indexOf( sal_Unicode(':') ); OUString sPrefix = sTmpl.copy( 0L, nColonPos ); if( sPrefix.equalsAscii("Style")) { aTemplateName = sTmpl.copy( 7L ); //get string behind "Style: " } else if( sPrefix.equalsAscii("Outline")) { nTemplateOutlineLevel = ( sTmpl.copy( 15L )).toInt32(); //get string behind "Outline: Leve "; bCreateByOutlineLevel = true; } //<-end,zhaojianwei if ( aFileName.Len() ) { rReq.AppendItem( SfxStringItem( nWhich, aFileName ) ); if( aTemplateName.Len() ) rReq.AppendItem( SfxStringItem( SID_TEMPLATE_NAME, aTemplateName ) ); } } } } //const SwTxtFmtColl* pSplitColl = 0; //#outline level,removed by zhaojianwei // if ( aTemplateName.Len() ) // pSplitColl = pDoc->FindTxtFmtCollByName(aTemplateName); //<-end,zhaojianwei if( aFileName.Len() ) { if( PrepareClose( sal_False ) ) { SwWait aWait( *this, true ); //bDone = bCreateHtml //#outline level,removed by zhaojianwei // ? pDoc->GenerateHTMLDoc( aFileName, pSplitColl ) // : pDoc->GenerateGlobalDoc( aFileName, pSplitColl ); if ( bCreateByOutlineLevel ) //add by zhaojianwei { bDone = bCreateHtml //#outline level,removed by zhaojianwei ? pDoc->GenerateHTMLDoc( aFileName, nTemplateOutlineLevel ) : pDoc->GenerateGlobalDoc( aFileName, nTemplateOutlineLevel ); } else { const SwTxtFmtColl* pSplitColl = 0; if ( aTemplateName.Len() ) pSplitColl = pDoc->FindTxtFmtCollByName(aTemplateName); bDone = bCreateHtml //#outline level,removed by zhaojianwei ? pDoc->GenerateHTMLDoc( aFileName, pSplitColl ) : pDoc->GenerateGlobalDoc( aFileName, pSplitColl ); } //<-end,zhaojianwei if( bDone ) { SfxStringItem aName( SID_FILE_NAME, aFileName ); SfxStringItem aReferer( SID_REFERER, aEmptyStr ); SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while(pViewShell) { //search for the view that created the call if(pViewShell->GetObjectShell() == this && pViewShell->GetDispatcher()) { SfxFrameItem* pFrameItem = new SfxFrameItem( SID_DOCFRAME, pViewShell->GetViewFrame() ); SfxDispatcher* pDispatch = pViewShell->GetDispatcher(); pDispatch->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, &aName, &aReferer, pFrameItem, 0L ); delete pFrameItem; break; } pViewShell = SfxViewShell::GetNext(*pViewShell); } } } if( !bDone && !rReq.IsAPI() ) { InfoBox( 0, SW_RESSTR( STR_CANTCREATE )).Execute(); } } } rReq.SetReturnValue(SfxBoolItem( nWhich, bDone )); if (bDone) rReq.Done(); else rReq.Ignore(); break; case SID_ATTR_YEAR2000: if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , sal_False, &pItem )) { DBG_ASSERT(pItem->ISA(SfxUInt16Item), "falsches Item"); sal_uInt16 nYear2K = ((SfxUInt16Item*)pItem)->GetValue(); //ueber Views iterieren und den State an den FormShells setzen SfxViewFrame* pVFrame = SfxViewFrame::GetFirst( this ); SfxViewShell* pViewShell = pVFrame ? pVFrame->GetViewShell() : 0; SwView* pCurrView = dynamic_cast< SwView* >( pViewShell ); while(pCurrView) { FmFormShell* pFormShell = pCurrView->GetFormShell(); if(pFormShell) pFormShell->SetY2KState(nYear2K); pVFrame = SfxViewFrame::GetNext( *pVFrame, this ); pViewShell = pVFrame ? pVFrame->GetViewShell() : 0; pCurrView = dynamic_cast( pViewShell ); } pDoc->GetNumberFormatter(sal_True)->SetYear2000(nYear2K); } break; default: DBG_ERROR("falscher Dispatcher"); } } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ long SwDocShell::DdeGetData( const String& rItem, const String& rMimeType, uno::Any & rValue ) { return pDoc->GetData( rItem, rMimeType, rValue ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ long SwDocShell::DdeSetData( const String& rItem, const String& rMimeType, const uno::Any & rValue ) { return pDoc->SetData( rItem, rMimeType, rValue ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ ::sfx2::SvLinkSource* SwDocShell::DdeCreateLinkSource( const String& rItem ) { return pDoc->CreateLinkSource( rItem ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDocShell::FillClass( SvGlobalName * pClassName, sal_uInt32 * pClipFormat, String * /*pAppName*/, String * pLongUserName, String * pUserName, sal_Int32 nVersion, sal_Bool bTemplate /* = sal_False */) const { if (nVersion == SOFFICE_FILEFORMAT_60) { *pClassName = SvGlobalName( SO3_SW_CLASSID_60 ); *pClipFormat = SOT_FORMATSTR_ID_STARWRITER_60; *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE); } else if (nVersion == SOFFICE_FILEFORMAT_8) { *pClassName = SvGlobalName( SO3_SW_CLASSID_60 ); *pClipFormat = bTemplate ? SOT_FORMATSTR_ID_STARWRITER_8_TEMPLATE : SOT_FORMATSTR_ID_STARWRITER_8; *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE); } *pUserName = SW_RESSTR(STR_HUMAN_SWDOC_NAME); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDocShell::SetModified( sal_Bool bSet ) { SfxObjectShell::SetModified( bSet ); if( IsEnableSetModified()) { if (!pDoc->IsInCallModified() ) { EnableSetModified( sal_False ); if( bSet ) { sal_Bool bOld = pDoc->IsModified(); pDoc->SetModified(); if( !bOld ) { pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified(); } } else pDoc->ResetModified(); EnableSetModified( sal_True ); } UpdateChildWindows(); Broadcast(SfxSimpleHint(SFX_HINT_DOCCHANGED)); } } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDocShell::UpdateChildWindows() { // Flddlg ggf neu initialisieren (z.B. fuer TYP_SETVAR) if(!GetView()) return; SfxViewFrame* pVFrame = GetView()->GetViewFrame(); SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame-> GetChildWindow( SwFldDlgWrapper::GetChildWindowId() ); if( pWrp ) pWrp->ReInitDlg( this ); // RedlineDlg ggf neu initialisieren SwRedlineAcceptChild *pRed = (SwRedlineAcceptChild*)pVFrame-> GetChildWindow( SwRedlineAcceptChild::GetChildWindowId() ); if( pRed ) pRed->ReInitDlg( this ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ // --> OD 2005-08-02 #i48748# class SwReloadFromHtmlReader : public SwReader { public: SwReloadFromHtmlReader( SfxMedium& _rTmpMedium, const String& _rFilename, SwDoc* _pDoc ) : SwReader( _rTmpMedium, _rFilename, _pDoc ) { SetBaseURL( _rFilename ); } }; // <-- void SwDocShell::ReloadFromHtml( const String& rStreamName, SwSrcView* pSrcView ) { sal_Bool bModified = IsModified(); // MIB 23.6.97: Die HTTP-Header-Felder muessen geloescht werden, // sonst gibt es welche aus Meta-Tags hinter doppelt und dreifach. ClearHeaderAttributesForSourceViewHack(); // MIB 24.07.97: Das Dokument-Basic muss auch noch d'ran glauben ... SvxHtmlOptions* pHtmlOptions = SvxHtmlOptions::Get(); //#59620# HasBasic() zeigt an, dass es schon einen BasicManager an der DocShell // gibt. Der wurde im HTML-Import immer angelegt, wenn Macros im Quelltext // vorhanden sind. if( pHtmlOptions && pHtmlOptions->IsStarBasic() && HasBasic()) { BasicManager *pBasicMan = GetBasicManager(); if( pBasicMan && (pBasicMan != SFX_APP()->GetBasicManager()) ) { sal_uInt16 nLibCount = pBasicMan->GetLibCount(); while( nLibCount ) { StarBASIC *pBasic = pBasicMan->GetLib( --nLibCount ); if( pBasic ) { // Die IDE benachrichtigen SfxUsrAnyItem aShellItem( SID_BASICIDE_ARG_DOCUMENT_MODEL, makeAny( GetModel() ) ); String aLibName( pBasic->GetName() ); SfxStringItem aLibNameItem( SID_BASICIDE_ARG_LIBNAME, aLibName ); pSrcView->GetViewFrame()->GetDispatcher()->Execute( SID_BASICIDE_LIBREMOVED, SFX_CALLMODE_SYNCHRON, &aShellItem, &aLibNameItem, 0L ); // Aus der Standard-Lib werden nur die Module geloescht if( nLibCount ) pBasicMan->RemoveLib( nLibCount, sal_True ); else pBasic->Clear(); } } ASSERT( pBasicMan->GetLibCount() <= 1, "Loschen des Basics hat nicht geklappt" ); } } sal_Bool bWasBrowseMode = pDoc->get(IDocumentSettingAccess::BROWSE_MODE); RemoveLink(); //jetzt muss auch das UNO-Model ueber das neue Doc informiert werden #51535# uno::Reference xDoc(GetBaseModel(), uno::UNO_QUERY); text::XTextDocument* pxDoc = xDoc.get(); ((SwXTextDocument*)pxDoc)->InitNewDoc(); AddLink(); //#116402# update font list when new document is created UpdateFontList(); pDoc->set(IDocumentSettingAccess::BROWSE_MODE, bWasBrowseMode); pSrcView->SetPool(&GetPool()); const String& rMedname = GetMedium()->GetName(); // fix #51032#: Die HTML-Vorlage muss noch gesetzt werden SetHTMLTemplate( *GetDoc() ); //Styles aus HTML.vor SfxViewShell* pViewShell = GetView() ? (SfxViewShell*)GetView() : SfxViewShell::Current(); SfxViewFrame* pViewFrm = pViewShell->GetViewFrame(); pViewFrm->GetDispatcher()->Execute( SID_VIEWSHELL0, SFX_CALLMODE_SYNCHRON ); SubInitNew(); SfxMedium aMed( rStreamName, STREAM_READ, sal_False ); // --> OD 2005-08-01 #i48748# - use class , because // the base URL has to be set to the filename of the document // and not to the base URL of the temporary file in order to get // the URLs of the linked graphics correctly resolved. SwReloadFromHtmlReader aReader( aMed, rMedname, pDoc ); // <-- aReader.Read( *ReadHTML ); const SwView* pCurrView = GetView(); //in print layout the first page(s) may have been formatted as a mix of browse //and print layout if(!bWasBrowseMode && pCurrView) { SwWrtShell& rWrtSh = pCurrView->GetWrtShell(); if( rWrtSh.GetLayout()) rWrtSh.CheckBrowseView( sal_True ); } // MIB 23.6.97: Die HTTP-Header-Attribute wieder in die DokInfo // uebernehmen. Die Base-URL ist hier egal, da TLX zum absolutieren die // vom Dokument nimmt. SetHeaderAttributesForSourceViewHack(); if(bModified && !IsReadOnly()) SetModified(); else pDoc->ResetModified(); } sal_uLong SwDocShell::LoadStylesFromFile( const String& rURL, SwgReaderOption& rOpt, sal_Bool bUnoCall ) { sal_uLong nErr = 0; // Create a URL from filename INetURLObject aURLObj( rURL ); String sURL( aURLObj.GetMainURL( INetURLObject::NO_DECODE ) ); // Filter bestimmen: // const SfxFilter* pFlt = SwIoSystem::GetFileFilter( rURL, aEmptyStr ); String sFactory(String::CreateFromAscii(SwDocShell::Factory().GetShortName())); SfxFilterMatcher aMatcher( sFactory ); //#b6445961# search for filter in WebDocShell, too SfxMedium aMed( rURL, STREAM_STD_READ, sal_False ); const SfxFilter* pFlt = 0; aMatcher.DetectFilter( aMed, &pFlt, sal_False, sal_False ); if(!pFlt) { String sWebFactory(String::CreateFromAscii(SwWebDocShell::Factory().GetShortName())); SfxFilterMatcher aWebMatcher( sWebFactory ); aWebMatcher.DetectFilter( aMed, &pFlt, sal_False, sal_False ); } // --> OD #i117339# - trigger import only for own formats // if( aMed.IsStorage() ) bool bImport( false ); { if ( aMed.IsStorage() ) { // As xStorage = aMed.GetStorage(); if ( xStorage.is() ) { // use on retrieving in order to check, // if the storage is one of our own ones. try { uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY_THROW ); const ::rtl::OUString aMediaTypePropName( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ); xProps->getPropertyValue( aMediaTypePropName ); bImport = true; } catch( const uno::Exception& ) { bImport = false; } } } } if ( bImport ) // <-- { DBG_ASSERT((pFlt ? pFlt->GetVersion() : 0) >= SOFFICE_FILEFORMAT_60, "which file version?"); SwRead pRead = ReadXML; SwReader* pReader = 0; SwPaM* pPam = 0; // the SW3IO - Reader need the pam/wrtshell, because only then he // insert the styles! if( bUnoCall ) { SwNodeIndex aIdx( pDoc->GetNodes().GetEndOfContent(), -1 ); pPam = new SwPaM( aIdx ); pReader = new SwReader( aMed, rURL, *pPam ); } else { pReader = new SwReader( aMed, rURL, *pWrtShell->GetCrsr() ); } pRead->GetReaderOpt().SetTxtFmts( rOpt.IsTxtFmts() ); pRead->GetReaderOpt().SetFrmFmts( rOpt.IsFrmFmts() ); pRead->GetReaderOpt().SetPageDescs( rOpt.IsPageDescs() ); pRead->GetReaderOpt().SetNumRules( rOpt.IsNumRules() ); pRead->GetReaderOpt().SetMerge( rOpt.IsMerge() ); if( bUnoCall ) { UnoActionContext aAction( pDoc ); nErr = pReader->Read( *pRead ); } else { pWrtShell->StartAllAction(); nErr = pReader->Read( *pRead ); pWrtShell->EndAllAction(); } delete pPam; delete pReader; } return nErr; } /*-------------------------------------------------------------------- Get a client for an embedded object if possible. --------------------------------------------------------------------*/ SfxInPlaceClient* SwDocShell::GetIPClient( const ::svt::EmbeddedObjectRef& xObjRef ) { SfxInPlaceClient* pResult = NULL; SwWrtShell* pShell = GetWrtShell(); if ( pShell ) { pResult = pShell->GetView().FindIPClient( xObjRef.GetObject(), (Window*)&pShell->GetView().GetEditWin() ); if ( !pResult ) pResult = new SwOleClient( &pShell->GetView(), &pShell->GetView().GetEditWin(), xObjRef ); } return pResult; }