/**************************************************************
 * 
 * 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>
#ifndef _SWERROR_H
#include <swerror.h>
#endif
#include <vcl/wrkwin.hxx>
#include <vcl/graph.hxx>
#include <svx/galbrws.hxx>
#include <svx/svdobj.hxx>
#include <svtools/ehdl.hxx>
#include <svx/fntszctl.hxx>
#include <svx/fntctl.hxx>
#include <svx/SmartTagCtl.hxx>
#include <svx/pszctrl.hxx>
#include <svx/insctrl.hxx>
#include <svx/selctrl.hxx>
#include <svx/linectrl.hxx>
#include <svx/tbxctl.hxx>			//z-Zt falscher includeschutz!
#include <svx/fillctrl.hxx>
#include <svx/tbcontrl.hxx>
#include <svx/verttexttbxctrl.hxx>
#include <svx/formatpaintbrushctrl.hxx>
#include <svx/contdlg.hxx>
#include <svx/layctrl.hxx>
#include <svx/fontwork.hxx>
#include <SwSpellDialogChildWindow.hxx>
#include <svx/tbxalign.hxx>
#include <svx/grafctrl.hxx>
#include <svx/tbxcolor.hxx>
#include <svx/clipboardctl.hxx>
#include <svx/lboxctrl.hxx>
#include <svx/hyprlink.hxx>
#include <svx/tbxcustomshapes.hxx>
#include <svx/imapdlg.hxx>
#include <svx/srchdlg.hxx>
#include <svx/hyperdlg.hxx>
#include <svx/extrusioncolorcontrol.hxx>
#include <svx/fontworkgallery.hxx>
#include <com/sun/star/scanner/XScannerManager.hpp>
#include <com/sun/star/container/XSet.hpp>
#include <comphelper/processfactory.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <swmodule.hxx>
#include <swevent.hxx>
#include <swacorr.hxx>
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#include <dobjfac.hxx>
#include <init.hxx>
#include <pview.hxx>
#include <wview.hxx>
#include <wdocsh.hxx>
#include <globdoc.hxx>
#ifndef _SRCVIEW_HXX //autogen
#include <srcview.hxx>
#endif
#include <glshell.hxx>
#include <tabsh.hxx>
#include <listsh.hxx>
#include <grfsh.hxx>
#include <mediash.hxx>
#include <olesh.hxx>
#include <drawsh.hxx>
#include <wformsh.hxx>
#include <drwtxtsh.hxx>
#include <beziersh.hxx>
#include <wtextsh.hxx>
#include <wfrmsh.hxx>
#ifndef _DRFORMSH_HXX
#include <drformsh.hxx>
#endif
#ifndef _WGRFSH_HXX
#include <wgrfsh.hxx>
#endif
#ifndef _WOLESH_HXX
#include <wolesh.hxx>
#endif
#ifndef _WLISTSH_HXX
#include <wlistsh.hxx>
#endif
#ifndef _WTABSH_HXX
#include <wtabsh.hxx>
#endif
#include <navipi.hxx>
#include <chartins.hxx>
#include <inputwin.hxx>
#include <usrpref.hxx>
#include <uinums.hxx>
#include <prtopt.hxx>
#include <bookctrl.hxx>
#include <tmplctrl.hxx>
#include <viewlayoutctrl.hxx>
#include <svx/zoomsliderctrl.hxx>
#include <tblctrl.hxx>
#include <zoomctrl.hxx>
#include <workctrl.hxx>
#include <tbxanchr.hxx>
#include <fldwrap.hxx>
#ifndef _REDLNDLG_HXX
#include <redlndlg.hxx>
#endif
#ifndef _SYNCBTN_HXX
#include <syncbtn.hxx>
#endif
#include <mailmergechildwindow.hxx>
#include <modcfg.hxx>
#include <fontcfg.hxx>
#include <sfx2/sidebar/SidebarChildWindow.hxx>
#include <sfx2/taskpane.hxx>
#include <sfx2/evntconf.hxx>
#include <sfx2/appuno.hxx>
#include <swatrset.hxx>
#include <idxmrk.hxx>
#include <dlelstnr.hxx>
#ifndef _BARCFG_HXX
#include <barcfg.hxx>
#endif
#include <svx/rubydialog.hxx>
// OD 14.02.2003 #107424#
#include <svtools/colorcfg.hxx>

#include <editeng/acorrcfg.hxx>
#include <unotools/moduleoptions.hxx>

#ifndef _AVMEDIA_MEDIAPPLAYER_HXX
#include <avmedia/mediaplayer.hxx>
#endif
#include <avmedia/mediatoolbox.hxx>

#include <annotsh.hxx>

#include <app.hrc>
#include <svx/xmlsecctrl.hxx>
ResMgr *pSwResMgr = 0;
sal_Bool 	bNoInterrupt 	= sal_False;

#include <sfx2/app.hxx>

#include <svx/svxerr.hxx>

#include <unomid.h>

using namespace com::sun::star;


TYPEINIT1( SwModule, SfxModule );

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

//************************************************************************

SwModule::SwModule( SfxObjectFactory* pWebFact,
					SfxObjectFactory* pFact,
					SfxObjectFactory* pGlobalFact )
	: SfxModule( SfxApplication::CreateResManager( "sw" ), sal_False, pWebFact,
					 pFact, pGlobalFact, NULL ),
	pModuleConfig(0),
    pUsrPref(0),
    pWebUsrPref(0),
    pPrtOpt(0),
    pWebPrtOpt(0),
    pChapterNumRules(0),
    pStdFontConfig(0),
    pNavigationConfig(0),
    pToolbarConfig(0),
    pWebToolbarConfig(0),
    pDBConfig(0),
    pColorConfig(0),
    pAccessibilityOptions(0),
    pCTLOptions(0),
    pUserOptions(0),
    pUndoOptions(0),
    pAttrPool(0),
    pView(0),
	bAuthorInitialised(sal_False),
    bEmbeddedLoadSave( sal_False ),
    pDragDrop( 0 ),
    pXSelection( 0 )
{
	SetName( String::CreateFromAscii("StarWriter") );
	pSwResMgr = GetResMgr();
	SvxErrorHandler::Get();
	pErrorHdl = new SfxErrorHandler( RID_SW_ERRHDL,
									 ERRCODE_AREA_SW,
									 ERRCODE_AREA_SW_END,
									 pSwResMgr );

	pModuleConfig = new SwModuleOptions;

	//Die brauchen wie sowieso
	pToolbarConfig = new SwToolbarConfigItem( sal_False );
	pWebToolbarConfig = new SwToolbarConfigItem( sal_True );

	pStdFontConfig = new SwStdFontConfig;

	pAuthorNames = new SvStringsDtor(5, 1);	// Alle Redlining-Autoren

	//JP 18.10.96: SvxAutocorrect gegen die SwAutocorrect austauschen
	SvxAutoCorrCfg*	pACfg = SvxAutoCorrCfg::Get();
	if( pACfg )
	{
		const SvxAutoCorrect* pOld = pACfg->GetAutoCorrect();
		pACfg->SetAutoCorrect(new SwAutoCorrect( *pOld ));
	}

	StartListening( *SFX_APP() );

    // OD 14.02.2003 #107424# - init color configuration
    // member <pColorConfig> is created and the color configuration is applied
    // at the view options.
    GetColorConfig();
}

//************************************************************************

uno::Reference< scanner::XScannerManager >
SwModule::GetScannerManager()
{
	if (!m_xScannerManager.is())
	{
        uno::Reference< lang::XMultiServiceFactory > xMgr (
			comphelper::getProcessServiceFactory() );
		if( xMgr.is() )
		{
			m_xScannerManager =
                uno::Reference< scanner::XScannerManager >(
					xMgr->createInstance(
						rtl::OUString::createFromAscii(
							"com.sun.star.scanner.ScannerManager" ) ),
                    uno::UNO_QUERY );
		}
	}
	return m_xScannerManager;
}

uno::Reference< linguistic2::XLanguageGuessing > SwModule::GetLanguageGuesser()
{
    if (!m_xLanguageGuesser.is())
    {
        uno::Reference< lang::XMultiServiceFactory > xMgr ( comphelper::getProcessServiceFactory() );
        if (xMgr.is())
        {
            m_xLanguageGuesser = uno::Reference< linguistic2::XLanguageGuessing >(
                    xMgr->createInstance(
                        rtl::OUString::createFromAscii( "com.sun.star.linguistic2.LanguageGuessing" ) ),
                        uno::UNO_QUERY );
        }
    }
    return m_xLanguageGuesser;
}

//************************************************************************

SwModule::~SwModule()
{
	SetPool(0);
	SfxItemPool::Free(pAttrPool);
	delete pErrorHdl;
    EndListening( *SFX_APP() );
}

//************************************************************************

void SwModule::CreateLngSvcEvtListener()
{
    if (!xLngSvcEvtListener.is())
        xLngSvcEvtListener = new SwLinguServiceEventListener;
}

//************************************************************************

void SwDLL::RegisterFactories()
{
	//Diese Id's duerfen nicht geaendert werden. Mittels der Id's wird vom
	//Sfx die View (Dokumentansicht wiederherstellen) erzeugt.
    if ( SvtModuleOptions().IsWriter() )
        SwView::RegisterFactory         ( 2 );

	SwWebView::RegisterFactory		( 5 );

    if ( SvtModuleOptions().IsWriter() )
    {
        SwSrcView::RegisterFactory      ( 6 );
        SwPagePreView::RegisterFactory  ( 7 );
    }
}

//************************************************************************


void SwDLL::RegisterInterfaces()
{
	SwModule* pMod = SW_MOD();
	SwModule::RegisterInterface( pMod );
	SwDocShell::RegisterInterface( pMod );
	SwWebDocShell::RegisterInterface( pMod );
	SwGlosDocShell::RegisterInterface( pMod );
	SwWebGlosDocShell::RegisterInterface( pMod );
	SwView::RegisterInterface( pMod );
	SwWebView::RegisterInterface( pMod );
	SwPagePreView::RegisterInterface( pMod );
	SwSrcView::RegisterInterface( pMod );


	SwBaseShell::RegisterInterface(pMod);
	SwTextShell::RegisterInterface(pMod);
	SwTableShell::RegisterInterface(pMod);
	SwListShell::RegisterInterface(pMod);
	SwFrameShell::RegisterInterface(pMod);
	SwDrawBaseShell::RegisterInterface(pMod);
	SwDrawShell::RegisterInterface(pMod);
	SwDrawFormShell::RegisterInterface(pMod);
	SwDrawTextShell::RegisterInterface(pMod);
	SwBezierShell::RegisterInterface(pMod);
	SwGrfShell::RegisterInterface(pMod);
	SwOleShell::RegisterInterface(pMod);
	SwWebTextShell::RegisterInterface(pMod);
	SwWebFrameShell::RegisterInterface(pMod);
	SwWebGrfShell::RegisterInterface(pMod);
	SwWebListShell::RegisterInterface(pMod);
	SwWebTableShell::RegisterInterface(pMod);
	SwWebDrawFormShell::RegisterInterface(pMod);
	SwWebOleShell::RegisterInterface(pMod);
	SwMediaShell::RegisterInterface(pMod);
    SwAnnotationShell::RegisterInterface(pMod);
}

//************************************************************************

void SwDLL::RegisterControls()
{
	SwModule* pMod = SW_MOD();
    SvxTbxCtlDraw::RegisterControl(SID_INSERT_DRAW, pMod );
    SvxTbxCtlAlign::RegisterControl(SID_OBJECT_ALIGN, pMod );
	SwTbxAnchor::RegisterControl(FN_TOOL_ANKER, pMod );
	SwTbxInsertCtrl::RegisterControl(FN_INSERT_CTRL, pMod );
	SwTbxInsertCtrl::RegisterControl(FN_INSERT_OBJ_CTRL, pMod );
	SwTbxAutoTextCtrl::RegisterControl(FN_INSERT_FIELD_CTRL, pMod );
	SwTbxAutoTextCtrl::RegisterControl(FN_GLOSSARY_DLG, pMod );

	SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_BASIC, pMod );
	SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_SYMBOL, pMod );
	SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_ARROW, pMod );
	SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_FLOWCHART, pMod );
	SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_CALLOUT, pMod );
	SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_STAR, pMod );

	svx::ExtrusionColorControl::RegisterControl( SID_EXTRUSION_3D_COLOR, pMod );
	svx::FontWorkShapeTypeControl::RegisterControl( SID_FONTWORK_SHAPE_TYPE, pMod );

	SvxClipBoardControl::RegisterControl(SID_PASTE, pMod );
	SvxUndoRedoControl::RegisterControl(SID_UNDO, pMod );
	SvxUndoRedoControl::RegisterControl(SID_REDO, pMod );
    svx::FormatPaintBrushToolBoxControl::RegisterControl(SID_FORMATPAINTBRUSH, pMod );

	SvxFillToolBoxControl::RegisterControl(SID_ATTR_FILL_STYLE, pMod );
	SvxLineStyleToolBoxControl::RegisterControl(SID_ATTR_LINE_STYLE, pMod );
	SvxLineWidthToolBoxControl::RegisterControl(SID_ATTR_LINE_WIDTH, pMod );
	SvxLineColorToolBoxControl::RegisterControl(SID_ATTR_LINE_COLOR, pMod );
	SvxLineEndToolBoxControl::RegisterControl(SID_ATTR_LINEEND_STYLE, pMod );

	SvxFontNameToolBoxControl::RegisterControl(SID_ATTR_CHAR_FONT, pMod );
//	SvxFontHeightToolBoxControl::RegisterControl(SID_ATTR_CHAR_FONTHEIGHT, pMod );
	SvxFontColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR, pMod );
	SvxFontColorExtToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR2, pMod );
	SvxFontColorExtToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR_BACKGROUND, pMod );
	SvxStyleToolBoxControl::RegisterControl(SID_STYLE_APPLY, pMod );
	SvxColorToolBoxControl::RegisterControl(SID_BACKGROUND_COLOR, pMod );
	SvxFrameToolBoxControl::RegisterControl(SID_ATTR_BORDER, pMod );
	SvxFrameLineStyleToolBoxControl::RegisterControl(SID_FRAME_LINESTYLE, pMod );
	SvxFrameLineColorToolBoxControl::RegisterControl(SID_FRAME_LINECOLOR, pMod );

	SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_FRAME_INTERACT, pMod );
	SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_FRAME, pMod );
    SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_REGION, pMod );
	SvxTableToolBoxControl::RegisterControl(FN_INSERT_TABLE, pMod );
    SvxTableToolBoxControl::RegisterControl(FN_SHOW_MULTIPLE_PAGES, pMod );

	SvxFontMenuControl::RegisterControl(SID_ATTR_CHAR_FONT, pMod );
	SvxFontSizeMenuControl::RegisterControl(SID_ATTR_CHAR_FONTHEIGHT, pMod );

	SwZoomControl::RegisterControl(SID_ATTR_ZOOM, pMod );
    SwPreviewZoomControl::RegisterControl(FN_PREVIEW_ZOOM, pMod);
	SvxPosSizeStatusBarControl::RegisterControl(0, pMod );
	SvxInsertStatusBarControl::RegisterControl(SID_ATTR_INSERT, pMod );
	SvxSelectionModeControl::RegisterControl(FN_STAT_SELMODE, pMod );
	XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE, pMod );

	SwBookmarkControl::RegisterControl(FN_STAT_PAGE, pMod );
	SwTemplateControl::RegisterControl(FN_STAT_TEMPLATE, pMod );
    SwViewLayoutControl::RegisterControl( SID_ATTR_VIEWLAYOUT, pMod );
    SvxZoomSliderControl::RegisterControl( SID_ATTR_ZOOMSLIDER, pMod );

	SwTableOptimizeCtrl::RegisterControl(FN_OPTIMIZE_TABLE, pMod);

	SvxIMapDlgChildWindow::RegisterChildWindow( sal_False, pMod );
	SvxSearchDialogWrapper::RegisterChildWindow( sal_False, pMod );
	SvxHlinkDlgWrapper::RegisterChildWindow( sal_False, pMod );
	SvxHyperlinkDlgWrapper::RegisterChildWindow( sal_False, pMod, SFX_CHILDWIN_FORCEDOCK );
	SvxFontWorkChildWindow::RegisterChildWindow( sal_False, pMod );
	SwFldDlgWrapper::RegisterChildWindow( sal_False, pMod );
    SwFldDataOnlyDlgWrapper::RegisterChildWindow( sal_False, pMod );
	SvxContourDlgChildWindow::RegisterChildWindow( sal_False, pMod );
	SwNavigationChild::RegisterChildWindowContext( pMod );
	SwInputChild::RegisterChildWindow( sal_False, pMod, SFX_CHILDWIN_FORCEDOCK );
	SwRedlineAcceptChild::RegisterChildWindow( sal_False, pMod );
	SwSyncChildWin::RegisterChildWindow( sal_True, pMod );
    SwMailMergeChildWindow::RegisterChildWindow( sal_False, pMod );
//    SwSendMailChildWindow::RegisterChildWindow( sal_False, pMod );
	SwInsertIdxMarkWrapper::RegisterChildWindow( sal_False, pMod );
	SwInsertAuthMarkWrapper::RegisterChildWindow( sal_False, pMod );
	SvxRubyChildWindow::RegisterChildWindow( sal_False, pMod);
    SwSpellDialogChildWindow::RegisterChildWindow(sal_False, pMod);

	SvxGrafRedToolBoxControl::RegisterControl( SID_ATTR_GRAF_RED, pMod );
	SvxGrafGreenToolBoxControl::RegisterControl( SID_ATTR_GRAF_GREEN, pMod );
	SvxGrafBlueToolBoxControl::RegisterControl( SID_ATTR_GRAF_BLUE, pMod );
	SvxGrafLuminanceToolBoxControl::RegisterControl( SID_ATTR_GRAF_LUMINANCE, pMod );
	SvxGrafContrastToolBoxControl::RegisterControl( SID_ATTR_GRAF_CONTRAST, pMod );
	SvxGrafGammaToolBoxControl::RegisterControl( SID_ATTR_GRAF_GAMMA, pMod );
	SvxGrafTransparenceToolBoxControl::RegisterControl( SID_ATTR_GRAF_TRANSPARENCE, pMod );
	SvxGrafModeToolBoxControl::RegisterControl( SID_ATTR_GRAF_MODE, pMod );
    SvxGrafFilterToolBoxControl::RegisterControl( SID_GRFFILTER, pMod );
    SvxVertTextTbxCtrl::RegisterControl(SID_TEXTDIRECTION_LEFT_TO_RIGHT, pMod);
    SvxVertTextTbxCtrl::RegisterControl(SID_TEXTDIRECTION_TOP_TO_BOTTOM, pMod);
    SvxVertTextTbxCtrl::RegisterControl(SID_DRAW_CAPTION_VERTICAL, pMod);
    SvxVertTextTbxCtrl::RegisterControl(SID_DRAW_TEXT_VERTICAL, pMod);

    SvxCTLTextTbxCtrl::RegisterControl(SID_ATTR_PARA_LEFT_TO_RIGHT, pMod);
    SvxCTLTextTbxCtrl::RegisterControl(SID_ATTR_PARA_RIGHT_TO_LEFT, pMod);

	GalleryChildWindow::RegisterChildWindow(0, pMod);

	::avmedia::MediaToolBoxControl::RegisterControl(SID_AVMEDIA_TOOLBOX, pMod);
	::avmedia::MediaPlayer::RegisterChildWindow(0, pMod);

    SvxSmartTagsControl::RegisterControl(SID_OPEN_SMARTTAGMENU, pMod);
    ::sfx2::sidebar::SidebarChildWindow::RegisterChildWindow(NULL, pMod);
    ::sfx2::TaskPaneWrapper::RegisterChildWindow(NULL, pMod);
}



/*************************************************************************
|*
|* Modul laden (nur Attrappe fuer das Linken der DLL)
|*
\************************************************************************/

/* -----------------20.04.99 10:46-------------------
 *
 * --------------------------------------------------*/
void	SwModule::InitAttrPool()
{
	DBG_ASSERT(!pAttrPool, "Pool ist schon da!");
	pAttrPool = new SwAttrPool(0);
	SetPool(pAttrPool);
}
/* -----------------20.04.99 10:46-------------------
 *
 * --------------------------------------------------*/
void	SwModule::RemoveAttrPool()
{
	SetPool(0);
	SfxItemPool::Free(pAttrPool);
}


