/**************************************************************
 * 
 * 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_sc.hxx"

#include <tools/debug.hxx>
#include <svtools/unoimap.hxx>
#include <svx/unofill.hxx>
#include <editeng/unonrule.hxx>
#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>

#include "servuno.hxx"
#include "unoguard.hxx"
#include "unonames.hxx"
#include "cellsuno.hxx"
#include "fielduno.hxx"
#include "styleuno.hxx"
#include "afmtuno.hxx"
#include "defltuno.hxx"
#include "drdefuno.hxx"
#include "docsh.hxx"
#include "drwlayer.hxx"
#include "confuno.hxx"
#include "shapeuno.hxx"
#include "cellvaluebinding.hxx"
#include "celllistsource.hxx"
#include "addruno.hxx"
#include "chart2uno.hxx"
#include "tokenuno.hxx"

// #100263# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
#include <svx/xmleohlp.hxx>
#include <svx/xmlgrhlp.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/docfilt.hxx>
#include <com/sun/star/script/ScriptEventDescriptor.hpp>
#include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
#include <com/sun/star/document/XCodeNameQuery.hpp>
#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
#include <com/sun/star/form/XFormsSupplier.hpp>
#include <svx/unomod.hxx> 
#include <vbahelper/vbaaccesshelper.hxx>

#include <comphelper/processfactory.hxx>
#include <basic/basmgr.hxx>
#include <sfx2/app.hxx>

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

class ScVbaObjectForCodeNameProvider : public ::cppu::WeakImplHelper1< container::XNameAccess >
{
    uno::Any maWorkbook;
    uno::Any maCachedObject;
    ScDocShell* mpDocShell;
public:
    ScVbaObjectForCodeNameProvider( ScDocShell* pDocShell ) : mpDocShell( pDocShell )
    {
        ScDocument* pDoc = mpDocShell->GetDocument();
        if ( !pDoc )
            throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("")), uno::Reference< uno::XInterface >() );

        uno::Sequence< uno::Any > aArgs(2);
        // access the application object ( parent for workbook )
        aArgs[0] = uno::Any( ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.Application", uno::Sequence< uno::Any >() ) );
        aArgs[1] = uno::Any( mpDocShell->GetModel() );
        maWorkbook <<= ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.excel.Workbook", aArgs );
    }

    virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException )
    {
        ScUnoGuard aGuard;
        maCachedObject = uno::Any(); // clear cached object
        String sName = aName;

        ScDocument* pDoc = mpDocShell->GetDocument();
        if ( !pDoc )
            throw uno::RuntimeException();
        if ( sName == pDoc->GetCodeName() )
            maCachedObject = maWorkbook;
        else 
        {
            String sCodeName;
            SCTAB nCount = pDoc->GetTableCount();
            for( SCTAB i = 0; i < nCount; i++ )
            {
                pDoc->GetCodeName( i, sCodeName );
                if( sCodeName == sName )
                {
                    String sSheetName;
                    if( pDoc->GetName( i, sSheetName ) )
                    {
                        uno::Reference< frame::XModel > xModel( mpDocShell->GetModel() );
                        uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( xModel, uno::UNO_QUERY_THROW );
                        uno::Reference<sheet::XSpreadsheets > xSheets( xSpreadDoc->getSheets(), uno::UNO_QUERY_THROW );
                        uno::Reference< container::XIndexAccess > xIndexAccess( xSheets, uno::UNO_QUERY_THROW );
                        uno::Reference< sheet::XSpreadsheet > xSheet( xIndexAccess->getByIndex( i ), uno::UNO_QUERY_THROW );
                        uno::Sequence< uno::Any > aArgs(3);
                        aArgs[0] = maWorkbook;
                        aArgs[1] = uno::Any( xModel );
                        aArgs[2] = uno::Any( rtl::OUString( sSheetName ) );
                        // use the convience function
                        maCachedObject <<= ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.excel.Worksheet", aArgs );
                        break;
                    }
                }
            }
        }
        return maCachedObject.hasValue();

    }
    ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
    {
        ScUnoGuard aGuard;
        OSL_TRACE("ScVbaObjectForCodeNameProvider::getByName( %s )",
            rtl::OUStringToOString( aName, RTL_TEXTENCODING_UTF8 ).getStr() );
        if ( !hasByName( aName ) )
            throw ::com::sun::star::container::NoSuchElementException();
        return maCachedObject;
    }
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw (::com::sun::star::uno::RuntimeException)
    {
        ScUnoGuard aGuard;
        ScDocument* pDoc = mpDocShell->GetDocument();
        if ( !pDoc )
            throw uno::RuntimeException();
        SCTAB nCount = pDoc->GetTableCount();
        uno::Sequence< rtl::OUString > aNames( nCount + 1 ); 
        SCTAB index = 0;
        String sCodeName;
        for( ; index < nCount; ++index )
        {
            pDoc->GetCodeName( index, sCodeName );
            aNames[ index ] = sCodeName;
        }
        aNames[ index ] = pDoc->GetCodeName();
        return aNames;
    }
    // XElemenAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw (::com::sun::star::uno::RuntimeException){ return uno::Type(); }
    virtual ::sal_Bool SAL_CALL hasElements(  ) throw (::com::sun::star::uno::RuntimeException ) { return sal_True; }

};

class ScVbaCodeNameProvider : public ::cppu::WeakImplHelper1< document::XCodeNameQuery >
{
ScDocShell* mpDocShell;
public:
    ScVbaCodeNameProvider( ScDocShell* pDocShell ) : mpDocShell( pDocShell ) {}
    // XCodeNameQuery
    rtl::OUString SAL_CALL getCodeNameForObject( const uno::Reference< uno::XInterface >& xIf ) throw( uno::RuntimeException )
    {
        ScUnoGuard aGuard;
        rtl::OUString sCodeName;
        if ( mpDocShell )
        {
            OSL_TRACE( "*** In ScVbaCodeNameProvider::getCodeNameForObject");
            // need to find the page ( and index )  for this control
            uno::Reference< drawing::XDrawPagesSupplier > xSupplier( mpDocShell->GetModel(), uno::UNO_QUERY_THROW );
            uno::Reference< container::XIndexAccess > xIndex( xSupplier->getDrawPages(), uno::UNO_QUERY_THROW );
            sal_Int32 nLen = xIndex->getCount();
            bool bMatched = false;
            uno::Sequence< script::ScriptEventDescriptor > aFakeEvents;
            for ( sal_Int32 index = 0; index < nLen; ++index )
            {
                try
                {
                    uno::Reference< form::XFormsSupplier >  xFormSupplier( xIndex->getByIndex( index ), uno::UNO_QUERY_THROW );
                    uno::Reference< container::XIndexAccess > xFormIndex( xFormSupplier->getForms(), uno::UNO_QUERY_THROW );
                    // get the www-standard container
                    uno::Reference< container::XIndexAccess > xFormControls( xFormIndex->getByIndex(0), uno::UNO_QUERY_THROW );
                    sal_Int32 nCntrls = xFormControls->getCount();
                    for( sal_Int32 cIndex = 0; cIndex < nCntrls; ++cIndex )
                    {
                        uno::Reference< uno::XInterface > xControl( xFormControls->getByIndex( cIndex ), uno::UNO_QUERY_THROW );	
                        bMatched = ( xControl == xIf );
                        if ( bMatched )
                        {
                            String sName;
                            mpDocShell->GetDocument()->GetCodeName( static_cast<SCTAB>( index ), sName );
                            sCodeName = sName;
                        }
                    }
                }
                catch( uno::Exception& ) {}
                if ( bMatched )
                    break;
            }
        }
        // Probably should throw here ( if !bMatched )
         return sCodeName;
    }

};

//------------------------------------------------------------------------
//
struct ProvNamesId_Type
{
    const char *    pName;
    sal_uInt16      nType;
};

static const ProvNamesId_Type __FAR_DATA aProvNamesId[] =
{
    { "com.sun.star.sheet.Spreadsheet",                 SC_SERVICE_SHEET },
    { "com.sun.star.text.TextField.URL",                SC_SERVICE_URLFIELD },
    { "com.sun.star.text.TextField.PageNumber",         SC_SERVICE_PAGEFIELD },
    { "com.sun.star.text.TextField.PageCount",          SC_SERVICE_PAGESFIELD },
    { "com.sun.star.text.TextField.Date",               SC_SERVICE_DATEFIELD },
    { "com.sun.star.text.TextField.Time",               SC_SERVICE_TIMEFIELD },
    { "com.sun.star.text.TextField.DocumentTitle",      SC_SERVICE_TITLEFIELD },
    { "com.sun.star.text.TextField.FileName",           SC_SERVICE_FILEFIELD },
    { "com.sun.star.text.TextField.SheetName",          SC_SERVICE_SHEETFIELD },
    { "com.sun.star.style.CellStyle",                   SC_SERVICE_CELLSTYLE },
    { "com.sun.star.style.PageStyle",                   SC_SERVICE_PAGESTYLE },
    { "com.sun.star.sheet.TableAutoFormat",             SC_SERVICE_AUTOFORMAT },
    { "com.sun.star.sheet.SheetCellRanges",             SC_SERVICE_CELLRANGES },
    { "com.sun.star.drawing.GradientTable",             SC_SERVICE_GRADTAB },
    { "com.sun.star.drawing.HatchTable",                SC_SERVICE_HATCHTAB },
    { "com.sun.star.drawing.BitmapTable",               SC_SERVICE_BITMAPTAB },
    { "com.sun.star.drawing.TransparencyGradientTable", SC_SERVICE_TRGRADTAB },
    { "com.sun.star.drawing.MarkerTable",               SC_SERVICE_MARKERTAB },
    { "com.sun.star.drawing.DashTable",                 SC_SERVICE_DASHTAB },
    { "com.sun.star.text.NumberingRules",               SC_SERVICE_NUMRULES },
    { "com.sun.star.sheet.Defaults",                    SC_SERVICE_DOCDEFLTS },
    { "com.sun.star.drawing.Defaults",                  SC_SERVICE_DRAWDEFLTS },
    { "com.sun.star.comp.SpreadsheetSettings",          SC_SERVICE_DOCSPRSETT },
    { "com.sun.star.document.Settings",                 SC_SERVICE_DOCCONF },
    { "com.sun.star.image.ImageMapRectangleObject",     SC_SERVICE_IMAP_RECT },
    { "com.sun.star.image.ImageMapCircleObject",        SC_SERVICE_IMAP_CIRC },
    { "com.sun.star.image.ImageMapPolygonObject",       SC_SERVICE_IMAP_POLY },

		// #100263# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
    { "com.sun.star.document.ExportGraphicObjectResolver",  SC_SERVICE_EXPORT_GOR },
    { "com.sun.star.document.ImportGraphicObjectResolver",  SC_SERVICE_IMPORT_GOR },
    { "com.sun.star.document.ExportEmbeddedObjectResolver", SC_SERVICE_EXPORT_EOR },
    { "com.sun.star.document.ImportEmbeddedObjectResolver", SC_SERVICE_IMPORT_EOR },

    { SC_SERVICENAME_VALBIND,               SC_SERVICE_VALBIND },
    { SC_SERVICENAME_LISTCELLBIND,          SC_SERVICE_LISTCELLBIND },
    { SC_SERVICENAME_LISTSOURCE,            SC_SERVICE_LISTSOURCE },
    { SC_SERVICENAME_CELLADDRESS,           SC_SERVICE_CELLADDRESS },
    { SC_SERVICENAME_RANGEADDRESS,          SC_SERVICE_RANGEADDRESS },

    { "com.sun.star.sheet.DocumentSettings",SC_SERVICE_SHEETDOCSET },

    { SC_SERVICENAME_CHDATAPROV,            SC_SERVICE_CHDATAPROV },
    { SC_SERVICENAME_FORMULAPARS,           SC_SERVICE_FORMULAPARS },
    { SC_SERVICENAME_OPCODEMAPPER,          SC_SERVICE_OPCODEMAPPER },
    { "ooo.vba.VBAObjectModuleObjectProvider", SC_SERVICE_VBAOBJECTPROVIDER },
    { "ooo.vba.VBACodeNameProvider",        SC_SERVICE_VBACODENAMEPROVIDER },
    { "ooo.vba.VBAGlobals",                 SC_SERVICE_VBAGLOBALS },

    // case-correct versions of the service names (#i102468#)
    { "com.sun.star.text.textfield.URL",                SC_SERVICE_URLFIELD },
    { "com.sun.star.text.textfield.PageNumber",         SC_SERVICE_PAGEFIELD },
    { "com.sun.star.text.textfield.PageCount",          SC_SERVICE_PAGESFIELD },
    { "com.sun.star.text.textfield.Date",               SC_SERVICE_DATEFIELD },
    { "com.sun.star.text.textfield.Time",               SC_SERVICE_TIMEFIELD },
    { "com.sun.star.text.textfield.DocumentTitle",      SC_SERVICE_TITLEFIELD },
    { "com.sun.star.text.textfield.FileName",           SC_SERVICE_FILEFIELD },
    { "com.sun.star.text.textfield.SheetName",          SC_SERVICE_SHEETFIELD }
};

//
//	old service names that were in 567 still work in createInstance,
//	in case some macro is still using them
//

static const sal_Char* __FAR_DATA aOldNames[SC_SERVICE_COUNT] =
	{
		"",											// SC_SERVICE_SHEET
		"stardiv.one.text.TextField.URL",			// SC_SERVICE_URLFIELD
		"stardiv.one.text.TextField.PageNumber",	// SC_SERVICE_PAGEFIELD
		"stardiv.one.text.TextField.PageCount",		// SC_SERVICE_PAGESFIELD
		"stardiv.one.text.TextField.Date",			// SC_SERVICE_DATEFIELD
		"stardiv.one.text.TextField.Time",			// SC_SERVICE_TIMEFIELD
		"stardiv.one.text.TextField.DocumentTitle",	// SC_SERVICE_TITLEFIELD
		"stardiv.one.text.TextField.FileName",		// SC_SERVICE_FILEFIELD
		"stardiv.one.text.TextField.SheetName",		// SC_SERVICE_SHEETFIELD
		"stardiv.one.style.CellStyle",				// SC_SERVICE_CELLSTYLE
		"stardiv.one.style.PageStyle",				// SC_SERVICE_PAGESTYLE
		"",											// SC_SERVICE_AUTOFORMAT
		"",											// SC_SERVICE_CELLRANGES
		"",											// SC_SERVICE_GRADTAB
		"",											// SC_SERVICE_HATCHTAB
		"",											// SC_SERVICE_BITMAPTAB
		"",											// SC_SERVICE_TRGRADTAB
		"",											// SC_SERVICE_MARKERTAB
		"",											// SC_SERVICE_DASHTAB
		"",											// SC_SERVICE_NUMRULES
		"",											// SC_SERVICE_DOCDEFLTS
		"",											// SC_SERVICE_DRAWDEFLTS
		"",											// SC_SERVICE_DOCSPRSETT
		"",											// SC_SERVICE_DOCCONF
		"",											// SC_SERVICE_IMAP_RECT
		"",											// SC_SERVICE_IMAP_CIRC
		"",											// SC_SERVICE_IMAP_POLY

		// #100263# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
		"",											// SC_SERVICE_EXPORT_GOR
		"",											// SC_SERVICE_IMPORT_GOR
		"",											// SC_SERVICE_EXPORT_EOR
		"",											// SC_SERVICE_IMPORT_EOR

		"",											// SC_SERVICE_VALBIND
		"",											// SC_SERVICE_LISTCELLBIND
		"",											// SC_SERVICE_LISTSOURCE
		"",											// SC_SERVICE_CELLADDRESS
		"",											// SC_SERVICE_RANGEADDRESS
        "",                                         // SC_SERVICE_SHEETDOCSET
        "",                                         // SC_SERVICE_CHDATAPROV
        "",                                         // SC_SERVICE_FORMULAPARS
        "",                                         // SC_SERVICE_OPCODEMAPPER
        "",                                         // SC_SERVICE_VBAOBJECTPROVIDER
        "",                                         // SC_SERVICE_VBACODENAMEPROVIDER
        "",                                         // SC_SERVICE_VBAGLOBALS
	};




//------------------------------------------------------------------------

//	alles static

//UNUSED2008-05  String ScServiceProvider::GetProviderName(sal_uInt16 nObjectType)
//UNUSED2008-05  {
//UNUSED2008-05      String sRet;
//UNUSED2008-05      if (nObjectType < SC_SERVICE_COUNT)
//UNUSED2008-05          sRet = String::CreateFromAscii( aProvNames[nObjectType] );
//UNUSED2008-05      return sRet;
//UNUSED2008-05  }

sal_uInt16 ScServiceProvider::GetProviderType(const String& rServiceName)
{
	if (rServiceName.Len())
	{
        const sal_uInt16 nEntries =
            sizeof(aProvNamesId) / sizeof(aProvNamesId[0]);
        for (sal_uInt16 i = 0; i < nEntries; i++)
        {
            if (rServiceName.EqualsAscii( aProvNamesId[i].pName ))
            {
                return aProvNamesId[i].nType;
            }
        }

		sal_uInt16 i;
		for (i=0; i<SC_SERVICE_COUNT; i++)
        {
            DBG_ASSERT( aOldNames[i], "ScServiceProvider::GetProviderType: no oldname => crash");
			if (rServiceName.EqualsAscii( aOldNames[i] ))
			{
				DBG_ERROR("old service name used");
				return i;
			}
        }
	}
	return SC_SERVICE_INVALID;
}

uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance(
									sal_uInt16 nType, ScDocShell* pDocShell )
{
	uno::Reference<uno::XInterface> xRet;
	switch (nType)
	{
		case SC_SERVICE_SHEET:
			//	noch nicht eingefuegt - DocShell=Null
			xRet.set((sheet::XSpreadsheet*)new ScTableSheetObj(NULL,0));
			break;
		case SC_SERVICE_URLFIELD:
			xRet.set((text::XTextField*)new ScCellFieldObj( NULL, ScAddress(), ESelection() ));
			break;
		case SC_SERVICE_PAGEFIELD:
		case SC_SERVICE_PAGESFIELD:
		case SC_SERVICE_DATEFIELD:
		case SC_SERVICE_TIMEFIELD:
		case SC_SERVICE_TITLEFIELD:
		case SC_SERVICE_FILEFIELD:
		case SC_SERVICE_SHEETFIELD:
			xRet.set((text::XTextField*)new ScHeaderFieldObj( NULL, 0, nType, ESelection() ));
			break;
		case SC_SERVICE_CELLSTYLE:
			xRet.set((style::XStyle*)new ScStyleObj( NULL, SFX_STYLE_FAMILY_PARA, String() ));
			break;
		case SC_SERVICE_PAGESTYLE:
			xRet.set((style::XStyle*)new ScStyleObj( NULL, SFX_STYLE_FAMILY_PAGE, String() ));
			break;
		case SC_SERVICE_AUTOFORMAT:
			xRet.set((container::XIndexAccess*)new ScAutoFormatObj( SC_AFMTOBJ_INVALID ));
			break;
		case SC_SERVICE_CELLRANGES:
			//	wird nicht eingefuegt, sondern gefuellt
			//	-> DocShell muss gesetzt sein, aber leere Ranges
			if (pDocShell)
				xRet.set((sheet::XSheetCellRanges*)new ScCellRangesObj( pDocShell, ScRangeList() ));
			break;

		case SC_SERVICE_DOCDEFLTS:
			if (pDocShell)
				xRet.set((beans::XPropertySet*)new ScDocDefaultsObj( pDocShell ));
			break;
		case SC_SERVICE_DRAWDEFLTS:
			if (pDocShell)
				xRet.set((beans::XPropertySet*)new ScDrawDefaultsObj( pDocShell ));
			break;

		//	Drawing layer tables are not in SvxUnoDrawMSFactory,
		//	because SvxUnoDrawMSFactory doesn't have a SdrModel pointer.
		//	Drawing layer is always allocated if not there (MakeDrawLayer).

		case SC_SERVICE_GRADTAB:
			if (pDocShell)
				xRet.set(SvxUnoGradientTable_createInstance( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_HATCHTAB:
			if (pDocShell)
				xRet.set(SvxUnoHatchTable_createInstance( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_BITMAPTAB:
			if (pDocShell)
				xRet.set(SvxUnoBitmapTable_createInstance( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_TRGRADTAB:
			if (pDocShell)
				xRet.set(SvxUnoTransGradientTable_createInstance( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_MARKERTAB:
			if (pDocShell)
				xRet.set(SvxUnoMarkerTable_createInstance( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_DASHTAB:
			if (pDocShell)
				xRet.set(SvxUnoDashTable_createInstance( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_NUMRULES:
			if (pDocShell)
				xRet.set(SvxCreateNumRule( pDocShell->MakeDrawLayer() ));
			break;
		case SC_SERVICE_DOCSPRSETT:
        case SC_SERVICE_SHEETDOCSET:
		case SC_SERVICE_DOCCONF:
			if (pDocShell)
				xRet.set((beans::XPropertySet*)new ScDocumentConfiguration(pDocShell));
			break;

		case SC_SERVICE_IMAP_RECT:
			xRet.set(SvUnoImageMapRectangleObject_createInstance( ScShapeObj::GetSupportedMacroItems() ));
			break;
		case SC_SERVICE_IMAP_CIRC:
			xRet.set(SvUnoImageMapCircleObject_createInstance( ScShapeObj::GetSupportedMacroItems() ));
			break;
		case SC_SERVICE_IMAP_POLY:
			xRet.set(SvUnoImageMapPolygonObject_createInstance( ScShapeObj::GetSupportedMacroItems() ));
			break;

		// #100263# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
		case SC_SERVICE_EXPORT_GOR:
			xRet.set((::cppu::OWeakObject * )new SvXMLGraphicHelper( GRAPHICHELPER_MODE_WRITE ));
			break;

		case SC_SERVICE_IMPORT_GOR:
			xRet.set((::cppu::OWeakObject * )new SvXMLGraphicHelper( GRAPHICHELPER_MODE_READ ));
			break;

		case SC_SERVICE_EXPORT_EOR:
			if (pDocShell)
				xRet.set((::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pDocShell, EMBEDDEDOBJECTHELPER_MODE_WRITE ));
			break;

		case SC_SERVICE_IMPORT_EOR:
			if (pDocShell)
				xRet.set((::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pDocShell, EMBEDDEDOBJECTHELPER_MODE_READ ));
			break;

		case SC_SERVICE_VALBIND:
		case SC_SERVICE_LISTCELLBIND:
			if (pDocShell)
			{
				sal_Bool bListPos = ( nType == SC_SERVICE_LISTCELLBIND );
				uno::Reference<sheet::XSpreadsheetDocument> xDoc( pDocShell->GetBaseModel(), uno::UNO_QUERY );
				xRet.set(*new calc::OCellValueBinding( xDoc, bListPos ));
			}
			break;
		case SC_SERVICE_LISTSOURCE:
			if (pDocShell)
			{
				uno::Reference<sheet::XSpreadsheetDocument> xDoc( pDocShell->GetBaseModel(), uno::UNO_QUERY );
				xRet.set(*new calc::OCellListSource( xDoc ));
			}
			break;
		case SC_SERVICE_CELLADDRESS:
		case SC_SERVICE_RANGEADDRESS:
			if (pDocShell)
			{
				sal_Bool bRange = ( nType == SC_SERVICE_RANGEADDRESS );
				xRet.set(*new ScAddressConversionObj( pDocShell, bRange ));
			}
			break;

        case SC_SERVICE_CHDATAPROV:
            if (pDocShell && pDocShell->GetDocument())
                xRet = *new ScChart2DataProvider( pDocShell->GetDocument() );
            break;

        case SC_SERVICE_FORMULAPARS:
            if (pDocShell)
                xRet.set(static_cast<sheet::XFormulaParser*>(new ScFormulaParserObj( pDocShell )));
            break;

        case SC_SERVICE_OPCODEMAPPER:
			if (pDocShell)
            {
                ScDocument* pDoc = pDocShell->GetDocument();
                ScAddress aAddress;
                ScCompiler* pComp = new ScCompiler(pDoc,aAddress);
                pComp->SetGrammar( pDoc->GetGrammar() );
                xRet.set(static_cast<sheet::XFormulaOpCodeMapper*>(new ScFormulaOpCodeMapperObj(::std::auto_ptr<formula::FormulaCompiler> (pComp))));
				break;
            }
        case SC_SERVICE_VBAOBJECTPROVIDER:
			if (pDocShell && pDocShell->GetDocument()->IsInVBAMode())
            {
                OSL_TRACE("**** creating VBA Object mapper");
                xRet.set(static_cast<container::XNameAccess*>(new ScVbaObjectForCodeNameProvider( pDocShell )));
            }
            break;
        case SC_SERVICE_VBACODENAMEPROVIDER:
            if (pDocShell && pDocShell->GetDocument()->IsInVBAMode())
            {
                OSL_TRACE("**** creating VBA Object provider");
				xRet.set(static_cast<document::XCodeNameQuery*>(new ScVbaCodeNameProvider( pDocShell )));
			}
			break;
        case SC_SERVICE_VBAGLOBALS:
			if (pDocShell)
			{
                uno::Any aGlobs;
				if ( !pDocShell->GetBasicManager()->GetGlobalUNOConstant( "VBAGlobals", aGlobs ) )
				{
					uno::Sequence< uno::Any > aArgs(1);
					aArgs[ 0 ] <<= pDocShell->GetModel();
					xRet = ::comphelper::getProcessServiceFactory()->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.excel.Globals" ) ), aArgs );
					pDocShell->GetBasicManager()->SetGlobalUNOConstant( "VBAGlobals", uno::Any( xRet ) );
					BasicManager* pAppMgr = SFX_APP()->GetBasicManager();
					if ( pAppMgr )
						pAppMgr->SetGlobalUNOConstant( "ThisExcelDoc", aArgs[ 0 ] );

                    // create the VBA document event processor
                    uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents(
                        ::ooo::vba::createVBAUnoAPIServiceWithArgs( pDocShell, "com.sun.star.script.vba.VBASpreadsheetEventProcessor", aArgs ), uno::UNO_QUERY );
                    pDocShell->GetDocument()->SetVbaEventProcessor( xVbaEvents );
				}
			}
        break;
	}

	return xRet;
}

uno::Sequence<rtl::OUString> ScServiceProvider::GetAllServiceNames()
{
    const sal_uInt16 nEntries = sizeof(aProvNamesId) / sizeof(aProvNamesId[0]);
    uno::Sequence<rtl::OUString> aRet(nEntries);
	rtl::OUString* pArray = aRet.getArray();
    for (sal_uInt16 i = 0; i < nEntries; i++)
    {
        pArray[i] = rtl::OUString::createFromAscii( aProvNamesId[i].pName );
    }
	return aRet;
}




