blob: 7bfe9e60ce51b77a6aba3da982e9e405f181fbb7 [file] [log] [blame]
/**************************************************************
*
* 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 <hintids.hxx>
#include <tools/urlobj.hxx>
#include <tools/debug.hxx>
#include <tools/link.hxx>
#define _SVSTDARR_STRINGSDTOR
#include <svl/svstdarr.hxx>
#include <svl/urihelper.hxx>
#include <unotools/undoopt.hxx>
#include <unotools/pathoptions.hxx>
#include <svtools/accessibilityoptions.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/event.hxx>
#include <sfx2/objitem.hxx>
#include <svx/dataaccessdescriptor.hxx>
#include <svl/srchitem.hxx>
#include <svtools/colorcfg.hxx>
#include <svl/eitem.hxx>
#include <svl/whiter.hxx>
#include <svl/isethint.hxx>
#include <svx/hyprlink.hxx>
#include <sfx2/request.hxx>
#include <sfx2/fcontnr.hxx>
#include <svl/stritem.hxx>
#include <svl/ctloptions.hxx>
#include <unotools/useroptions.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/wrkwin.hxx>
#include <svx/insctrl.hxx>
#include <svx/selctrl.hxx>
#include <com/sun/star/document/UpdateDocMode.hpp>
#include <sfx2/docfile.hxx>
#include <svx/xmlsecctrl.hxx>
#include <navicfg.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/app.hxx>
#include <view.hxx>
#include <pview.hxx>
#include <srcview.hxx>
#include <wrtsh.hxx>
#include <docsh.hxx>
#include <cmdid.h> // Funktion-Ids
#include <initui.hxx>
#include <uitool.hxx>
#include <swmodule.hxx>
#include <wdocsh.hxx>
#include <wview.hxx>
#include <usrpref.hxx>
#include <gloslst.hxx> // SwGlossaryList
#include <glosdoc.hxx> // SwGlossaryList
#include <doc.hxx>
#include <IDocumentUndoRedo.hxx>
#include <cfgitems.hxx>
#include <prtopt.hxx>
#include <modcfg.hxx>
#include <globals.h> // globale Konstanten z.B.
#include <app.hrc>
#include <fontcfg.hxx>
#include <barcfg.hxx>
#include <uinums.hxx>
#include <dbconfig.hxx>
#include <mmconfigitem.hxx>
#include <mailmergechildwindow.hxx>
#include <linguistic/lngprops.hxx>
#include <editeng/unolingu.hxx>
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#include <com/sun/star/beans/XFastPropertySet.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/beans/XPropertyStateChangeListener.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/beans/XPropertyAccess.hpp>
#include <com/sun/star/beans/XPropertyContainer.hpp>
#include <com/sun/star/container/XChild.hpp>
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdbc/XDataSource.hpp>
#include <swabstdlg.hxx>
#include <vcl/status.hxx>
#include "salhelper/simplereferenceobject.hxx"
#include "rtl/ref.hxx"
#include <unomid.h>
using namespace ::com::sun::star;
/*--------------------------------------------------------------------
Beschreibung: Slotmaps fuer Methoden der Applikation
--------------------------------------------------------------------*/
// hier werden die SlotID's included
// siehe Idl-File
//
#define SwModule
#define ViewSettings
#define WebViewSettings
#define PrintSettings
#define _ExecAddress ExecOther
#define _StateAddress StateOther
#include <sfx2/msg.hxx>
#include "swslots.hxx"
#include <cfgid.h>
#include <shells.hrc>
SFX_IMPL_INTERFACE( SwModule, SfxModule, SW_RES(RID_SW_NAME) )
{
SFX_CHILDWINDOW_REGISTRATION(SvxHyperlinkDlgWrapper::GetChildWindowId());
SFX_STATUSBAR_REGISTRATION(SW_RES(CFG_STATUSBAR));
SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION |
SFX_VISIBILITY_DESKTOP | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_CLIENT | SFX_VISIBILITY_VIEWER,
SW_RES(RID_MODULE_TOOLBOX) );
}
/*--------------------------------------------------------------------
Beschreibung: Andere States
--------------------------------------------------------------------*/
void SwModule::StateOther(SfxItemSet &rSet)
{
SfxWhichIter aIter(rSet);
sal_uInt16 nWhich = aIter.FirstWhich();
SwView* pActView = ::GetActiveView();
sal_Bool bWebView = 0 != PTR_CAST(SwWebView, pActView);
while(nWhich)
{
switch(nWhich)
{
case FN_BUSINESS_CARD:
case FN_LABEL:
case FN_ENVELOP:
{
sal_Bool bDisable = sal_False;
SfxViewShell* pCurrView = SfxViewShell::Current();
if( !pCurrView || (pCurrView && !pCurrView->ISA(SwView)) )
bDisable = sal_True;
SwDocShell *pDocSh = (SwDocShell*) SfxObjectShell::Current();
if ( bDisable ||
(pDocSh && (pDocSh->IsReadOnly() ||
pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)) )
rSet.DisableItem( nWhich );
}
break;
case FN_XFORMS_INIT:
// slot is always active!
break;
case FN_EDIT_FORMULA:
{
SwWrtShell* pSh = 0;
int nSelection = 0;
if( pActView )
pSh = &pActView->GetWrtShell();
if( pSh )
nSelection = pSh->GetSelectionType();
if( (pSh && pSh->HasSelection()) ||
!(nSelection & (nsSelectionType::SEL_TXT | nsSelectionType::SEL_TBL)))
rSet.DisableItem(nWhich);
}
break;
case SID_ATTR_METRIC:
rSet.Put( SfxUInt16Item( SID_ATTR_METRIC, static_cast< sal_uInt16 >(::GetDfltMetric(bWebView))));
break;
case FN_SET_MODOPT_TBLNUMFMT:
rSet.Put( SfxBoolItem( nWhich, pModuleConfig->
IsInsTblFormatNum( bWebView )));
break;
default:
DBG_ERROR("::StateOther: default");
}
nWhich = aIter.NextWhich();
}
}
/*-- 06.04.2004 15:21:43---------------------------------------------------
-----------------------------------------------------------------------*/
SwView* lcl_LoadDoc(SwView* pView, const String& rURL)
{
SwView* pNewView = 0;
if(rURL.Len())
{
SfxStringItem aURL(SID_FILE_NAME, rURL);
SfxStringItem aTargetFrameName( SID_TARGETNAME, String::CreateFromAscii("_blank") );
SfxBoolItem aHidden( SID_HIDDEN, sal_True );
SfxStringItem aReferer(SID_REFERER, pView->GetDocShell()->GetTitle());
SfxObjectItem* pItem = (SfxObjectItem*)pView->GetViewFrame()->GetDispatcher()->
Execute(SID_OPENDOC, SFX_CALLMODE_SYNCHRON,
&aURL, &aHidden, &aReferer, &aTargetFrameName, 0L);
SfxShell* pShell = pItem ? pItem->GetShell() : 0;
if(pShell)
{
SfxViewShell* pViewShell = pShell->GetViewShell();
if(pViewShell)
{
if( pViewShell->ISA(SwView) )
{
pNewView = PTR_CAST(SwView,pViewShell);
pNewView->GetViewFrame()->GetFrame().Appear();
}
else
{
pViewShell->GetViewFrame()->DoClose();
}
}
}
}
else
{
SfxStringItem aFactory(SID_NEWDOCDIRECT, SwDocShell::Factory().GetFilterContainer()->GetName());
const SfxFrameItem* pItem = (SfxFrameItem*)
pView->GetViewFrame()->GetDispatcher()->Execute(SID_NEWDOCDIRECT,
SFX_CALLMODE_SYNCHRON, &aFactory, 0L);
SfxFrame* pFrm = pItem ? pItem->GetFrame() : 0;
SfxViewFrame* pFrame = pFrm ? pFrm->GetCurrentViewFrame() : 0;
pNewView = pFrame ? PTR_CAST(SwView, pFrame->GetViewShell()) : 0;
}
return pNewView;
}
/*--------------------------------------------------------------------
Beschreibung: Felddialog starten
--------------------------------------------------------------------*/
void NewXForms( SfxRequest& rReq ); // implementation: below
namespace
{
class SwMailMergeWizardExecutor : public salhelper::SimpleReferenceObject
{
SwView* m_pView; // never owner
SwView* m_pView2Close; // never owner
SwMailMergeConfigItem* m_pMMConfig; // sometimes owner
AbstractMailMergeWizard* m_pWizard; // always owner
DECL_LINK( EndDialogHdl, AbstractMailMergeWizard* );
DECL_LINK( DestroyDialogHdl, AbstractMailMergeWizard* );
DECL_LINK( DestroyWizardHdl, AbstractMailMergeWizard* );
DECL_LINK( CancelHdl, AbstractMailMergeWizard* );
DECL_LINK( CloseFrameHdl, AbstractMailMergeWizard* );
void ExecutionFinished( bool bDeleteConfigItem );
void ExecuteWizard();
public:
SwMailMergeWizardExecutor();
~SwMailMergeWizardExecutor();
void ExecuteMailMergeWizard( const SfxItemSet * pArgs );
};
SwMailMergeWizardExecutor::SwMailMergeWizardExecutor()
: m_pView( 0 ),
m_pView2Close( NULL ),
m_pMMConfig( 0 ),
m_pWizard( 0 )
{
}
SwMailMergeWizardExecutor::~SwMailMergeWizardExecutor()
{
DBG_ASSERT( m_pWizard == 0, "SwMailMergeWizardExecutor: m_pWizard must be Null!" );
DBG_ASSERT( m_pMMConfig == 0, "SwMailMergeWizardExecutor: m_pMMConfig must be Null!" );
}
void SwMailMergeWizardExecutor::ExecuteMailMergeWizard( const SfxItemSet * pArgs )
{
if ( m_pView )
{
DBG_ERROR( "SwMailMergeWizardExecutor::ExecuteMailMergeWizard: Already executing the wizard!" );
return;
}
m_pView = ::GetActiveView(); // not owner!
DBG_ASSERT(m_pView, "no current view?");
if(m_pView)
{
// keep self alive until done.
acquire();
// if called from the child window - get the config item and close the ChildWindow, then restore
// the wizard
SwMailMergeChildWindow* pChildWin =
static_cast<SwMailMergeChildWindow*>(m_pView->GetViewFrame()->GetChildWindow(FN_MAILMERGE_CHILDWINDOW));
bool bRestoreWizard = false;
sal_uInt16 nRestartPage = 0;
if(pChildWin && pChildWin->IsVisible())
{
m_pMMConfig = m_pView->GetMailMergeConfigItem();
nRestartPage = m_pView->GetMailMergeRestartPage();
if(m_pView->IsMailMergeSourceView())
m_pMMConfig->SetSourceView( m_pView );
m_pView->SetMailMergeConfigItem(0, 0, sal_True);
SfxViewFrame* pViewFrame = m_pView->GetViewFrame();
pViewFrame->ShowChildWindow(FN_MAILMERGE_CHILDWINDOW, sal_False);
DBG_ASSERT(m_pMMConfig, "no MailMergeConfigItem available");
bRestoreWizard = true;
}
// to make it bullet proof ;-)
if(!m_pMMConfig)
{
m_pMMConfig = new SwMailMergeConfigItem;
m_pMMConfig->SetSourceView(m_pView);
//set the first used database as default source on the config item
const SfxPoolItem* pItem = 0;
if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(
FN_PARAM_DATABASE_PROPERTIES, sal_False, &pItem))
{
//mailmerge has been called from the database beamer
uno::Sequence< beans::PropertyValue> aDBValues;
if(static_cast<const SfxUsrAnyItem*>(pItem)->GetValue() >>= aDBValues)
{
SwDBData aDBData;
svx::ODataAccessDescriptor aDescriptor(aDBValues);
aDescriptor[svx::daDataSource] >>= aDBData.sDataSource;
aDescriptor[svx::daCommand] >>= aDBData.sCommand;
aDescriptor[svx::daCommandType] >>= aDBData.nCommandType;
uno::Sequence< uno::Any > aSelection;
uno::Reference< sdbc::XConnection> xConnection;
uno::Reference< sdbc::XDataSource> xSource;
uno::Reference< sdbcx::XColumnsSupplier> xColumnsSupplier;
if ( aDescriptor.has(svx::daSelection) )
aDescriptor[svx::daSelection] >>= aSelection;
if ( aDescriptor.has(svx::daConnection) )
aDescriptor[svx::daConnection] >>= xConnection;
uno::Reference<container::XChild> xChild(xConnection, uno::UNO_QUERY);
if(xChild.is())
xSource = uno::Reference<sdbc::XDataSource>(
xChild->getParent(), uno::UNO_QUERY);
m_pMMConfig->SetCurrentConnection(
xSource, SharedConnection( xConnection, SharedConnection::NoTakeOwnership ),
xColumnsSupplier, aDBData);
}
}
else
{
SvStringsDtor aDBNameList(5, 1);
SvStringsDtor aAllDBNames(5, 5);
m_pView->GetWrtShell().GetAllUsedDB( aDBNameList, &aAllDBNames );
if(aDBNameList.Count())
{
String sDBName = *aDBNameList[0];
SwDBData aDBData;
aDBData.sDataSource = sDBName.GetToken(0, DB_DELIM);
aDBData.sCommand = sDBName.GetToken(1, DB_DELIM);
aDBData.nCommandType = sDBName.GetToken(2, DB_DELIM ).ToInt32();
//set the currently used database for the wizard
m_pMMConfig->SetCurrentDBData( aDBData );
}
}
}
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
m_pWizard = pFact->CreateMailMergeWizard(*m_pView, *m_pMMConfig);
if(bRestoreWizard)
{
m_pWizard->ShowPage( nRestartPage );
}
ExecuteWizard();
}
}
void SwMailMergeWizardExecutor::ExecutionFinished( bool bDeleteConfigItem )
{
m_pMMConfig->Commit();
if ( bDeleteConfigItem ) // owner?
delete m_pMMConfig;
m_pMMConfig = 0;
// release/destroy asynchronously
Application::PostUserEvent( LINK( this, SwMailMergeWizardExecutor, DestroyDialogHdl ) );
}
void SwMailMergeWizardExecutor::ExecuteWizard()
{
m_pWizard->StartExecuteModal(
LINK( this, SwMailMergeWizardExecutor, EndDialogHdl ) );
}
#if OSL_DEBUG_LEVEL > 1
IMPL_LINK( SwMailMergeWizardExecutor, EndDialogHdl, AbstractMailMergeWizard*, pDialog )
#else
IMPL_LINK( SwMailMergeWizardExecutor, EndDialogHdl, AbstractMailMergeWizard*, EMPTYARG )
#endif
{
#if OSL_DEBUG_LEVEL > 1
DBG_ASSERT( pDialog == m_pWizard, "wrong dialog passed to EndDialogHdl!" );
(void) pDialog;
#endif
long nRet = m_pWizard->GetResult();
sal_uInt16 nRestartPage = m_pWizard->GetRestartPage();
switch ( nRet )
{
case RET_LOAD_DOC:
{
SwView* pNewView = lcl_LoadDoc(m_pView, m_pWizard->GetReloadDocument());
// destroy wizard asynchronously
Application::PostUserEvent(
LINK( this, SwMailMergeWizardExecutor, DestroyWizardHdl ), m_pWizard );
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
if(pNewView)
{
m_pView = pNewView;
m_pMMConfig->DocumentReloaded();
//new source view!
m_pMMConfig->SetSourceView( m_pView );
m_pWizard = pFact->CreateMailMergeWizard(*m_pView, *m_pMMConfig);
m_pWizard->ShowPage( nRestartPage );
}
else
{
m_pWizard = pFact->CreateMailMergeWizard(*m_pView, *m_pMMConfig);
}
// execute the wizard again
ExecuteWizard();
break;
}
case RET_TARGET_CREATED:
{
SwView* pTargetView = m_pMMConfig->GetTargetView();
uno::Reference< frame::XFrame > xFrame =
m_pView->GetViewFrame()->GetFrame().GetFrameInterface();
xFrame->getContainerWindow()->setVisible(sal_False);
DBG_ASSERT(pTargetView, "No target view has been created");
if(pTargetView)
{
// destroy wizard asynchronously
Application::PostUserEvent(
LINK( this, SwMailMergeWizardExecutor, DestroyWizardHdl ), m_pWizard );
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
m_pWizard = pFact->CreateMailMergeWizard(*pTargetView, *m_pMMConfig);
m_pWizard->ShowPage( nRestartPage );
// execute the wizard again
ExecuteWizard();
}
else
{
//should not happen - just in case no target view has been created
ExecutionFinished( true );
}
break;
}
case RET_EDIT_DOC:
case RET_EDIT_RESULT_DOC:
{
//create a non-modal dialog that allows to return to the wizard
//the ConfigItem ownership moves to this dialog
bool bResult = nRet == RET_EDIT_RESULT_DOC && m_pMMConfig->GetTargetView();
SwView* pTempView = bResult ? m_pMMConfig->GetTargetView() : m_pMMConfig->GetSourceView();
pTempView->SetMailMergeConfigItem(m_pMMConfig, m_pWizard->GetRestartPage(), !bResult);
SfxViewFrame* pViewFrame = pTempView->GetViewFrame();
pViewFrame->GetDispatcher()->Execute(
FN_MAILMERGE_CHILDWINDOW, SFX_CALLMODE_SYNCHRON);
ExecutionFinished( false );
break;
}
case RET_REMOVE_TARGET:
{
SwView* pTargetView = m_pMMConfig->GetTargetView();
SwView* pSourceView = m_pMMConfig->GetSourceView();
DBG_ASSERT(pTargetView && pSourceView, "source or target view not available" );
if(pTargetView && pSourceView)
{
m_pView2Close = pTargetView;
pTargetView->GetViewFrame()->GetTopViewFrame()->GetWindow().Hide();
pSourceView->GetViewFrame()->GetFrame().AppearWithUpdate();
// the current view has be be set when the target is destroyed
m_pView = pSourceView;
m_pMMConfig->SetTargetView(0);
// destroy wizard asynchronously
Application::PostUserEvent(
LINK( this, SwMailMergeWizardExecutor, CloseFrameHdl ), m_pWizard );
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
m_pWizard = pFact->CreateMailMergeWizard(*pSourceView, *m_pMMConfig);
m_pWizard->ShowPage( nRestartPage );
// execute the wizard again
ExecuteWizard();
}
else
{
//should not happen - just in case no target view has been created
ExecutionFinished( true );
}
break;
}
case RET_CANCEL:
{
// close frame and destroy wizard asynchronously
Application::PostUserEvent(
LINK( this, SwMailMergeWizardExecutor, CancelHdl ), m_pWizard );
break;
}
default: //finish
{
SwView* pSourceView = m_pMMConfig->GetSourceView();
if(pSourceView)
{
SwDocShell* pDocShell = pSourceView->GetDocShell();
if(pDocShell->HasName() && !pDocShell->IsModified())
m_pMMConfig->GetSourceView()->GetViewFrame()->DoClose();
else
m_pMMConfig->GetSourceView()->GetViewFrame()->GetFrame().Appear();
}
ExecutionFinished( true );
break;
}
} // switch
return 0L;
}
IMPL_LINK( SwMailMergeWizardExecutor, DestroyDialogHdl, AbstractMailMergeWizard*, EMPTYARG )
{
delete m_pWizard;
m_pWizard = 0;
release();
return 0L;
}
IMPL_LINK( SwMailMergeWizardExecutor, DestroyWizardHdl, AbstractMailMergeWizard*, pDialog )
{
delete pDialog;
return 0L;
}
IMPL_LINK( SwMailMergeWizardExecutor, CancelHdl, AbstractMailMergeWizard*, EMPTYARG )
{
if(m_pMMConfig->GetTargetView())
{
m_pMMConfig->GetTargetView()->GetViewFrame()->DoClose();
m_pMMConfig->SetTargetView(0);
}
if(m_pMMConfig->GetSourceView())
m_pMMConfig->GetSourceView()->GetViewFrame()->GetFrame().AppearWithUpdate();
m_pMMConfig->Commit();
delete m_pMMConfig;
m_pMMConfig = 0;
// m_pWizard already deleted by closing the target view
m_pWizard = 0;
release();
return 0L;
}
IMPL_LINK( SwMailMergeWizardExecutor, CloseFrameHdl, AbstractMailMergeWizard*, EMPTYARG )
{
if ( m_pView2Close )
{
m_pView2Close->GetViewFrame()->DoClose();
m_pView2Close = NULL;
}
return 0L;
}
} // namespace
void SwModule::ExecOther(SfxRequest& rReq)
{
const SfxItemSet *pArgs = rReq.GetArgs();
const SfxPoolItem* pItem = 0;
sal_uInt16 nWhich = rReq.GetSlot();
switch (nWhich)
{
case FN_ENVELOP:
InsertEnv( rReq );
break;
case FN_BUSINESS_CARD:
case FN_LABEL:
InsertLab(rReq, nWhich == FN_LABEL);
break;
case FN_XFORMS_INIT:
NewXForms( rReq );
break;
case SID_ATTR_METRIC:
if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(nWhich, sal_False, &pItem))
{
FieldUnit eUnit = (FieldUnit)((const SfxUInt16Item*)pItem)->GetValue();
switch( eUnit )
{
case FUNIT_MM:
case FUNIT_CM:
case FUNIT_INCH:
case FUNIT_PICA:
case FUNIT_POINT:
{
SwView* pActView = ::GetActiveView();
sal_Bool bWebView = 0 != PTR_CAST(SwWebView, pActView);
::SetDfltMetric(eUnit, bWebView);
}
break;
default:;//prevent warning
}
}
break;
case FN_SET_MODOPT_TBLNUMFMT:
{
sal_Bool bWebView = 0 != PTR_CAST(SwWebView, ::GetActiveView() ),
bSet;
if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(
nWhich, sal_False, &pItem ))
bSet = ((SfxBoolItem*)pItem)->GetValue();
else
bSet = !pModuleConfig->IsInsTblFormatNum( bWebView );
pModuleConfig->SetInsTblFormatNum( bWebView, bSet );
}
break;
case FN_MAILMERGE_WIZARD:
{
rtl::Reference< SwMailMergeWizardExecutor > xEx( new SwMailMergeWizardExecutor );
xEx->ExecuteMailMergeWizard( pArgs );
}
break;
}
}
/*--------------------------------------------------------------------
Beschreibung: Notifies abfangen
--------------------------------------------------------------------*/
// Hint abfangen fuer DocInfo
void SwModule::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
{
if( rHint.ISA( SfxEventHint ) )
{
SfxEventHint& rEvHint = (SfxEventHint&) rHint;
SwDocShell* pDocSh = PTR_CAST( SwDocShell, rEvHint.GetObjShell() );
if( pDocSh )
{
SwWrtShell* pWrtSh = pDocSh ? pDocSh->GetWrtShell() : 0;
switch( rEvHint.GetEventId() )
{
case SFX_EVENT_LOADFINISHED:
OSL_ASSERT(!pWrtSh);
// if it is a new document created from a template,
// update fixed fields
if (pDocSh->GetMedium())
{
SFX_ITEMSET_ARG( pDocSh->GetMedium()->GetItemSet(),
pTemplateItem, SfxBoolItem,
SID_TEMPLATE, sal_False);
if (pTemplateItem && pTemplateItem->GetValue())
{
pDocSh->GetDoc()->SetFixFields(false, 0);
}
}
break;
case SFX_EVENT_CREATEDOC:
if( pWrtSh )
{
SFX_ITEMSET_ARG( pDocSh->GetMedium()->GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False);
sal_Bool bUpdateFields = sal_True;
if( pUpdateDocItem && pUpdateDocItem->GetValue() == document::UpdateDocMode::NO_UPDATE)
bUpdateFields = sal_False;
if(bUpdateFields)
{
pWrtSh->UpdateInputFlds();
// Sind Datenbankfelder enthalten?
// Erstmal alle verwendeten Datenbanken holen
SwDoc *pDoc = pDocSh->GetDoc();
SvStringsDtor aDBNameList;
pDoc->GetAllUsedDB( aDBNameList );
sal_uInt16 nCount = aDBNameList.Count();
if (nCount)
{ // Datenbankbeamer oeffnen
ShowDBObj(pWrtSh->GetView(), pDoc->GetDBData());
}
}
}
break;
}
}
}
else if(rHint.ISA(SfxItemSetHint))
{
if( SFX_ITEM_SET == ((SfxItemSetHint&)rHint).GetItemSet().GetItemState(SID_ATTR_PATHNAME))
{
::GetGlossaries()->UpdateGlosPath( sal_False );
SwGlossaryList* pList = ::GetGlossaryList();
if(pList->IsActive())
pList->Update();
}
}
else if(rHint.ISA(SfxSimpleHint))
{
sal_uInt16 nHintId = ((SfxSimpleHint&)rHint).GetId();
if(SFX_HINT_DEINITIALIZING == nHintId)
{
DELETEZ(pWebUsrPref);
DELETEZ(pUsrPref) ;
DELETEZ(pModuleConfig);
DELETEZ(pPrtOpt) ;
DELETEZ(pWebPrtOpt) ;
DELETEZ(pChapterNumRules);
DELETEZ(pStdFontConfig) ;
DELETEZ(pNavigationConfig) ;
DELETEZ(pToolbarConfig) ;
DELETEZ(pWebToolbarConfig) ;
DELETEZ(pAuthorNames) ;
DELETEZ(pDBConfig);
if( pColorConfig )
{
pColorConfig->RemoveListener(this);
DELETEZ(pColorConfig);
}
if( pAccessibilityOptions )
{
pAccessibilityOptions->RemoveListener(this);
DELETEZ(pAccessibilityOptions);
}
if( pCTLOptions )
{
pCTLOptions->RemoveListener(this);
DELETEZ(pCTLOptions);
}
if( pUserOptions )
{
pUserOptions->RemoveListener(this);
DELETEZ(pUserOptions);
}
if( pUndoOptions )
{
pUndoOptions->RemoveListener(this);
DELETEZ(pUndoOptions);
}
}
}
}
void SwModule::ConfigurationChanged( utl::ConfigurationBroadcaster* pBrdCst, sal_uInt32 )
{
if( pBrdCst == pUserOptions )
{
bAuthorInitialised = sal_False;
}
else if( pBrdCst == pUndoOptions )
{
sal_Int32 const nNew = GetUndoOptions().GetUndoCount();
bool const bUndo = (nNew != 0);
// switch Undo for all DocShells
TypeId aType(TYPE(SwDocShell));
SwDocShell * pDocShell =
static_cast<SwDocShell *>(SfxObjectShell::GetFirst(&aType));
while (pDocShell)
{
pDocShell->GetDoc()->GetIDocumentUndoRedo().DoUndo(bUndo);
pDocShell = static_cast<SwDocShell *>(
SfxObjectShell::GetNext(*pDocShell, &aType));
}
}
else if ( pBrdCst == pColorConfig || pBrdCst == pAccessibilityOptions )
{
sal_Bool bAccessibility = sal_False;
if( pBrdCst == pColorConfig )
SwViewOption::ApplyColorConfigValues(*pColorConfig);
else
bAccessibility = sal_True;
//invalidate all edit windows
const TypeId aSwViewTypeId = TYPE(SwView);
const TypeId aSwPreViewTypeId = TYPE(SwPagePreView);
const TypeId aSwSrcViewTypeId = TYPE(SwSrcView);
SfxViewShell* pViewShell = SfxViewShell::GetFirst();
while(pViewShell)
{
if(pViewShell->GetWindow())
{
if((pViewShell->IsA(aSwViewTypeId) ||
pViewShell->IsA(aSwPreViewTypeId) ||
pViewShell->IsA(aSwSrcViewTypeId)))
{
if(bAccessibility)
{
if(pViewShell->IsA(aSwViewTypeId))
((SwView*)pViewShell)->ApplyAccessiblityOptions(*pAccessibilityOptions);
else if(pViewShell->IsA(aSwPreViewTypeId))
((SwPagePreView*)pViewShell)->ApplyAccessiblityOptions(*pAccessibilityOptions);
}
pViewShell->GetWindow()->Invalidate();
}
}
pViewShell = SfxViewShell::GetNext( *pViewShell );
}
}
else if( pBrdCst == pCTLOptions )
{
const SfxObjectShell* pObjSh = SfxObjectShell::GetFirst();
while( pObjSh )
{
if( pObjSh->IsA(TYPE(SwDocShell)) )
{
const SwDoc* pDoc = ((SwDocShell*)pObjSh)->GetDoc();
ViewShell* pVSh = 0;
pDoc->GetEditShell( &pVSh );
if ( pVSh )
pVSh->ChgNumberDigits();
}
pObjSh = SfxObjectShell::GetNext(*pObjSh);
}
}
}
/* -----------------------------20.02.01 12:43--------------------------------
---------------------------------------------------------------------------*/
SwDBConfig* SwModule::GetDBConfig()
{
if(!pDBConfig)
pDBConfig = new SwDBConfig;
return pDBConfig;
}
/* -----------------------------11.04.2002 15:27------------------------------
---------------------------------------------------------------------------*/
svtools::ColorConfig& SwModule::GetColorConfig()
{
if(!pColorConfig)
{
pColorConfig = new svtools::ColorConfig;
SwViewOption::ApplyColorConfigValues(*pColorConfig);
pColorConfig->AddListener(this);
}
return *pColorConfig;
}
/* -----------------------------06.05.2002 09:42------------------------------
---------------------------------------------------------------------------*/
SvtAccessibilityOptions& SwModule::GetAccessibilityOptions()
{
if(!pAccessibilityOptions)
{
pAccessibilityOptions = new SvtAccessibilityOptions;
pAccessibilityOptions->AddListener(this);
}
return *pAccessibilityOptions;
}
/* -----------------06.05.2003 14:52-----------------
--------------------------------------------------*/
SvtCTLOptions& SwModule::GetCTLOptions()
{
if(!pCTLOptions)
{
pCTLOptions = new SvtCTLOptions;
pCTLOptions->AddListener(this);
}
return *pCTLOptions;
}
/* -----------------07.07.2003 09:31-----------------
--------------------------------------------------*/
SvtUserOptions& SwModule::GetUserOptions()
{
if(!pUserOptions)
{
pUserOptions = new SvtUserOptions;
pUserOptions->AddListener(this);
}
return *pUserOptions;
}
/* -----------------18.07.2003 13:31-----------------
--------------------------------------------------*/
SvtUndoOptions& SwModule::GetUndoOptions()
{
if(!pUndoOptions)
{
pUndoOptions = new SvtUndoOptions;
pUndoOptions->AddListener(this);
}
return *pUndoOptions;
}
/*-----------------30.01.97 08.30-------------------
--------------------------------------------------*/
const SwMasterUsrPref *SwModule::GetUsrPref(sal_Bool bWeb) const
{
SwModule* pNonConstModule = (SwModule*)this;
if(bWeb && !pWebUsrPref)
{
// im Load der SwMasterUsrPref wird der SpellChecker gebraucht, dort darf
// er aber nicht angelegt werden #58256#
pNonConstModule->pWebUsrPref = new SwMasterUsrPref(sal_True);
}
else if(!bWeb && !pUsrPref)
{
pNonConstModule->pUsrPref = new SwMasterUsrPref(sal_False);
}
return bWeb ? pWebUsrPref : pUsrPref;
}
void NewXForms( SfxRequest& rReq )
{
// copied & excerpted from SwModule::InsertLab(..)
// create new document
SfxObjectShellLock xDocSh( new SwDocShell( SFX_CREATE_MODE_STANDARD) );
xDocSh->DoInitNew( 0 );
// initialize XForms
static_cast<SwDocShell*>( &xDocSh )->GetDoc()->initXForms( true );
// load document into frame
SfxViewFrame::DisplayNewDocument( *xDocSh, rReq );
// set return value
rReq.SetReturnValue( SfxVoidItem( rReq.GetSlot() ) );
}