Files
libreoffice/sw/source/ui/app/docsh2.cxx
Matteo Casalin ad3188b5fa sw_FindDocShell(): better place and name + String to OUString
Change-Id: I345a2802b4428c607297cbe6972c5b7aebc5de0b
Reviewed-on: https://gerrit.libreoffice.org/5439
Reviewed-by: Petr Mladek <pmladek@suse.cz>
Tested-by: Petr Mladek <pmladek@suse.cz>
2013-08-16 15:50:59 +00:00

1596 lines
63 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include <com/sun/star/drawing/ModuleDispatcher.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/frame/DispatchHelper.hpp>
#include <comphelper/processfactory.hxx>
#include <hintids.hxx>
#include <tools/urlobj.hxx>
#include <unotools/tempfile.hxx>
#include <vcl/wrkwin.hxx>
#include <vcl/msgbox.hxx>
#include <svl/lckbitem.hxx>
#include <svl/eitem.hxx>
#include <svl/zforlist.hxx>
#include <svl/zformat.hxx>
#include <unotools/pathoptions.hxx>
#include <svtools/transfer.hxx>
#include <sfx2/dialogs.hrc>
#include <sfx2/dinfdlg.hxx>
#include <sfx2/request.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/new.hxx>
#include <sfx2/filedlghelper.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/evntconf.hxx>
#include <svtools/sfxecode.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/docfilt.hxx>
#include <svx/svxids.hrc>
#include <svx/drawitem.hxx>
#include <editeng/svxacorr.hxx>
#include <editeng/langitem.hxx>
#include <svx/fmshell.hxx>
#include <sfx2/linkmgr.hxx>
#include <svtools/htmlcfg.hxx>
#include <svx/ofaitem.hxx>
#include <SwSmartTagMgr.hxx>
#include <sfx2/app.hxx>
#include <basic/sbstar.hxx>
#include <basic/basmgr.hxx>
#include <sot/storage.hxx>
#include <comphelper/classids.hxx>
#include <fmtcol.hxx>
#include <swevent.hxx>
#include <view.hxx> // for the current view
#include <docsh.hxx> // creation of documents
#include <docary.hxx>
#include <wrtsh.hxx>
#include <fldbas.hxx>
#include <viewopt.hxx>
#include <globdoc.hxx>
#include <fldwrap.hxx>
#include <redlndlg.hxx>
#include <docstyle.hxx>
#include <doc.hxx>
#include <IDocumentUndoRedo.hxx>
#include <pagedesc.hxx>
#include <shellio.hxx>
#include <pview.hxx>
#include <srcview.hxx>
#include <poolfmt.hxx>
#include <usrpref.hxx>
#include <wdocsh.hxx>
#include <unotxdoc.hxx>
#include <acmplwrd.hxx>
#include <swmodule.hxx>
#include <unobaseclass.hxx>
#include <swwait.hxx>
#include <swcli.hxx>
#include <cmdid.h>
#include <globals.h>
#include <helpid.h>
#include <app.hrc>
#include <poolfmt.hrc>
#include <globals.hrc>
#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <com/sun/star/ui/dialogs/ListboxControlActions.hpp>
#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
#include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
#include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
#include <com/sun/star/script/vba/VBAEventId.hpp>
#include <editeng/acorrcfg.hxx>
#include <SwStyleNameMapper.hxx>
#include <sfx2/fcontnr.hxx>
#include "dialog.hrc"
#include "swabstdlg.hxx"
#include <ndtxt.hxx> //#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 namespace ::sfx2;
extern bool FindPhyStyle( SwDoc& , const String& , SfxStyleFamily );
// create DocInfo (virtual)
SfxDocumentInfoDialog* SwDocShell::CreateDocumentInfoDialog(
Window *pParent, const SfxItemSet &rSet)
{
SfxDocumentInfoDialog* pDlg = new SfxDocumentInfoDialog(pParent, rSet);
//only with statistics, when this document is being shown, not
//from within the Doc-Manager
SwDocShell* pDocSh = (SwDocShell*) SfxObjectShell::Current();
if( pDocSh == this )
{
//Not for SourceView.
SfxViewShell *pVSh = SfxViewShell::Current();
if ( pVSh && !pVSh->ISA(SwSrcView) )
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
pDlg->AddFontTabPage();
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 );
}
}
}
static 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;
}
}
}
// Notification on DocInfo changes
void SwDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
{
if( !pDoc )
{
return ;
}
uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->GetVbaEventProcessor();
if( xVbaEvents.is() )
lcl_processCompatibleSfxHint( xVbaEvents, rHint );
sal_uInt16 nAction = 0;
if( rHint.ISA(SfxSimpleHint) )
{
// switch 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 )
{
// #i38126# - own action id
nAction = 3;
}
if( nAction )
{
bool bUnlockView = 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;
// #i38126# - own action for event LOADFINISHED
// in order to avoid a modified document.
// #i41679# - Also for the instance of <SwDoc>
// it has to be assured, that it's not modified.
// Perform the same as for action id 1, but disable <SetModified>.
case 3:
{
const bool bResetModified = IsEnableSetModified();
if ( bResetModified )
EnableSetModified( sal_False );
// #i41679#
const bool bIsDocModified = pDoc->IsModified();
pDoc->DocInfoChgd( );
// #i41679#
if ( !bIsDocModified )
pDoc->ResetModified();
if ( bResetModified )
EnableSetModified( sal_True );
}
break;
}
if( pWrtShell )
{
pWrtShell->EndAllAction();
if( bUnlockView )
pWrtShell->LockView( sal_False );
}
}
}
// Notification Close Doc
sal_uInt16 SwDocShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
{
sal_uInt16 nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing );
if( sal_True == nRet ) //has to be queried against TRUE! (RET_NEWTASK)
EndListening( *this );
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 );
}
}
return nRet;
}
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();
bool bOldLocked = rACW.IsLockWordLstLocked(),
bOldAutoCmpltCollectWords = pAFlags->bAutoCmpltCollectWords;
rACW.SetLockWordLstLocked( true );
editeng::SortedAutoCompleteStrings aTmpLst( rACW.GetWordList() );
pAFlags->m_pAutoCompleteList = &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();
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<const SfxBoolItem*>(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->m_pAutoCompleteList) // any changes?
{
rACW.CheckChangedList( aTmpLst );
// clear the temp WordList pointer
pAFlags->m_pAutoCompleteList = 0;
}
// remove all pointer we never delete the strings
aTmpLst.clear();
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;
bool bFound = false, bOnly = 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 = 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, sal_False, &pItem ))
bSet = ((SfxBoolItem*)pItem)->GetValue();
else
bSet = !bCurrent;
sal_uInt16 nSlotId = 0;
if( bSet && !bFound ) // Nothing found, so create new Preview
nSlotId = SID_VIEWSHELL1;
else if( bFound && !bSet )
nSlotId = bOnly ? SID_VIEWSHELL0 : SID_VIEWSHELL1;
if( nSlotId )
{
// 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( OUString::createFromAscii(rFact.GetShortName()) );
SfxFilterMatcherIter aIter( aMatcher );
uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
const SfxFilter* pFlt = aIter.First();
while( pFlt )
{
// --> OD #i117339#
if( pFlt && pFlt->IsAllowedAsTemplate() &&
( pFlt->GetUserData() == "CXML" ||
pFlt->GetUserData() == "CXMLV" ) )
{
const String sWild = pFlt->GetWildcard().getGlob();
xFltMgr->appendFilter( pFlt->GetUIName(), sWild );
}
pFlt = aIter.Next();
}
bool bWeb = 0 != dynamic_cast< SwWebDocShell *>( this );
const SfxFilter *pOwnFlt =
SwDocShell::Factory().GetFilterContainer()->
GetFilter4FilterName(OUString("writer8"));
// make sure the default file format is also available
if(bWeb)
{
const String sWild = pOwnFlt->GetWildcard().getGlob();
xFltMgr->appendFilter( pOwnFlt->GetUIName(), sWild );
}
bool bError = false;
// catch exception 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 ), OUString( 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(
OUString("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())
{
MessageDialog aQuery(&pViewFrm->GetWindow(),
"SaveAsHTMLDialog", "modules/swriter/ui/saveashtmldialog.ui");
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;
}
}
OSL_ENSURE(dynamic_cast<SwWebDocShell*>(this),
"SourceView only in WebDocShell");
// the SourceView is not the 1 for SwWebDocShell
sal_uInt16 nSlot = SID_VIEWSHELL1;
bool bSetModified = 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;
}
}
if(nSlot)
pViewFrm->GetDispatcher()->Execute(nSlot, SFX_CALLMODE_SYNCHRON);
if(bSetModified)
GetDoc()->SetModified();
if(pSavePrinter)
{
GetDoc()->setPrinter( pSavePrinter, true, true);
//pSavePrinter must not be deleted again
}
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_COLORLIST:
{
SvxColorListItem* pColItem = (SvxColorListItem*)GetItem(SID_COLOR_TABLE);
XColorListRef pList = pColItem->GetColorList();
rReq.SetReturnValue(OfaRefItem<XColorList>(SID_GET_COLORLIST, pList));
}
break;
case FN_ABSTRACT_STARIMPRESS:
case FN_ABSTRACT_NEWDOC:
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
AbstractSwInsertAbstractDlg* pDlg = pFact->CreateSwInsertAbstractDlg(0);
OSL_ENSURE(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 );
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< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
uno::Reference< frame::XDispatchProvider > xProv = drawing::ModuleDispatcher::create( xContext );
OUString aCmd("SendOutlineToImpress");
uno::Reference< frame::XDispatchHelper > xHelper( frame::DispatchHelper::create(xContext) );
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 = OUString("RtfOutline");
aArgs[0].Value <<= aSeq;
xHelper->executeDispatch( xProv, aCmd, OUString(), 0, aArgs );
}
}
else
ErrorHandler::HandleError(ErrCode( eErr ));
}
else
{
// Create new document
SfxViewFrame *pFrame = SfxViewFrame::LoadDocument( *xDocSh, 0 );
SwView *pCurrView = (SwView*) pFrame->GetViewShell();
// Set document's title
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( OUString('O'), OUString(), 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< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
uno::Reference< frame::XDispatchProvider > xProv = drawing::ModuleDispatcher::create( xContext );
OUString aCmd("SendOutlineToImpress");
uno::Reference< frame::XDispatchHelper > xHelper( frame::DispatchHelper::create(xContext) );
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 = OUString("RtfOutline");
aArgs[0].Value <<= aSeq;
xHelper->executeDispatch( xProv, aCmd, OUString(), 0, aArgs );
}
}
else
{
TransferDataContainer* pClipCntnr =
new TransferDataContainer;
::com::sun::star::uno::Reference< ::com::sun::star::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:
//! false, true, true is on the save side but a probably overdone
SW_MOD()->CheckSpellChanges(false, true, true, 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;
bool bCreateHtml = FN_NEW_HTML_DOC == nWhich;
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 )
{
// for HTML there is only one filter!!
pFlt = SwIoSystem::GetFilterOfFormat(
OUString("HTML"),
SwWebDocShell::Factory().GetFilterContainer() );
nStrId = STR_LOAD_HTML_DOC;
}
else
{
// for Global-documents we now only offer the current one.
pFlt = SwGlobalDocShell::Factory().GetFilterContainer()->
GetFilter4Extension( OUString("odm") );
nStrId = STR_LOAD_GLOBAL_DOC;
}
if( pFlt )
{
uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
const String sWild = pFlt->GetWildcard().getGlob();
xFltMgr->appendFilter( pFlt->GetUIName(), sWild );
try
{
xFltMgr->setCurrentFilter( pFlt->GetUIName() ) ;
}
catch (const uno::Exception&)
{
bError = true;
}
}
if(!bError)
{
uno::Reference<XFilePickerControlAccess> xCtrlAcc(xFP, UNO_QUERY);
bool bOutline[MAXLEVEL] = {false};
const SwOutlineNodes& rOutlNds = pDoc->GetNodes().GetOutLineNds();
if( !rOutlNds.empty() )
{
int nLevel;
for(sal_uInt16 n = 0; n < rOutlNds.size(); ++n )
if( ( nLevel = rOutlNds[n]->GetTxtNode()->GetAttrOutlineLevel()) > 0 &&
! bOutline[nLevel-1] )
{
bOutline[nLevel-1] = true;
}
}
const sal_uInt16 nStyleCount = pDoc->GetTxtFmtColls()->size();
Sequence<OUString> 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 + OUString::number( i+1 );
}
OUString sStyle( SW_RESSTR(STR_FDLG_STYLE) );
for(sal_uInt16 i = 0; i < nStyleCount; ++i)
{
SwTxtFmtColl &rTxtColl = *(*pDoc->GetTxtFmtColls())[ i ];
if( !rTxtColl.IsDefault() && rTxtColl.IsAtDocNodeSet() )
{
pEntries[nIdx++] = sStyle + rTxtColl.GetName();
}
}
aListBoxEntries.realloc(nIdx);
sal_Int16 nSelect = 0;
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 (const Exception&)
{
OSL_FAIL("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;
sal_Int32 nColonPos = sTmpl.indexOf( sal_Unicode(':') );
OUString sPrefix = sTmpl.copy( 0L, nColonPos );
if ( sPrefix == "Style" )
{
aTemplateName = sTmpl.copy( 7L ); //get string behind "Style: "
}
else if ( sPrefix == "Outline" )
{
nTemplateOutlineLevel = ( sTmpl.copy( 15L )).toInt32(); //get string behind "Outline: Leve ";
bCreateByOutlineLevel = true;
}
if ( aFileName.Len() )
{
rReq.AppendItem( SfxStringItem( nWhich, aFileName ) );
if( aTemplateName.Len() )
rReq.AppendItem( SfxStringItem( SID_TEMPLATE_NAME, aTemplateName ) );
}
}
}
}
if( aFileName.Len() )
{
if( PrepareClose( sal_False ) )
{
SwWait aWait( *this, sal_True );
if ( bCreateByOutlineLevel )
{
bDone = bCreateHtml
? pDoc->GenerateHTMLDoc( aFileName, nTemplateOutlineLevel )
: pDoc->GenerateGlobalDoc( aFileName, nTemplateOutlineLevel );
}
else
{
const SwTxtFmtColl* pSplitColl = 0;
if ( aTemplateName.Len() )
pSplitColl = pDoc->FindTxtFmtCollByName(aTemplateName);
bDone = bCreateHtml
? pDoc->GenerateHTMLDoc( aFileName, pSplitColl )
: pDoc->GenerateGlobalDoc( aFileName, pSplitColl );
}
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 ))
{
OSL_ENSURE(pItem->ISA(SfxUInt16Item), "wrong Item");
sal_uInt16 nYear2K = ((SfxUInt16Item*)pItem)->GetValue();
// iterate over Views and put the State to FormShells
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<SwView*>( pViewShell );
}
pDoc->GetNumberFormatter(sal_True)->SetYear2000(nYear2K);
}
break;
case FN_OPEN_FILE:
{
SfxViewShell* pViewShell = GetView();
if (!pViewShell)
pViewShell = SfxViewShell::Current();
if (!pViewShell)
// Ok. I did my best.
break;
SfxStringItem aApp(SID_DOC_SERVICE, OUString("com.sun.star.text.TextDocument"));
SfxStringItem aTarget(SID_TARGETNAME, OUString("_blank"));
pViewShell->GetDispatcher()->Execute(
SID_OPENDOC, SFX_CALLMODE_API|SFX_CALLMODE_SYNCHRON, &aApp, &aTarget, 0L);
}
break;
default: OSL_FAIL("wrong Dispatcher");
}
}
// #FIXME - align with NEW event stuff ( if possible )
#if 0
void lcl_processCompatibleSfxHint( const uno::Reference< document::XVbaEventsHelper >& xVbaEventsHelper, const SfxHint& rHint )
{
if ( rHint.ISA( SfxEventHint ) )
{
uno::Sequence< uno::Any > aArgs;
sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId();
switch( nEventId )
{
case SFX_EVENT_CREATEDOC:
{
xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_DOCUMENT_NEW, aArgs );
break;
}
case SFX_EVENT_OPENDOC:
{
xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_DOCUMENT_OPEN, aArgs );
break;
}
default:
{
//do nothing
}
}
}
}
#endif
long SwDocShell::DdeGetData( const OUString& rItem, const OUString& rMimeType,
uno::Any & rValue )
{
return pDoc->GetData( rItem, rMimeType, rValue );
}
long SwDocShell::DdeSetData( const OUString& rItem, const OUString& rMimeType,
const uno::Any & rValue )
{
return pDoc->SetData( rItem, rMimeType, rValue );
}
::sfx2::SvLinkSource* SwDocShell::DdeCreateLinkSource( const OUString& rItem )
{
return pDoc->CreateLinkSource( rItem );
}
void SwDocShell::ReconnectDdeLink(SfxObjectShell& rServer)
{
if ( pDoc ) {
::sfx2::LinkManager& rLinkManager = pDoc->GetLinkManager();
rLinkManager.ReconnectDdeLink(rServer);
}
}
void SwDocShell::FillClass( SvGlobalName * pClassName,
sal_uInt32 * pClipFormat,
OUString * /*pAppName*/,
OUString * pLongUserName,
OUString * 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);
}
// #FIXME check with new Event handling
#if 0
uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper = pDoc->GetVbaEventsHelper();
if( xVbaEventsHelper.is() )
lcl_processCompatibleSfxHint( xVbaEventsHelper, rHint );
#endif
*pUserName = SW_RESSTR(STR_HUMAN_SWDOC_NAME);
}
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));
}
}
void SwDocShell::UpdateChildWindows()
{
// if necessary newly initialize Flddlg (i.e. for TYP_SETVAR)
if(!GetView())
return;
SfxViewFrame* pVFrame = GetView()->GetViewFrame();
SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame->
GetChildWindow( SwFldDlgWrapper::GetChildWindowId() );
if( pWrp )
pWrp->ReInitDlg( this );
// if necessary newly initialize RedlineDlg
SwRedlineAcceptChild *pRed = (SwRedlineAcceptChild*)pVFrame->
GetChildWindow( SwRedlineAcceptChild::GetChildWindowId() );
if( pRed )
pRed->ReInitDlg( this );
}
// #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();
// The HTTP-Header fields have to be removed, otherwise
// there are some from Meta-Tags dublicated or triplicated afterwards.
ClearHeaderAttributesForSourceViewHack();
#ifndef DISABLE_SCRIPTING
// The Document-Basic also bites the dust ...
// A EnterBasicCall is not needed here, because nothing is called and
// there can't be any Dok-Basic, that has not yet been loaded inside
// of an HTML document.
SvxHtmlOptions& rHtmlOptions = SvxHtmlOptions::Get();
//#59620# HasBasic() shows, that there already is a BasicManager at the DocShell.
// That was always generated in HTML-Import, when there are
// Macros in the source code.
if( rHtmlOptions.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 )
{
// Notify the IDE
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 );
// Only the modules are deleted from the standard-lib
if( nLibCount )
pBasicMan->RemoveLib( nLibCount, sal_True );
else
pBasic->Clear();
}
}
OSL_ENSURE( pBasicMan->GetLibCount() <= 1,
"Deleting Basics didn't work" );
}
}
#endif
sal_Bool bWasBrowseMode = pDoc->get(IDocumentSettingAccess::BROWSE_MODE);
RemoveLink();
// now also the UNO-Model has to be informed about the new Doc #51535#
uno::Reference<text::XTextDocument> 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();
// The HTML template still has to be set
SetHTMLTemplate( *GetDoc() ); //Styles from 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 );
// #i48748# - use class <SwReloadFromHtmlReader>, because
// the base URL has to be set to the filename of the document <rMedname>
// and not to the base URL of the temporary file <aMed> 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 );
}
// Take HTTP-Header-Attibutes over into the DokInfo again.
// The Base-URL doesn't matter here because TLX uses the one from the document
// for absolutization.
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 );
// Set filter:
String sFactory(OUString::createFromAscii(SwDocShell::Factory().GetShortName()));
SfxFilterMatcher aMatcher( sFactory );
// search for filter in WebDocShell, too
SfxMedium aMed( rURL, STREAM_STD_READ );
const SfxFilter* pFlt = 0;
aMatcher.DetectFilter( aMed, &pFlt, sal_False, sal_False );
if(!pFlt)
{
String sWebFactory(OUString::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 <SfxMedium.GetFilter().IsOwnFormat() resp. IsOwnTemplateFormat()
// does not work correct (e.g., MS Word 2007 XML Template),
// use workaround provided by MAV.
uno::Reference< embed::XStorage > xStorage = aMed.GetStorage();
if ( xStorage.is() )
{
// use <try-catch> on retrieving <MediaType> 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 OUString aMediaTypePropName( "MediaType" );
xProps->getPropertyValue( aMediaTypePropName );
bImport = true;
}
catch (const uno::Exception&)
{
bImport = false;
}
}
}
}
if ( bImport )
// <--
{
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;
}
int SwFindDocShell( SfxObjectShellRef& xDocSh,
SfxObjectShellLock& xLockRef,
const OUString& rFileName,
const OUString& rPasswd,
const OUString& rFilter,
sal_Int16 nVersion,
SwDocShell* pDestSh )
{
if ( rFileName.isEmpty() )
return 0;
// 1. Does the file already exist in the list of all Documents?
INetURLObject aTmpObj( rFileName );
aTmpObj.SetMark( OUString() );
// Iterate over the DocShell and get the ones with the name
TypeId aType( TYPE(SwDocShell) );
SfxObjectShell* pShell = pDestSh;
bool bFirst = 0 != pShell;
if( !bFirst )
// No DocShell passed, starting with the first from the DocShell list
pShell = SfxObjectShell::GetFirst( &aType );
while( pShell )
{
// We want this one
SfxMedium* pMed = pShell->GetMedium();
if( pMed && pMed->GetURLObject() == aTmpObj )
{
const SfxPoolItem* pItem;
if( ( SFX_ITEM_SET == pMed->GetItemSet()->GetItemState(
SID_VERSION, sal_False, &pItem ) )
? (nVersion == ((SfxInt16Item*)pItem)->GetValue())
: !nVersion )
{
// Found, thus return
xDocSh = pShell;
return 1;
}
}
if( bFirst )
{
bFirst = false;
pShell = SfxObjectShell::GetFirst( &aType );
}
else
pShell = SfxObjectShell::GetNext( *pShell, &aType );
}
// 2. Open the file ourselves
SfxMedium* pMed = new SfxMedium( aTmpObj.GetMainURL(
INetURLObject::NO_DECODE ), STREAM_READ );
if( INET_PROT_FILE == aTmpObj.GetProtocol() )
pMed->DownLoad(); // Touch the medium (download it)
const SfxFilter* pSfxFlt = 0;
if( !pMed->GetError() )
{
SfxFilterMatcher aMatcher( OUString::createFromAscii(SwDocShell::Factory().GetShortName()) );
// No Filter, so search for it. Else test if the one passed is a valid one
if( !rFilter.isEmpty() )
{
pSfxFlt = aMatcher.GetFilter4FilterName( rFilter );
}
if( nVersion )
pMed->GetItemSet()->Put( SfxInt16Item( SID_VERSION, nVersion ));
if( !rPasswd.isEmpty() )
pMed->GetItemSet()->Put( SfxStringItem( SID_PASSWORD, rPasswd ));
if( !pSfxFlt )
aMatcher.DetectFilter( *pMed, &pSfxFlt, sal_False, sal_False );
if( pSfxFlt )
{
// We cannot do anything without a Filter
pMed->SetFilter( pSfxFlt );
// If the new shell is created, SfxObjectShellLock should be used to let it be closed later for sure
xLockRef = new SwDocShell( SFX_CREATE_MODE_INTERNAL );
xDocSh = (SfxObjectShell*)xLockRef;
if( xDocSh->DoLoad( pMed ) )
return 2;
}
}
if( !xDocSh.Is() ) // Medium still needs to be deleted
delete pMed;
return 0;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */