oox/inc/oox/xls/workbookhelper.hxx | 8 ++++++++ oox/source/xls/defnamesbuffer.cxx | 11 ++++------- oox/source/xls/workbookhelper.cxx | 37 +++++++++++++++++++++++++++++++++++++ sc/inc/nameuno.hxx | 10 ++++++---- sc/source/ui/unoobj/nameuno.cxx | 21 +++++++++++---------- 5 files changed, 66 insertions(+), 21 deletions(-)
New commits: commit 67315dcfb0664a35fdd34f86242452bc27df6105 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Thu Oct 27 23:53:34 2011 +0200 use uno for local range name api, it crashs otherwise sometimes diff --git a/sc/inc/nameuno.hxx b/sc/inc/nameuno.hxx index 9d7ca93..c082226 100644 --- a/sc/inc/nameuno.hxx +++ b/sc/inc/nameuno.hxx @@ -38,6 +38,7 @@ #include <com/sun/star/sheet/XNamedRange.hpp> #include <com/sun/star/sheet/XFormulaTokens.hpp> #include <com/sun/star/sheet/XNamedRanges.hpp> +#include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/container/XEnumerationAccess.hpp> #include <com/sun/star/lang/XServiceName.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -69,7 +70,7 @@ private: ScNamedRangesObj* mpParent; ScDocShell* pDocShell; String aName; - ScTableSheetObj* mpSheet; + com::sun::star::uno::Reference< com::sun::star::container::XNamed > mxSheet; private: ScRangeData* GetRangeData_Impl(); @@ -80,7 +81,8 @@ private: SCTAB GetTab_Impl(); public: - ScNamedRangeObj(ScNamedRangesObj* pParent, ScDocShell* pDocSh, const String& rNm, ScTableSheetObj* pSheet = NULL); + ScNamedRangeObj(ScNamedRangesObj* pParent, ScDocShell* pDocSh, const String& rNm, + com::sun::star::uno::Reference< com::sun::star::container::XNamed > xSheet = com::sun::star::uno::Reference< com::sun::star::container::XNamed > ()); virtual ~ScNamedRangeObj(); virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); @@ -337,9 +339,9 @@ private: virtual ScRangeName* GetRangeName_Impl(); virtual SCTAB GetTab_Impl(); - ScTableSheetObj* mpSheet; + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > mxSheet; public: - ScLocalNamedRangesObj(ScDocShell* pDocSh, ScTableSheetObj* pSheet); + ScLocalNamedRangesObj(ScDocShell* pDocSh, ::com::sun::star::uno::Reference< com::sun::star::container::XNamed > xNamed ); virtual ~ScLocalNamedRangesObj(); }; diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx index 3726eb7..7e9a52d 100644 --- a/sc/source/ui/unoobj/nameuno.cxx +++ b/sc/source/ui/unoobj/nameuno.cxx @@ -99,11 +99,11 @@ bool lcl_UserVisibleName(const ScRangeData& rData) return !rData.HasType(RT_DATABASE) && !rData.HasType(RT_SHARED); } -ScNamedRangeObj::ScNamedRangeObj(ScNamedRangesObj* pParent, ScDocShell* pDocSh, const String& rNm, ScTableSheetObj* pSheet) : +ScNamedRangeObj::ScNamedRangeObj(ScNamedRangesObj* pParent, ScDocShell* pDocSh, const String& rNm, Reference<container::XNamed> xSheet): mpParent(pParent), pDocShell( pDocSh ), aName( rNm ), - mpSheet( pSheet ) + mxSheet( xSheet ) { pDocShell->GetDocument()->AddUnoObject(*this); } @@ -147,13 +147,14 @@ ScRangeData* ScNamedRangeObj::GetRangeData_Impl() SCTAB ScNamedRangeObj::GetTab_Impl() { - if (mpSheet) + if (mxSheet.is()) { if (!pDocShell) return -2; ScDocument* pDoc = pDocShell->GetDocument(); SCTAB nTab; - pDoc->GetTable(mpSheet->getName(), nTab); + rtl::OUString sName = mxSheet->getName(); + pDoc->GetTable(sName, nTab); return nTab; } else @@ -922,9 +923,9 @@ SCTAB ScGlobalNamedRangesObj::GetTab_Impl() //------------------------------------------------------------------------ -ScLocalNamedRangesObj::ScLocalNamedRangesObj( ScDocShell* pDocSh, ScTableSheetObj* pSheet ) +ScLocalNamedRangesObj::ScLocalNamedRangesObj( ScDocShell* pDocSh, uno::Reference<container::XNamed> xSheet ) : ScNamedRangesObj(pDocSh), - mpSheet(pSheet) + mxSheet(xSheet) { } @@ -937,7 +938,7 @@ ScLocalNamedRangesObj::~ScLocalNamedRangesObj() ScNamedRangeObj* ScLocalNamedRangesObj::GetObjectByName_Impl(const ::rtl::OUString& aName) { if ( pDocShell && hasByName( aName ) ) - return new ScNamedRangeObj( this, pDocShell, String(aName), mpSheet); + return new ScNamedRangeObj( this, pDocShell, String(aName), mxSheet); return NULL; } @@ -947,7 +948,7 @@ ScNamedRangeObj* ScLocalNamedRangesObj::GetObjectByIndex_Impl( sal_uInt16 nIndex if (!pDocShell) return NULL; - rtl::OUString aName = mpSheet->getName(); + rtl::OUString aName = mxSheet->getName(); ScDocument* pDoc = pDocShell->GetDocument(); SCTAB nTab; pDoc->GetTable( aName, nTab ); @@ -963,7 +964,7 @@ ScNamedRangeObj* ScLocalNamedRangesObj::GetObjectByIndex_Impl( sal_uInt16 nIndex if (lcl_UserVisibleName(*itr)) { if (nPos == nIndex) - return new ScNamedRangeObj(this, pDocShell, itr->GetName(), mpSheet); + return new ScNamedRangeObj(this, pDocShell, itr->GetName(), mxSheet); } ++nPos; } @@ -979,7 +980,7 @@ ScRangeName* ScLocalNamedRangesObj::GetRangeName_Impl() SCTAB ScLocalNamedRangesObj::GetTab_Impl() { SCTAB nTab; - pDocShell->GetDocument()->GetTable(mpSheet->getName(), nTab); + pDocShell->GetDocument()->GetTable(mxSheet->getName(), nTab); return nTab; } commit 35896a678b004a84bafc54fd3e08dfc97a0d4886 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Thu Oct 27 23:52:35 2011 +0200 add xlsx local range name import diff --git a/oox/inc/oox/xls/workbookhelper.hxx b/oox/inc/oox/xls/workbookhelper.hxx index bb9a3d2..e0310b8 100644 --- a/oox/inc/oox/xls/workbookhelper.hxx +++ b/oox/inc/oox/xls/workbookhelper.hxx @@ -192,6 +192,14 @@ public: ::rtl::OUString& orName, sal_Int32 nNameFlags = 0 ) const; + /** Creates and returns a defined name on-the-fly in the sheet. + The name will not be buffered in the global defined names buffer. + @param orName (in/out-parameter) Returns the resulting used name. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > + createLocalNamedRangeObject( + ::rtl::OUString& orName, + sal_Int32 nNameFlags = 0, sal_Int32 nTab = -1 ) const; + /** Creates and returns a database range on-the-fly in the Calc document. The range will not be buffered in the global table buffer. @param orName (in/out-parameter) Returns the resulting used name. */ diff --git a/oox/source/xls/defnamesbuffer.cxx b/oox/source/xls/defnamesbuffer.cxx index fce1bfb..e2319ca 100644 --- a/oox/source/xls/defnamesbuffer.cxx +++ b/oox/source/xls/defnamesbuffer.cxx @@ -489,12 +489,6 @@ void DefinedName::createNameObject() maCalcName = isBuiltinName() ? lclGetPrefixedName( mcBuiltinId ) : maModel.maName; // #163146# do not rename sheet-local names by default, this breaks VBA scripts -#if 0 - // append sheet index for local names in multi-sheet documents - if( isWorkbookFile() && !isGlobalName() ) - maCalcName = OUStringBuffer( maCalcName ).append( sal_Unicode( '_' ) ). - append( static_cast< sal_Int32 >( mnCalcSheet + 1 ) ).makeStringAndClear(); -#endif // special flags for this name sal_Int32 nNameFlags = 0; @@ -507,7 +501,10 @@ void DefinedName::createNameObject() } // create the name and insert it into the document, maCalcName will be changed to the resulting name - mxNamedRange = createNamedRangeObject( maCalcName, nNameFlags ); + if (maModel.mnSheet >= 0) + mxNamedRange = createLocalNamedRangeObject( maCalcName, nNameFlags, maModel.mnSheet ); + else + mxNamedRange = createNamedRangeObject( maCalcName, nNameFlags ); // index of this defined name used in formula token arrays PropertySet aPropSet( mxNamedRange ); aPropSet.getProperty( mnTokenIndex, PROP_TokenIndex ); diff --git a/oox/source/xls/workbookhelper.cxx b/oox/source/xls/workbookhelper.cxx index 3c45aeb..3cc56cd 100644 --- a/oox/source/xls/workbookhelper.cxx +++ b/oox/source/xls/workbookhelper.cxx @@ -41,6 +41,7 @@ #include <com/sun/star/style/XStyle.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/container/XNamed.hpp> #include <osl/thread.h> #include "oox/drawingml/theme.hxx" #include "oox/helper/progressbar.hxx" @@ -68,6 +69,8 @@ #include "oox/xls/workbooksettings.hxx" #include "oox/xls/worksheetbuffer.hxx" +#include <iostream> + namespace oox { namespace xls { @@ -140,6 +143,8 @@ public: Reference< XStyle > getStyleObject( const OUString& rStyleName, bool bPageStyle ) const; /** Creates and returns a defined name on-the-fly in the Calc document. */ Reference< XNamedRange > createNamedRangeObject( OUString& orName, sal_Int32 nNameFlags ) const; + /** Creates and returns a defined name on the-fly in the correct Calc sheet. */ + Reference< XNamedRange > createLocalNamedRangeObject( OUString& orName, sal_Int32 nNameFlags, sal_Int32 nTab ) const; /** Creates and returns a database range on-the-fly in the Calc document. */ Reference< XDatabaseRange > createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const; /** Creates and returns an unnamed database range on-the-fly in the Calc document. */ @@ -378,6 +383,33 @@ Reference< XNamedRange > WorkbookGlobals::createNamedRangeObject( OUString& orNa return xNamedRange; } +Reference< XNamedRange > WorkbookGlobals::createLocalNamedRangeObject( OUString& orName, sal_Int32 nNameFlags, sal_Int32 nTab ) const +{ + // create the name and insert it into the Calc document + Reference< XNamedRange > xNamedRange; + if( orName.getLength() > 0 ) try + { + // find an unused name + Reference< XIndexAccess > xSheets(mxDoc->getSheets(), UNO_QUERY_THROW); + Reference< XSpreadsheet > xSheet (xSheets->getByIndex(nTab), UNO_QUERY_THROW); + Reference< com::sun::star::container::XNamed > xNamed(xSheet, UNO_QUERY_THROW); + rtl::OUString aName = xNamed->getName(); + std::cout << "sheetName: " << rtl::OUStringToOString( aName, RTL_TEXTENCODING_UTF8).getStr() << std::endl; + PropertySet aSheetProps( xSheet ); + Reference< XNamedRanges > xNamedRanges( aSheetProps.getAnyProperty( PROP_NamedRanges ), UNO_QUERY_THROW ); + Reference< XNameAccess > xNameAccess( xNamedRanges, UNO_QUERY_THROW ); + orName = ContainerHelper::getUnusedName( xNameAccess, orName, '_' ); + // create the named range + xNamedRanges->addNewByName( orName, OUString(), CellAddress( 0, 0, 0 ), nNameFlags ); + xNamedRange.set( xNamedRanges->getByName( orName ), UNO_QUERY ); + } + catch( Exception& ) + { + } + OSL_ENSURE( xNamedRange.is(), "WorkbookGlobals::createLocalNamedRangeObject - cannot create defined name" ); + return xNamedRange; +} + Reference< XDatabaseRange > WorkbookGlobals::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const { // validate cell range @@ -773,6 +805,11 @@ Reference< XNamedRange > WorkbookHelper::createNamedRangeObject( OUString& orNam return mrBookGlob.createNamedRangeObject( orName, nNameFlags ); } +Reference< XNamedRange > WorkbookHelper::createLocalNamedRangeObject( OUString& orName, sal_Int32 nNameFlags, sal_Int32 nTab ) const +{ + return mrBookGlob.createLocalNamedRangeObject( orName, nNameFlags, nTab ); +} + Reference< XDatabaseRange > WorkbookHelper::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const { return mrBookGlob.createDatabaseRangeObject( orName, rRangeAddr ); _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits