/* -*- 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 .
*/
ScDocument& rDoc = mpDocShell->GetDocument(); // aName is generated from the stream name which can be different ( case-wise ) // from the code name if( aName.equalsIgnoreAsciiCase( rDoc.GetCodeName() ) )
maCachedObject = maWorkbook; else
{
OUString sCodeName;
SCTAB nCount = rDoc.GetTableCount(); for( SCTAB i = 0; i < nCount; i++ )
{
rDoc.GetCodeName( i, sCodeName ); // aName is generated from the stream name which can be different ( case-wise ) // from the code name if( sCodeName.equalsIgnoreAsciiCase( aName ) )
{
OUString sSheetName; if( rDoc.GetName( i, sSheetName ) )
{
rtl::Reference< ScModelObj > xSpreadDoc( mpDocShell->GetModel() );
uno::Reference<sheet::XSpreadsheets > xSheets( xSpreadDoc->getSheets(), uno::UNO_SET_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{ maWorkbook, uno::Any(uno::Reference< frame::XModel >(xSpreadDoc)), uno::Any(sSheetName) }; // use the convenience function
maCachedObject <<= ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.excel.Worksheet", aArgs ); break;
}
}
}
} return maCachedObject.hasValue();
// old service names that were in 567 still work in createInstance, // in case some macro is still using them const ProvNamesId_Type aOldNames[] =
{
{ u"stardiv.one.text.TextField.URL"_ustr, Type::URLFIELD },
{ u"stardiv.one.text.TextField.PageNumber"_ustr, Type::PAGEFIELD },
{ u"stardiv.one.text.TextField.PageCount"_ustr, Type::PAGESFIELD },
{ u"stardiv.one.text.TextField.Date"_ustr, Type::DATEFIELD },
{ u"stardiv.one.text.TextField.Time"_ustr, Type::TIMEFIELD },
{ u"stardiv.one.text.TextField.DocumentTitle"_ustr, Type::TITLEFIELD },
{ u"stardiv.one.text.TextField.FileName"_ustr, Type::FILEFIELD },
{ u"stardiv.one.text.TextField.SheetName"_ustr, Type::SHEETFIELD },
{ u"stardiv.one.style.CellStyle"_ustr, Type::CELLSTYLE },
{ u"stardiv.one.style.PageStyle"_ustr, Type::PAGESTYLE },
};
sal_Int32 getFieldType(ScServiceProvider::Type nOldType)
{ switch (nOldType)
{ case Type::URLFIELD: return text::textfield::Type::URL; case Type::PAGEFIELD: return text::textfield::Type::PAGE; case Type::PAGESFIELD: return text::textfield::Type::PAGES; case Type::DATEFIELD: return text::textfield::Type::DATE; case Type::TIMEFIELD: return text::textfield::Type::TIME; case Type::EXT_TIMEFIELD: return text::textfield::Type::EXTENDED_TIME; case Type::TITLEFIELD: return text::textfield::Type::DOCINFO_TITLE; case Type::FILEFIELD: return text::textfield::Type::EXTENDED_FILE; case Type::SHEETFIELD: return text::textfield::Type::TABLE; default:
;
}
return text::textfield::Type::URL; // default to URL for no reason whatsoever.
}
} // namespace
ScServiceProvider::Type ScServiceProvider::GetProviderType(std::u16string_view rServiceName)
{ if (!rServiceName.empty())
{ for (const ProvNamesId_Type & i : aProvNamesId)
{ if (rServiceName == i.pName)
{ return i.nType;
}
}
for (const ProvNamesId_Type & rOldName : aOldNames)
{ if (rServiceName == rOldName.pName)
{
OSL_FAIL("old service name used"); return rOldName.nType;
}
}
} return Type::INVALID;
}
uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance(
Type nType, ScDocShell* pDocShell )
{
uno::Reference<uno::XInterface> xRet;
switch (nType)
{ case Type::SHEET: // not inserted yet - DocShell=Null
xRet.set(static_cast<sheet::XSpreadsheet*>(new ScTableSheetObj(nullptr,0))); break; case Type::URLFIELD: case Type::PAGEFIELD: case Type::PAGESFIELD: case Type::DATEFIELD: case Type::TIMEFIELD: case Type::EXT_TIMEFIELD: case Type::TITLEFIELD: case Type::FILEFIELD: case Type::SHEETFIELD:
{
uno::Reference<text::XTextRange> xNullContent;
xRet.set(static_cast<text::XTextField*>( new ScEditFieldObj(xNullContent, nullptr, getFieldType(nType), ESelection())));
} break; case Type::CELLSTYLE:
xRet.set(static_cast<style::XStyle*>(new ScStyleObj( nullptr, SfxStyleFamily::Para, OUString() ))); break; case Type::PAGESTYLE:
xRet.set(static_cast<style::XStyle*>(new ScStyleObj( nullptr, SfxStyleFamily::Page, OUString() ))); break; case Type::GRAPHICSTYLE: if (pDocShell)
{
pDocShell->MakeDrawLayer();
xRet.set(static_cast<style::XStyle*>(new ScStyleObj( nullptr, SfxStyleFamily::Frame, OUString() )));
} break; case Type::AUTOFORMAT:
xRet.set(static_cast<container::XIndexAccess*>(new ScAutoFormatObj( SC_AFMTOBJ_INVALID ))); break; case Type::AUTOFORMATS:
xRet.set(static_cast<container::XIndexAccess*>(new ScAutoFormatsObj())); break; case Type::CELLRANGES: // isn't inserted, rather filled // -> DocShell must be set, but empty ranges if (pDocShell)
xRet.set(static_cast<sheet::XSheetCellRanges*>(new ScCellRangesObj( pDocShell, ScRangeList() ))); break; case Type::FUNCTIONDESCRIPTIONS:
xRet.set(static_cast<sheet::XFunctionDescriptions*>(new ScFunctionListObj())); break; case Type::GLOBALSHEETSETTINGS:
xRet.set(static_cast<sheet::XGlobalSheetSettings*>(new ScSpreadsheetSettings())); break; case Type::RECENTFUNCTIONS:
xRet.set(static_cast<sheet::XRecentFunctions*>(new ScRecentFunctionsObj())); break; case Type::DOCDEFLTS: if (pDocShell)
xRet.set(static_cast<beans::XPropertySet*>(new ScDocDefaultsObj( pDocShell ))); break; case Type::DRAWDEFLTS: if (pDocShell)
xRet.set(static_cast<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 Type::GRADTAB: if (pDocShell)
xRet.set(SvxUnoGradientTable_createInstance( pDocShell->MakeDrawLayer() )); break; case Type::HATCHTAB: if (pDocShell)
xRet.set(SvxUnoHatchTable_createInstance( pDocShell->MakeDrawLayer() )); break; case Type::BITMAPTAB: if (pDocShell)
xRet.set(SvxUnoBitmapTable_createInstance( pDocShell->MakeDrawLayer() )); break; case Type::TRGRADTAB: if (pDocShell)
xRet.set(SvxUnoTransGradientTable_createInstance( pDocShell->MakeDrawLayer() )); break; case Type::MARKERTAB: if (pDocShell)
xRet.set(SvxUnoMarkerTable_createInstance( pDocShell->MakeDrawLayer() )); break; case Type::DASHTAB: if (pDocShell)
xRet.set(SvxUnoDashTable_createInstance( pDocShell->MakeDrawLayer() )); break; case Type::NUMRULES: if (pDocShell)
xRet.set(SvxCreateNumRule( pDocShell->MakeDrawLayer() )); break; case Type::DOCSPRSETT: case Type::SHEETDOCSET: case Type::DOCCONF: if (pDocShell)
xRet.set(static_cast<beans::XPropertySet*>(new ScDocumentConfiguration(pDocShell))); break; case Type::IMAP_RECT:
xRet.set(SvUnoImageMapRectangleObject_createInstance( ScShapeObj::GetSupportedMacroItems() )); break; case Type::IMAP_CIRC:
xRet.set(SvUnoImageMapCircleObject_createInstance( ScShapeObj::GetSupportedMacroItems() )); break; case Type::IMAP_POLY:
xRet.set(SvUnoImageMapPolygonObject_createInstance( ScShapeObj::GetSupportedMacroItems() )); break;
// Support creation of GraphicStorageHandler and EmbeddedObjectResolver case Type::EXPORT_GRAPHIC_STORAGE_HANDLER:
xRet.set(getXWeak(new SvXMLGraphicHelper( SvXMLGraphicHelperMode::Write ))); break; case Type::IMPORT_GRAPHIC_STORAGE_HANDLER:
xRet.set(getXWeak(new SvXMLGraphicHelper( SvXMLGraphicHelperMode::Read ))); break; case Type::EXPORT_EOR: if (pDocShell)
xRet.set(getXWeak(new SvXMLEmbeddedObjectHelper( *pDocShell, SvXMLEmbeddedObjectHelperMode::Write ))); break; case Type::IMPORT_EOR: if (pDocShell)
xRet.set(getXWeak(new SvXMLEmbeddedObjectHelper( *pDocShell, SvXMLEmbeddedObjectHelperMode::Read ))); break; case Type::VALBIND: case Type::LISTCELLBIND: if (pDocShell)
{ bool bListPos = ( nType == Type::LISTCELLBIND );
uno::Reference<sheet::XSpreadsheetDocument> xDoc( pDocShell->GetBaseModel(), uno::UNO_QUERY );
xRet.set(*new calc::OCellValueBinding( xDoc, bListPos ));
} break; case Type::LISTSOURCE: if (pDocShell)
{
uno::Reference<sheet::XSpreadsheetDocument> xDoc( pDocShell->GetBaseModel(), uno::UNO_QUERY );
xRet.set(*new calc::OCellListSource( xDoc ));
} break; case Type::CELLADDRESS: case Type::RANGEADDRESS: if (pDocShell)
{ bool bIsRange = ( nType == Type::RANGEADDRESS );
xRet.set(*new ScAddressConversionObj( pDocShell, bIsRange ));
} break; case Type::CHDATAPROV: if (pDocShell)
xRet = *new ScChart2DataProvider( &pDocShell->GetDocument() ); break; case Type::CHART_PIVOTTABLE_DATAPROVIDER: if (pDocShell)
xRet = *new sc::PivotTableDataProvider(pDocShell->GetDocument()); break; case Type::FORMULAPARS: if (pDocShell)
xRet.set(static_cast<sheet::XFormulaParser*>(new ScFormulaParserObj( pDocShell ))); break; case Type::OPCODEMAPPER: if (pDocShell)
{
ScDocument& rDoc = pDocShell->GetDocument();
ScAddress aAddress;
ScCompiler* pComp = new ScCompiler(rDoc, aAddress, rDoc.GetGrammar());
xRet.set(static_cast<sheet::XFormulaOpCodeMapper*>(new ScFormulaOpCodeMapperObj(::std::unique_ptr<formula::FormulaCompiler> (pComp)))); break;
} break; #if HAVE_FEATURE_SCRIPTING case Type::VBAOBJECTPROVIDER: if (pDocShell && pDocShell->GetDocument().IsInVBAMode())
{
xRet.set(static_cast<container::XNameAccess*>(new ScVbaObjectForCodeNameProvider( pDocShell )));
} break; case Type::VBACODENAMEPROVIDER: if ( pDocShell && isInVBAMode( *pDocShell ) )
{
xRet.set(static_cast<document::XCodeNameQuery*>(new ScVbaCodeNameProvider(*pDocShell)));
} break; case Type::VBAGLOBALS: if (pDocShell)
{
uno::Any aGlobs; if ( !pDocShell->GetBasicManager()->GetGlobalUNOConstant( u"VBAGlobals"_ustr, aGlobs ) )
{
uno::Sequence< uno::Any > aArgs{ uno::Any(uno::Reference(static_cast<css::sheet::XSpreadsheetDocument*>(pDocShell->GetModel()))) };
xRet = ::comphelper::getProcessServiceFactory()->createInstanceWithArguments( u"ooo.vba.excel.Globals"_ustr, aArgs );
pDocShell->GetBasicManager()->SetGlobalUNOConstant( u"VBAGlobals"_ustr, uno::Any( xRet ) );
BasicManager* pAppMgr = SfxApplication::GetBasicManager(); if ( pAppMgr )
pAppMgr->SetGlobalUNOConstant( u"ThisExcelDoc"_ustr, aArgs[ 0 ] );
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.