diff options
-rw-r--r-- | offapi/UnoApi_offapi.mk | 1 | ||||
-rw-r--r-- | offapi/com/sun/star/sheet/XSpreadsheets2.idl | 75 | ||||
-rw-r--r-- | sc/inc/docuno.hxx | 11 | ||||
-rw-r--r-- | sc/source/ui/unoobj/docuno.cxx | 59 | ||||
-rw-r--r-- | sc/xml/ScTableSheetsObj.xml | 1 |
5 files changed, 135 insertions, 12 deletions
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index 43282063d0ff..f63ddd30d10c 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -3458,6 +3458,7 @@ $(eval $(call gb_UnoApiTarget_add_idlfiles,offapi,offapi/com/sun/star/sheet,\ XSpreadsheetDocument \ XSpreadsheetView \ XSpreadsheets \ + XSpreadsheets2 \ XSubTotalCalculatable \ XSubTotalDescriptor \ XSubTotalField \ diff --git a/offapi/com/sun/star/sheet/XSpreadsheets2.idl b/offapi/com/sun/star/sheet/XSpreadsheets2.idl new file mode 100644 index 000000000000..c4f8af13e2e0 --- /dev/null +++ b/offapi/com/sun/star/sheet/XSpreadsheets2.idl @@ -0,0 +1,75 @@ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * + * Author(s): Laurent Godard <lgodard.libre@laposte.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#ifndef __com_sun_star_table_XSpreadsheets2_idl__ +#define __com_sun_star_table_XSpreadsheets2_idl__ + +#include <com/sun/star/sheet/XSpreadsheets.idl> +#include <com/sun/star/sheet/XSpreadsheetDocument.idl> +#include <com/sun/star/lang/IllegalArgumentException.idl> +#include <com/sun/star/uno/RuntimeException.idl> + +//============================================================================= + +module com { module sun { module star { module sheet { + +//============================================================================= + +/** extends XSpreadsheets interface to import external sheets. + + @see com::sun::star::sheet::Spreadsheets + */ +interface XSpreadsheets2: com::sun::star::sheet::XSpreadsheets +{ + /** copies a sheet from a source document. + + @param srcDoc + a valid XSpreadsheetDocument reference to source doc + + @param srcName + the source sheet name. + + @param nDestPosition + the destination sheet position. + + @returns the position of the imported sheet or -1 if not imported + + @throws ::com::sun::star::lang::IllegalArgumentException + @throws ::com::sun::star::uno::RuntimeException + + @since LibreOffice 3.5 + */ + long importSheet( + [in] com::sun::star::sheet::XSpreadsheetDocument srcDoc, + [in] string srcName, + [in] long nDestPosition) + raises (com::sun::star::lang::IllegalArgumentException, + com::sun::star::uno::RuntimeException); +}; + +//============================================================================= + +}; }; }; }; + +#endif + diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index 5c5ad863b140..1ca0d7165dd1 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -44,6 +44,7 @@ #include <com/sun/star/sheet/XScenarios.hpp> #include <com/sun/star/sheet/XConsolidatable.hpp> #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> +#include <com/sun/star/sheet/XSpreadsheets2.hpp> #include <com/sun/star/sheet/XDocumentAuditing.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/util/XProtectable.hpp> @@ -371,7 +372,7 @@ public: class ScTableSheetsObj : public cppu::WeakImplHelper5< - com::sun::star::sheet::XSpreadsheets, + com::sun::star::sheet::XSpreadsheets2, com::sun::star::sheet::XCellRangesAccess, com::sun::star::container::XEnumerationAccess, com::sun::star::container::XIndexAccess, @@ -399,6 +400,14 @@ public: const ::rtl::OUString& aCopy, sal_Int16 nDestination ) throw(::com::sun::star::uno::RuntimeException); + // XSpreadsheets2 + virtual sal_Int32 SAL_CALL importSheet( + const ::com::sun::star::uno::Reference < + ::com::sun::star::sheet::XSpreadsheetDocument > & xDocSrc, + const rtl::OUString& srcName, + const sal_Int32 nDestPosition) + throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + // XCellRangesAccess virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 46f94f8d52e7..95632e613611 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -2433,8 +2433,7 @@ ScTableSheetObj* ScTableSheetsObj::GetObjectByName_Impl(const rtl::OUString& aNa if (pDocShell) { SCTAB nIndex; - String aString(aName); - if ( pDocShell->GetDocument()->GetTable( aString, nIndex ) ) + if ( pDocShell->GetDocument()->GetTable( aName, nIndex ) ) return new ScTableSheetObj( pDocShell, nIndex ); } return NULL; @@ -2462,9 +2461,8 @@ void SAL_CALL ScTableSheetsObj::moveByName( const rtl::OUString& aName, sal_Int1 sal_Bool bDone = false; if (pDocShell) { - String aNamStr(aName); SCTAB nSource; - if ( pDocShell->GetDocument()->GetTable( aNamStr, nSource ) ) + if ( pDocShell->GetDocument()->GetTable( aName, nSource ) ) bDone = pDocShell->MoveTable( nSource, nDestination, false, sal_True ); } if (!bDone) @@ -2479,10 +2477,9 @@ void SAL_CALL ScTableSheetsObj::copyByName( const rtl::OUString& aName, sal_Bool bDone = false; if (pDocShell) { - String aNamStr(aName); String aNewStr(aCopy); SCTAB nSource; - if ( pDocShell->GetDocument()->GetTable( aNamStr, nSource ) ) + if ( pDocShell->GetDocument()->GetTable( aName, nSource ) ) { bDone = pDocShell->MoveTable( nSource, nDestination, sal_True, sal_True ); if (bDone) @@ -2572,14 +2569,14 @@ void SAL_CALL ScTableSheetsObj::replaceByName( const rtl::OUString& aName, const ScTableSheetObj* pSheetObj = ScTableSheetObj::getImplementation( xInterface ); if ( pSheetObj && !pSheetObj->GetDocShell() ) // noch nicht eingefuegt? { - String aNamStr(aName); SCTAB nPosition; - if ( pDocShell->GetDocument()->GetTable( aNamStr, nPosition ) ) + if ( pDocShell->GetDocument()->GetTable( aName, nPosition ) ) { ScDocFunc aFunc(*pDocShell); if ( aFunc.DeleteTable( nPosition, sal_True, sal_True ) ) { // InsertTable kann jetzt eigentlich nicht schiefgehen... + String aNamStr(aName); bDone = aFunc.InsertTable( nPosition, aNamStr, sal_True, sal_True ); if (bDone) pSheetObj->InitInsertSheet( pDocShell, nPosition ); @@ -2616,8 +2613,7 @@ void SAL_CALL ScTableSheetsObj::removeByName( const rtl::OUString& aName ) if (pDocShell) { SCTAB nIndex; - String aString(aName); - if ( pDocShell->GetDocument()->GetTable( aString, nIndex ) ) + if ( pDocShell->GetDocument()->GetTable( aName, nIndex ) ) { ScDocFunc aFunc(*pDocShell); bDone = aFunc.DeleteTable( nIndex, sal_True, sal_True ); @@ -2633,6 +2629,47 @@ void SAL_CALL ScTableSheetsObj::removeByName( const rtl::OUString& aName ) throw uno::RuntimeException(); // NoSuchElementException is handled above } +sal_Int32 ScTableSheetsObj::importSheet( + const uno::Reference < sheet::XSpreadsheetDocument > & xDocSrc, + const rtl::OUString& srcName, const sal_Int32 nDestPosition ) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + //pDocShell is the destination + ScDocument* pDocDest = pDocShell->GetDocument(); + + // Source document docShell + if ( !xDocSrc.is() ) + throw uno::RuntimeException(); + ScModelObj* pObj = ScModelObj::getImplementation(xDocSrc); + ScDocShell* pDocShellSrc = static_cast<ScDocShell*>(pObj->GetEmbeddedObject()); + + SCTAB nIndexDest; + nIndexDest = -1; + + // SourceSheet Position and does srcName exists ? + SCTAB nIndexSrc; + if ( !pDocShellSrc->GetDocument()->GetTable( srcName, nIndexSrc ) ) + throw lang::IllegalArgumentException(); + + // control nDestPosition < maxtab + SCTAB nCount = pDocDest->GetTableCount(); + nIndexDest = static_cast<SCTAB>(nDestPosition); + if ( nIndexDest > nCount ) + nIndexDest = nCount; + + // control nDestPosition > 0 + if ( nIndexDest < 0) + nIndexDest = 0; + + // Transfert Tab + bool bInsertNew = true; + bool bNotifyAndPaint = true; + pDocShell->TransferTab( + *pDocShellSrc, nIndexSrc, nIndexDest, bInsertNew, bNotifyAndPaint ); + + return nIndexDest; +} + // XCellRangesAccess uno::Reference< table::XCell > SAL_CALL ScTableSheetsObj::getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow, sal_Int32 nSheet ) @@ -2772,7 +2809,7 @@ sal_Bool SAL_CALL ScTableSheetsObj::hasByName( const rtl::OUString& aName ) if (pDocShell) { SCTAB nIndex; - if ( pDocShell->GetDocument()->GetTable( String(aName), nIndex ) ) + if ( pDocShell->GetDocument()->GetTable( aName, nIndex ) ) return sal_True; } return false; diff --git a/sc/xml/ScTableSheetsObj.xml b/sc/xml/ScTableSheetsObj.xml index e17cbb012671..2a7d8dd339d2 100644 --- a/sc/xml/ScTableSheetsObj.xml +++ b/sc/xml/ScTableSheetsObj.xml @@ -216,6 +216,7 @@ <type>com.sun.star.sheet.XSpreadsheet</type> <type>com.sun.star.sheet.XSpreadsheetDocument</type> <type>com.sun.star.sheet.XSpreadsheets</type> + <type>com.sun.star.sheet.XSpreadsheets2</type> <type>com.sun.star.sheet.XSubTotalCalculatable</type> <type>com.sun.star.sheet.XSubTotalDescriptor</type> <type>com.sun.star.sheet.XSubTotalField</type> |