/************************************************************************* * * $RCSfile: docsh2.cxx,v $ * * $Revision: 1.34 $ * * last change: $Author: jp $ $Date: 2001-08-23 14:46:26 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifdef PRECOMPILED #include "ui_pch.hxx" #endif #pragma hdrstop #define ITEMID_COLOR_TABLE SID_COLOR_TABLE #ifndef _HINTIDS_HXX #include #endif #ifndef _URLOBJ_HXX //autogen #include #endif #ifndef _UNOTOOLS_TEMPFILE_HXX #include #endif #ifndef _WRKWIN_HXX //autogen #include #endif #ifndef _MSGBOX_HXX //autogen #include #endif #ifndef _LCKBITEM_HXX #include #endif #ifndef _SFXENUMITEM_HXX //autogen #include #endif #ifndef _SFXMACITEM_HXX //autogen #include #endif #ifndef _ZFORLIST_HXX //autogen #include #endif #ifndef _ZFORMAT_HXX //autogen #include #endif #ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX #include #endif #ifndef _TRANSFER_HXX #include #endif #ifndef _SFXDOCINF_HXX //autogen #include #endif #ifndef _SFX_DINFDLG_HXX //autogen #include #endif #ifndef _SFXREQUEST_HXX //autogen #include #endif #ifndef _SFXDISPATCH_HXX //autogen #include #endif #ifndef _SFXNEW_HXX //autogen #include #endif #ifndef _FILEDLGHELPER_HXX #include #endif #ifndef _SFX_PRINTER_HXX //autogen #include #endif #ifndef _SFX_EVENTCONF_HXX //autogen #include #endif #ifndef _SFXECODE_HXX //autogen #include #endif #ifndef _SFXDOCFILE_HXX //autogen #include #endif #ifndef _SFX_DOCFILT_HACK_HXX //autogen #include #endif #ifndef _SFXFRAME_HXX #include #endif #ifndef _SVX_SVXIDS_HRC //autogen #include #endif #ifndef _SVX_DRAWITEM_HXX //autogen #include #endif #ifndef _MySVXACORR_HXX //autogen #include #endif #ifndef _SVX_LANGITEM_HXX //autogen #include #endif #ifndef _SVX_FMSHELL_HXX //autogen #include #endif #ifndef _OFA_HTMLCFG_HXX //autogen #include #endif #ifndef _OFF_OFAITEM_HXX //autogen #include #endif #ifndef _OFF_APP_HXX //autogen #include #endif #ifndef _SB_SBSTAR_HXX //autogen #include #endif #ifndef _BASMGR_HXX //autogen #include #endif #ifndef _SVSTOR_HXX //autogen #include #endif #ifndef _SO_CLSIDS_HXX #include #endif #ifndef _SWUNODEF_HXX #include #endif #ifndef _FMTCOL_HXX //autogen #include #endif #ifndef _SWEVENT_HXX //autogen #include #endif #ifndef _VIEW_HXX #include // fuer die aktuelle Sicht #endif #ifndef _DOCSH_HXX #include // Dokumenterzeugung #endif #ifndef _WRTSH_HXX #include #endif #ifndef _FLDBAS_HXX #include #endif #ifndef _VIEWOPT_HXX #include #endif #ifndef _GLOBDOC_HXX #include #endif #ifndef _DOCSTDLG_HXX #include // fuer Dokument Style #endif #ifndef _FLDWRAP_HXX #include #endif #ifndef _REDLNDLG_HXX #include #endif #ifndef _ABSTRACT_HXX #include // SwInsertAbstractDialog #endif #ifndef _DOCSTYLE_HXX #include #endif #ifndef _DOC_HXX #include #endif #ifndef _PAGEDESC_HXX #include #endif #ifndef _SHELLIO_HXX #include #endif #ifndef _SW3IO_HXX #include #endif #ifndef _PVIEW_HXX #include #endif #ifndef _SRCVIEW_HXX #include #endif #ifndef _POOLFMT_HXX #include #endif #ifndef _USRPREF_HXX #include #endif #ifndef _WDOCSH_HXX #include #endif #ifndef _UNOTXDOC_HXX #include #endif #ifndef _ACMPLWRD_HXX #include #endif #ifndef _SWMODULE_HXX #include #endif #ifndef _UNOOBJ_HXX #include #endif #ifndef _CMDID_H #include #endif #ifndef _GLOBALS_H #include #endif #ifndef _HELPID_H #include #endif #ifndef _APP_HRC #include #endif #ifndef _POOLFMT_HRC #include #endif #ifndef _GLOBALS_HRC #include #endif #ifndef _COM_SUN_STAR_UI_DIALOGS_XFILEPICKER_HPP_ #include #endif #ifndef _COM_SUN_STAR_UI_DIALOGS_XFILTERMANAGER_HPP_ #include #endif #ifndef _COM_SUN_STAR_UI_DIALOGS_XFILEPICKERCONTROLACCESS_HPP_ #include #endif #ifndef _COM_SUN_STAR_UI_DIALOGS_EXTENDEDFILEPICKERELEMENTIDS_HPP_ #include #endif #ifndef _COM_SUN_STAR_UI_DIALOGS_LISTBOXCONTROLACTIONS_HPP_ #include #endif #ifndef _SWSTYLENAMEMAPPER_HXX #include #endif 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 namespace ::rtl; using namespace ::sfx2; extern FASTBOOL FindPhyStyle( SwDoc& , const String& , SfxStyleFamily ); /*-------------------------------------------------------------------- Beschreibung: DocInfo setzen am SFX --------------------------------------------------------------------*/ BOOL SwDocShell::SetDocumentInfo(const SfxDocumentInfo& rInfo) { SfxDocumentInfo& rOldInfo = GetDocInfo(); BOOL bRet = !(rOldInfo == rInfo); if( bRet ) { rOldInfo = rInfo; Broadcast( SfxDocumentInfoHint( &rOldInfo ) ); } return bRet; } /*-------------------------------------------------------------------- Beschreibung: DocInfo kreieren (virtuell) --------------------------------------------------------------------*/ SfxDocumentInfoDialog* SwDocShell::CreateDocumentInfoDialog( Window *pParent, const SfxItemSet &rSet) { SfxDocumentInfoDialog* pDlg = new SfxDocumentInfoDialog(pParent, rSet); // const SfxDocumentInfoItem& rItem = (const SfxDocumentInfoItem&)rSet.Get(SID_DOCINFO); // if(rItem.IsOwnFormat()) //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) ) pDlg->AddTabPage(TP_DOC_STAT, SW_RESSTR(STR_DOC_STAT), SwDocStatPage::Create, 0); } return pDlg; } /*-------------------------------------------------------------------- Beschreibung: Benachrichtigung bei geaenderter DocInfo --------------------------------------------------------------------*/ void SwDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint ) { if( !pDoc ) { //MA: Kommt bei der OLE-Registration vor! // ASSERT( !this, "DocShell ist nicht richtig initialisiert!" ); return ; } if( rHint.ISA(SfxDocumentInfoHint) ) { if( pWrtShell ) { pWrtShell->LockView( TRUE ); //Sichtbaren bereich Locken. pWrtShell->StartAllAction(); } pDoc->DocInfoChgd( *((SfxDocumentInfoHint&)rHint).GetObject() ); if( pWrtShell ) { pWrtShell->EndAllAction(); pWrtShell->LockView( FALSE ); } } else if ( rHint.ISA(SfxSimpleHint) ) { switch( ((SfxSimpleHint&) rHint).GetId() ) { case SFX_HINT_TITLECHANGED: if ( GetMedium() ) { if( pWrtShell ) { pWrtShell->LockView( TRUE ); pWrtShell->StartAllAction(); } pDoc->GetSysFldType( RES_FILENAMEFLD )->UpdateFlds(); if( pWrtShell ) { pWrtShell->EndAllAction(); pWrtShell->LockView( FALSE ); } } break; } } } /*-------------------------------------------------------------------- Beschreibung: Benachrichtigung Doc schliessen --------------------------------------------------------------------*/ USHORT SwDocShell::PrepareClose( BOOL bUI, BOOL bForBrowsing ) { USHORT nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing ); if( TRUE == nRet ) //Unbedingt auf TRUE abfragen! (RET_NEWTASK) EndListening( *this ); return nRet; } void SwDoc::SetInfo( const SfxDocumentInfo& rInfo ) { if( pDocShell ) pDocShell->SetDocumentInfo( rInfo ); // sollte nur beim "Konvertieren" von Dokumenten hier ankommen! else { // dann setzen wir uns die DocInfo. Nach dem Konvertieren wird diese // am Medium gesetzt. Erst dann ist die DocShell bekannt. delete pSwgInfo; pSwgInfo = new SfxDocumentInfo( rInfo ); // wenn beim Einlesen, dann kein Modify verschicken, diese sollten dann // richtig eingelesen werden oder spaetestens beim Expandieren die richtigen // Werte finden. // GetSysFldType( RES_DOCINFOFLD )->UpdateFlds(); // GetSysFldType( RES_TEMPLNAMEFLD )->UpdateFlds(); } } /*-------------------------------------------------------------------- Beschreibung: Organizer --------------------------------------------------------------------*/ BOOL SwDocShell::Insert( SfxObjectShell &rSource, USHORT nSourceIdx1, // SourcePool: oberste Inhaltsebene (Vorlagen/Makros) USHORT nSourceIdx2, // Index in den Inhalt USHORT nSourceIdx3, // Index in die Inhaltsebene USHORT &rIdx1, // und das gleiche fuer den DestinationPool USHORT &rIdx2, // "" USHORT &rIdx3, // "" USHORT &rRemovedIdx ) // falls doppelte geloescht werden, Pos zurueck { BOOL bRet = 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 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 && pDoc->GetPageDesc(0).GetName() == rOldName ) || ( SFX_STYLE_FAMILY_CHAR == eOldFamily && rOldName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ] )) return FALSE; SfxStyleFamily eMyOldFamily( pMyPool->GetSearchFamily() ); USHORT 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 FALSE; } // Da Replace den aStyleSheet-Member selbst benoetigt, muss // das Ergebnis vom Find kopiert werden (s.u.)) SwDocStyleSheet aExist( *(SwDocStyleSheet*)pMyPool->Find( rOldName, eOldFamily ) ); pMyPool->Replace( *pHisSheet, aExist ); // An der Reihenfolge der Vorlagen im Pool aendert sich nichts. rIdx2 = rIdx1 = INDEX_IGNORE; GetDoc()->SetModified(); return 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. SwDocStyleSheet aNewSheet( (SwDocStyleSheet&)pMyPool ->Make(rOldName, eOldFamily, pHisSheet->GetMask() ) ); if( SFX_STYLE_FAMILY_PAGE == eOldFamily && rSource.ISA(SwDocShell) ) { // gesondert behandeln!! SwPageDesc* pDestDsc = (SwPageDesc*)aNewSheet.GetPageDesc(); SwPageDesc* pCpyDsc = (SwPageDesc*)((SwDocStyleSheet*)pHisSheet)->GetPageDesc(); pDoc->CopyPageDesc( *pCpyDsc, *pDestDsc ); } else // die neue Vorlage mit den Attributen fuellen aNewSheet.SetItemSet( pHisSheet->GetItemSet() ); pMyPool->SetSearchMask( SFX_STYLE_FAMILY_ALL, nMySrchMask ); if( aNewSheet.IsUserDefined() || aNewSheet.IsUsed() ) { // Benutzte und Benutzer-definierte Vorlagen werden angezeigt. // Dshalb muss hier der Index der neuen Vorlage im Pool // ermittelt werden. pExist = pMyPool->First(); USHORT 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( 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) { aNewSheet.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) { aNewSheet.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 = TRUE; } else bRet = SfxObjectShell::Insert( rSource, nSourceIdx1, nSourceIdx2, nSourceIdx3, rIdx1, rIdx2, rIdx3, rRemovedIdx); return bRet; } /*-------------------------------------------------------------------- Beschreibung: Vorlagen Remove --------------------------------------------------------------------*/ BOOL SwDocShell::Remove(USHORT nIdx1, // siehe Insert USHORT nIdx2, USHORT nIdx3) { BOOL bRet = 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 && pDoc->GetPageDesc(0).GetName() == aName ) || ( SFX_STYLE_FAMILY_CHAR == eFamily && aName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ] )) return FALSE; // also loeschen pMyPool->Erase( pMySheet ); // jetzt noch die Parents/Follows aller Instanziierten korrigieren pMyPool->SetOrganizerMode( 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 = 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; USHORT nWhich = rReq.GetSlot(); BOOL bDone = FALSE; switch ( nWhich ) { case SID_AUTO_CORRECT_DLG: { OfficeApplication *pOApp = OFF_APP(); SfxBoolItem aSwOptions( SID_AUTO_CORRECT_DLG, TRUE ); SvxSwAutoFmtFlags* pAFlags = &pOApp->GetAutoCorrect()->GetSwFlags(); SwAutoCompleteWord& rACW = SwDoc::GetAutoCompleteWords(); BOOL bOldLocked = rACW.IsLockWordLstLocked(), bOldAutoCmpltCollectWords = pAFlags->bAutoCmpltCollectWords; rACW.SetLockWordLstLocked( TRUE ); SvStringsISortDtor aTmpLst; aTmpLst.Insert( &rACW.GetWordList() ); pAFlags->pAutoCmpltList = &aTmpLst; SfxViewShell* pViewShell = GetView() ? (SfxViewShell*)GetView() : SfxViewShell::Current(); SfxRequest aAppReq(SID_AUTO_CORRECT_DLG, SFX_CALLMODE_SYNCHRON, pOApp->GetPool()); aAppReq.AppendItem(aSwOptions); pOApp->ExecuteSlot(aAppReq); 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( (USHORT)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->GetRootFrm() ) pTmp->InvalidateAutoCompleteFlag(); } } } break; case SID_PRINTPREVIEW: { BOOL bSet = FALSE, bFound = FALSE, bOnly = TRUE; SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this); SfxViewShell* pViewShell = SfxViewShell::Current(); SwView* pView = PTR_CAST( SwView, pViewShell ); BOOL bCurrent = IS_TYPE( SwPagePreView, pViewShell ); while( pTmpFrm ) // search PreView { if( IS_TYPE( SwView, pTmpFrm->GetViewShell()) ) bOnly = FALSE; else if( IS_TYPE( SwPagePreView, pTmpFrm->GetViewShell())) { pTmpFrm->GetFrame()->Appear(); bFound = TRUE; } if( bFound && !bOnly ) break; pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this); } if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_PRINTPREVIEW, FALSE, &pItem )) bSet = ((SfxBoolItem*)pItem)->GetValue(); else bSet = !bCurrent; USHORT nSlotId = 0; if( bSet && !bFound ) // Keine gefunden, daher neue Preview anlegen { //Keine neue anlegen fuer BrowseView! if( !GetDoc()->IsBrowseMode() ) 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( pView && pView->GetDocShell() == this ) pTmpFrm = pView->GetViewFrame(); else pTmpFrm = SfxViewFrame::GetFirst( this ); pTmpFrm->GetBindings().Execute( nSlotId, NULL, 0, SFX_CALLMODE_ASYNCHRON ); } rReq.SetReturnValue(SfxBoolItem(SID_PRINTPREVIEW, bSet )); } break; case SID_TEMPLATE_LOAD: { String aFileName; static BOOL bText = TRUE; static BOOL bFrame = FALSE; static BOOL bPage = FALSE; static BOOL bNum = FALSE; static BOOL bMerge = FALSE; USHORT nRet = USHRT_MAX; SvtPathOptions aPathOpt; SfxNewFileDialog* pNewFileDlg = new SfxNewFileDialog(&GetView()->GetViewFrame()->GetWindow(), SFXWB_LOAD_TEMPLATE); USHORT 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; pNewFileDlg->SetTemplateFlags(nFlags); nRet = pNewFileDlg->Execute(); if(RET_TEMPLATE_LOAD == nRet) { FileDialogHelper aDlgHelper( FILEOPEN_SIMPLE, 0 ); Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); xFP->setDisplayDirectory( aPathOpt.GetWorkPath() ); SfxObjectFactory &rFact = GetFactory(); Reference xFltMgr(xFP, UNO_QUERY); for( USHORT i = 0; i < rFact.GetFilterCount(); i++ ) { const SfxFilter* pFlt = rFact.GetFilter( i ); if( pFlt && pFlt->IsAllowedAsTemplate() ) { const String sWild = ((WildCard&)pFlt->GetWildcard()).GetWildCard(); xFltMgr->appendFilter( pFlt->GetUIName(), sWild ); } if( pFlt->GetUserData().EqualsAscii( FILTER_XML )) xFltMgr->setCurrentFilter( pFlt->GetUIName() ) ; } if( xFP->execute() == RET_OK ) { aFileName = xFP->getFiles().getConstArray()[0]; } } else { aFileName = pNewFileDlg->GetTemplateFileName(); } SwgReaderOption aOpt; nFlags = pNewFileDlg->GetTemplateFlags(); 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 ); if( aFileName.Len() ) SetError( LoadStylesFromFile( aFileName, aOpt, FALSE )); delete pNewFileDlg; } break; case SID_SOURCEVIEW: { SfxViewShell* pViewShell = GetView() ? (SfxViewShell*)GetView() : SfxViewShell::Current(); SfxViewFrame* pViewFrm = pViewShell->GetViewFrame(); SwSrcView* pSrcView = PTR_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() ); BOOL bHasName = HasName(); if(bHasName) { //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()) bHasName = FALSE; else break; } } if(!bHasName) { FileDialogHelper aDlgHelper( FILESAVE_SIMPLE, 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; } else DoSave(); } #ifdef DBG_UTIL { BOOL bWeb = 0 != PTR_CAST(SwWebDocShell, this); DBG_ASSERT(bWeb == TRUE, "SourceView nur in der WebDocShell") } #endif // die SourceView ist fuer die SwWebDocShell die 1 USHORT nSlot = SID_VIEWSHELL1; BOOL bSetModified = FALSE; SfxPrinter* pSavePrinter = 0; if( 0 != pSrcView) { SfxPrinter* pTemp = GetDoc()->GetPrt(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 = TRUE; SetActualSize(pSrcView->GetEditWin().GetSizePixel()); SfxEventConfiguration* pEvent = SFX_APP()->GetEventConfig(); SvxMacro aMac(aEmptyStr, aEmptyStr, STARBASIC); pEvent->ConfigureEvent(SFX_EVENT_OPENDOC, aMac, this); pEvent->ConfigureEvent(SFX_EVENT_CLOSEDOC, aMac, this); pEvent->ConfigureEvent(SFX_EVENT_ACTIVATEDOC, aMac, this); pEvent->ConfigureEvent(SFX_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()) { USHORT 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()->SetPrt(pSavePrinter); //pSavePrinter darf nicht wieder geloescht werden } pViewFrm->GetBindings().SetState(SfxBoolItem(SID_SOURCEVIEW, nSlot == SID_VIEWSHELL2)); } break; case SID_GET_COLORTABLE: { SvxColorTableItem* pColItem = (SvxColorTableItem*)GetItem(SID_COLOR_TABLE); XColorTable* pTable = pColItem->GetColorTable(); rReq.SetReturnValue(OfaPtrItem(SID_GET_COLORTABLE, pTable)); } break; case FN_ABSTRACT_STARIMPRESS: case FN_ABSTRACT_NEWDOC: { SwInsertAbstractDlg* pDlg = new SwInsertAbstractDlg(0); if(RET_OK == pDlg->Execute()) { BYTE nLevel = pDlg->GetLevel(); BYTE nPara = pDlg->GetPara(); SwDoc* pDoc = new SwDoc(); SfxObjectShellRef xDocSh( new SwDocShell( pDoc, SFX_CREATE_MODE_STANDARD)); xDocSh->DoInitNew( 0 ); BOOL bImpress = FN_ABSTRACT_STARIMPRESS == nWhich; pWrtShell->Summary( pDoc, nLevel, nPara, bImpress ); if( bImpress ) { WriterRef xWrt; ::GetRTFWriter( aEmptyStr, xWrt ); SvMemoryStream *pStrm = new SvMemoryStream(); pStrm->SetBufferSize( 16348 ); SwWriter aWrt( *pStrm, *pDoc ); ErrCode eErr = aWrt.Write( xWrt ); if( !ERRCODE_TOERROR( eErr ) ) { pStrm->Seek( STREAM_SEEK_TO_END ); *pStrm << '\0'; pStrm->Seek( STREAM_SEEK_TO_BEGIN ); //Die Lockbytes werden owner des Stream* SvLockBytes *pLockBytes = new SvLockBytes( pStrm, TRUE ); //Das Item wird owner des LockBytes* SfxLockBytesItem aItem( SID_OUTLINE_TO_IMPRESS, pLockBytes ); SfxModule *pMod = (*(SfxModule**)GetAppData(SHL_DRAW))->Load(); SfxItemSet aSet( pMod->GetPool(), SID_OUTLINE_TO_IMPRESS, SID_OUTLINE_TO_IMPRESS ); aSet.Put( aItem ); SfxAllItemSet aArgs( pMod->GetPool() ); aArgs.Put( aSet ); SfxRequest aReq( SID_OUTLINE_TO_IMPRESS, 0, aArgs ); pMod->ExecuteSlot( aReq ); } else ErrorHandler::HandleError(ErrCode( eErr )); } else { // Neues Dokument erzeugen. SfxViewFrame *pFrame = SFX_APP()->CreateViewFrame( *xDocSh, 0 ); SwView *pView = (SwView*) pFrame->GetViewShell(); // Dokumenttitel setzen String aTmp( SW_RES(STR_ABSTRACT_TITLE) ); aTmp += GetTitle(); xDocSh->SetTitle( aTmp ); pView->GetWrtShell().SetNewDoc(); pFrame->Show(); pDoc->SetModified(); } } delete pDlg; } break; case FN_OUTLINE_TO_CLIPBOARD: case FN_OUTLINE_TO_IMPRESS: { WriterRef xWrt; ::GetRTFWriter( 'O', xWrt ); SvMemoryStream *pStrm = new SvMemoryStream(); pStrm->SetBufferSize( 16348 ); SwWriter aWrt( *pStrm, *GetDoc() ); ErrCode eErr = aWrt.Write( xWrt ); if( !ERRCODE_TOERROR( eErr ) ) { pStrm->Seek( STREAM_SEEK_TO_END ); *pStrm << '\0'; pStrm->Seek( STREAM_SEEK_TO_BEGIN ); if ( nWhich == FN_OUTLINE_TO_IMPRESS ) { //Die Lockbytes werden owner des Stream* SvLockBytes *pLockBytes = new SvLockBytes( pStrm, TRUE ); //Das Item wird owner des LockBytes* SfxLockBytesItem aItem( SID_OUTLINE_TO_IMPRESS, pLockBytes ); SfxModule *pMod = (*(SfxModule**)GetAppData(SHL_DRAW))->Load(); SfxItemSet aSet( pMod->GetPool(), SID_OUTLINE_TO_IMPRESS, SID_OUTLINE_TO_IMPRESS ); aSet.Put( aItem ); SfxAllItemSet aArgs( pMod->GetPool() ); aArgs.Put( aSet ); SfxRequest aReq( SID_OUTLINE_TO_IMPRESS, 0, aArgs ); pMod->ExecuteSlot( aReq ); } else { TransferDataContainer* pClipCntnr = new TransferDataContainer; STAR_REFERENCE( datatransfer::XTransferable ) xRef( pClipCntnr ); pClipCntnr->CopyAnyData( FORMAT_RTF, (sal_Char*) pStrm->GetData(), pStrm->GetSize() ); pClipCntnr->CopyToClipboard( GetView()? (Window*)&GetView()->GetEditWin() : 0 ); delete pStrm; } } else ErrorHandler::HandleError(ErrCode( eErr )); } break; case SID_SPELLCHECKER_CHANGED: //! FALSE, TRUE, TRUE is on the save side but a probably overdone SW_MOD()->CheckSpellChanges(FALSE, TRUE, TRUE ); break; case SID_BROWSER_MODE: case FN_PRINT_LAYOUT: //Fuer Web, genau umgekehrt zum BrowserMode { int eState = STATE_TOGGLE; BOOL bSet; const SfxPoolItem* pAttr; if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , FALSE, &pAttr )) { bSet = ((SfxBoolItem*)pAttr)->GetValue(); if ( nWhich == FN_PRINT_LAYOUT ) bSet = !bSet; eState = bSet ? STATE_ON : STATE_OFF; } if ( STATE_TOGGLE == eState ) bSet = !GetDoc()->IsBrowseMode(); ToggleBrowserMode(bSet, 0); // OS: numerische Reihenfolge beachten! static USHORT __READONLY_DATA aInva[] = { SID_NEWWINDOW,/*5620*/ SID_BROWSER_MODE, /*6313*/ SID_RULER_BORDERS, SID_RULER_PAGE_POS, SID_ATTR_LONG_LRSPACE, SID_HTML_MODE, SID_RULER_PROTECT, SID_AUTOSPELL_CHECK, SID_AUTOSPELL_MARKOFF, FN_RULER, /*20211*/ FN_VIEW_GRAPHIC, /*20213*/ FN_VIEW_BOUNDS, /**/ FN_VIEW_FIELDS, /*20215*/ FN_VLINEAL, /*20216*/ FN_VSCROLLBAR, /*20217*/ FN_HSCROLLBAR, /*20218*/ FN_VIEW_META_CHARS, /**/ FN_VIEW_MARKS, /**/ FN_VIEW_FIELDNAME, /**/ FN_VIEW_TABLEGRID, /*20227*/ FN_PRINT_LAYOUT, /*20237*/ FN_QRY_MERGE, /*20364*/ FN_STAT_HYPERLINKS, /*21186*/ FN_INSERT_HEADER, /*21405*/ FN_INSERT_FOOTER, /*21406*/ 0 }; // the view must not exist! SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst( this ); if( pTmpFrm ) pTmpFrm->GetBindings().Invalidate( aInva ); } break; case SID_MAIL_PREPAREEXPORT: { pWrtShell->StartAllAction(); pDoc->UpdateFlds( 0 ); pDoc->EmbedAllLinks(); pDoc->RemoveInvisibleContent(); pWrtShell->EndAllAction(); } break; case FN_NEW_HTML_DOC: case FN_NEW_GLOBAL_DOC: { bDone = FALSE; String aFileName, sTemplateName; const SwTxtFmtColl* pSplitColl = 0; FileDialogHelper aDlgHelper( FILESAVE_AUTOEXTENSION_TEMPLATE, 0 ); Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); const SfxFilter* pFlt; USHORT nStrId; if( FN_NEW_HTML_DOC == nWhich ) { // 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 = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii(FILTER_XML), SwGlobalDocShell::Factory().GetFilterContainer() ); nStrId = STR_LOAD_GLOBAL_DOC; } if( pFlt ) { Reference xFltMgr(xFP, UNO_QUERY); const String sWild = ((WildCard&)pFlt->GetWildcard()).GetWildCard(); xFltMgr->appendFilter( pFlt->GetUIName(), sWild ); xFltMgr->setCurrentFilter( pFlt->GetUIName() ) ; } Reference xCtrlAcc(xFP, UNO_QUERY); const USHORT nCount = pWrtShell->GetTxtFmtCollCount(); Sequence aListBoxEntries(nCount); OUString* pEntries = aListBoxEntries.getArray(); sal_Int32 nIdx = 0; sal_Int16 nSelect = 0; OUString sStartTemplate; SwTxtFmtColl *pFnd = 0, *pAny = 0; for(USHORT i = 0; i < nCount; ++i) { SwTxtFmtColl &rTxtColl = pWrtShell->GetTxtFmtColl(i); if( !rTxtColl.IsDefault() && rTxtColl.IsAtDocNodeSet() ) { if(!sStartTemplate.getLength()) { if( MAXLEVEL >= rTxtColl.GetOutlineLevel() && ( !pFnd || pFnd->GetOutlineLevel() > rTxtColl.GetOutlineLevel() )) pFnd = &rTxtColl; else if( !pAny ) pAny = &rTxtColl; sStartTemplate = pFnd ? pFnd->GetName() : pAny ? pAny->GetName() : aEmptyStr; nSelect = nIdx; } pEntries[nIdx++] = rTxtColl.GetName(); } } aListBoxEntries.realloc(nIdx); 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& rEx) { DBG_ERROR("control acces failed") } xFP->setTitle( SW_RESSTR( nStrId )); SvtPathOptions aPathOpt; xFP->setDisplayDirectory( aPathOpt.GetWorkPath() ); if( RET_OK == xFP->execute() ) { aFileName = xFP->getFiles().getConstArray()[0]; Any aTemplateValue = xCtrlAcc->getValue( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, ListboxControlActions::GET_SELECTED_ITEM ); OUString sTmpl; aTemplateValue >>= sTmpl; if (sTmpl.getLength()) pSplitColl = pDoc->FindTxtFmtCollByName(sTmpl); } if( aFileName.Len() ) { if( PrepareClose( FALSE ) && ( FN_NEW_HTML_DOC == nWhich ? pWrtShell->GenerateHTMLDoc( aFileName, pSplitColl ) : pWrtShell->GenerateGlobalDoc( aFileName, pSplitColl )) ) { bDone = TRUE; SfxStringItem aName( SID_FILE_NAME, aFileName ); SfxStringItem aReferer( SID_REFERER, aEmptyStr ); SfxFrameItem* pFrameItem = 0; SfxViewShell* pViewShell; if( GetView() ) { pViewShell = (SfxViewShell*)GetView(); pFrameItem = new SfxFrameItem( SID_DOCFRAME, pViewShell->GetViewFrame() ); } else pViewShell = SfxViewShell::Current(); pViewShell->GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, &aName, &aReferer, pFrameItem, 0L ); if( pFrameItem ) delete pFrameItem; else DoClose(); } else if( !rReq.IsAPI() ) { InfoBox( 0, SW_RESSTR( STR_CANTCREATE )).Execute(); } } } rReq.SetReturnValue(SfxBoolItem( nWhich, bDone )); break; case SID_ATTR_YEAR2000: if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , FALSE, &pItem )) { DBG_ASSERT(pItem->ISA(SfxUInt16Item), "falsches Item") USHORT 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* pView = PTR_CAST(SwView, pViewShell); while(pView) { FmFormShell* pFormShell = pView->GetFormShell(); if(pFormShell) pFormShell->SetY2KState(nYear2K); pVFrame = SfxViewFrame::GetNext( *pVFrame, this ); pViewShell = pVFrame ? pVFrame->GetViewShell() : 0; pView = PTR_CAST(SwView, pViewShell); } pDoc->GetNumberFormatter(TRUE)->SetYear2000(nYear2K); } break; default: DBG_ERROR("falscher Dispatcher"); } } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ long SwDocShell::DdeGetData( const String& rItem, const String& rMimeType, ::com::sun::star::uno::Any & rValue ) { return pDoc->GetData( rItem, rMimeType, rValue ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ long SwDocShell::DdeSetData( const String& rItem, const String& rMimeType, const ::com::sun::star::uno::Any & rValue ) { return pDoc->SetData( rItem, rMimeType, rValue ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ ::so3::SvLinkSource* SwDocShell::DdeCreateLinkSource( const String& rItem ) { return pDoc->CreateLinkSource( rItem ); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDocShell::FillClass( SvGlobalName * pClassName, ULONG * pClipFormat, String * pAppName, String * pLongUserName, String * pUserName, long nVersion ) const { SfxInPlaceObject::FillClass(pClassName, pClipFormat, pAppName, pLongUserName, pUserName, nVersion); if (nVersion == SOFFICE_FILEFORMAT_31) { // *pClassName = SvGlobalName(0xDC5C7E40L, 0xB35C, 0x101B, 0x99, 0x61, // 0x04, 0x02, 0x1C, 0x00, 0x70,0x02); *pClassName = SvGlobalName( SO3_SW_CLASSID_30 ); *pClipFormat = SOT_FORMATSTR_ID_STARWRITER_30; pAppName->AssignAscii( "Swriter 3.1" ); *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE_31); } else if (nVersion == SOFFICE_FILEFORMAT_40) { // *pClassName = SvGlobalName(0xDC5C7E40L, 0xB35C, 0x101B, 0x99, 0x61, // 0x04, 0x02, 0x1C, 0x00, 0x70,0x02); *pClassName = SvGlobalName( SO3_SW_CLASSID_40 ); *pClipFormat = SOT_FORMATSTR_ID_STARWRITER_40; pAppName->AssignAscii( "StarWriter 4.0" ); *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE_40); } else if (nVersion == SOFFICE_FILEFORMAT_50) { *pClassName = SvGlobalName( SO3_SW_CLASSID_50 ); *pClipFormat = SOT_FORMATSTR_ID_STARWRITER_50; *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE_50); } else if (nVersion == SOFFICE_FILEFORMAT_60) { *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE); } *pUserName = SW_RESSTR(STR_HUMAN_SWDOC_NAME); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDocShell::SetModified( BOOL bSet ) { SfxInPlaceObject::SetModified( bSet ); if( IsEnableSetModified() && !pDoc->IsInCallModified() ) { EnableSetModified( FALSE ); if( bSet ) { BOOL bOld = pDoc->IsModified(); pDoc->SetModified(); if( !bOld ) pDoc->SetUndoNoResetModified(); } else pDoc->ResetModified(); EnableSetModified( 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: --------------------------------------------------------------------*/ void SwDocShell::ReloadFromHtml( const String& rStreamName, SwSrcView* pSrcView ) { 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 ... // Ein EnterBasicCall braucht man hier nicht, weil man nichts ruft und // in HTML-Dokument kein Dok-Basic vorhanden sein kann, das noch nicht // geladen wurde. OfficeApplication* pOffApp = OFF_APP(); OfaHtmlOptions* pHtmlOptions = pOffApp->GetHtmlOptions(); //#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 != pOffApp->GetBasicManager()) ) { USHORT nLibCount = pBasicMan->GetLibCount(); while( nLibCount ) { StarBASIC *pBasic = pBasicMan->GetLib( --nLibCount ); if( pBasic ) { // Die IDE benachrichtigen String aLibName( '[' ); ((aLibName += GetTitle()).AppendAscii( "]." )) += pBasic->GetName(); SfxStringItem aStrItem( SID_BASICIDE_ARG_LIBNAME, aLibName ); pSrcView->GetViewFrame()->GetDispatcher()->Execute( SID_BASICIDE_LIBREMOVED, SFX_CALLMODE_SYNCHRON, &aStrItem, 0L ); // Aus der Standard-Lib werden nur die Module geloescht if( nLibCount ) pBasicMan->RemoveLib( nLibCount, TRUE ); else pBasic->Clear(); } } ASSERT( pBasicMan->GetLibCount() <= 1, "Loschen des Basics hat nicht geklappt" ); } } RemoveLink(); delete pIo; pIo = 0; //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(); pSrcView->SetPool(&GetPool()); String sBaseURL = INetURLObject::GetBaseURL(); const String& rMedname = GetMedium()->GetName(); INetURLObject::SetBaseURL( rMedname ); // 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, FALSE ); SwReader aReader( aMed, rMedname, pDoc ); aReader.Read( *ReadHTML ); INetURLObject::SetBaseURL(sBaseURL); // 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(); } /* -----------------------------14.12.99 16:52-------------------------------- ---------------------------------------------------------------------------*/ void SwDocShell::ToggleBrowserMode(BOOL bSet, SwView* pView ) { GetDoc()->SetBrowseMode( bSet ); UpdateFontList(); SwView* pTempView = pView ? pView : (SwView*)GetView(); if( pTempView ) { pTempView->GetViewFrame()->GetBindings().Invalidate(FN_SHADOWCURSOR); if( !GetDoc()->GetPrt( FALSE ) ) pTempView->SetPrinter( GetDoc()->GetPrt( TRUE ), SFX_PRINTER_PRINTER|SFX_PRINTER_JOBSETUP ); //Wenn wir die BrowseView einschalten, darf es nur diese eine //Sicht auf das Dokument geben, alle anderen werden geschlossen. SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this, 0, FALSE); do { if( pTmpFrm != pTempView->GetViewFrame() ) { pTmpFrm->DoClose(); pTmpFrm = SfxViewFrame::GetFirst(this, 0, FALSE); } else pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this, 0, FALSE); } while ( pTmpFrm ); pTempView->GetWrtShell().CheckBrowseView( TRUE ); pTempView->CheckVisArea(); SvxZoomType eType; if( GetDoc()->IsBrowseMode() && SVX_ZOOM_PERCENT != (eType = (SvxZoomType)pTempView-> GetWrtShell().GetViewOptions()->GetZoomType()) ) { ((SwView*)GetView())->SetZoom( eType ); } pTempView->InvalidateBorder(); pTempView->SetNewWindowAllowed(!bSet); } } ULONG SwDocShell::LoadStylesFromFile( const String& rURL, SwgReaderOption& rOpt, BOOL bUnoCall ) { ULONG nErr = 0; // Create a URL from filename INetURLObject aURLObj( rURL ); String sURL( aURLObj.GetMainURL() ); String sBaseURL( INetURLObject::GetBaseURL() ); INetURLObject::SetBaseURL( sURL ); SwRead pRead = 0; SwReader* pReader = 0; SwPaM* pPam = 0; // Filter bestimmen: const SfxFilter* pFlt = SwIoSystem::GetFileFilter( rURL, aEmptyStr ); SfxMedium aMed( rURL, STREAM_STD_READ, FALSE ); if( aMed.IsStorage() ) { ULONG nVersion = pFlt ? pFlt->GetVersion() : 0; if( nVersion ) aMed.GetStorage()->SetVersion( (long)nVersion ); pRead = nVersion >= SOFFICE_FILEFORMAT_60 ? ReadXML : ReadSw3; // 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() ); } else if( pFlt ) { if( pFlt->GetUserData().EqualsAscii( FILTER_SWG ) || pFlt->GetUserData().EqualsAscii( FILTER_SWGV )) pRead = ReadSwg; else if( pFlt->GetUserData().EqualsAscii( FILTER_XMLP )) pRead = ReadXML; pReader = new SwReader( aMed, rURL, pDoc ); } ASSERT( pRead, "no reader found" ); if( pRead ) { 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; INetURLObject::SetBaseURL( sBaseURL ); return nErr; }