ooo-build r14086 - trunk/patches/test/vba



Author: noelpwer
Date: Thu Sep 25 17:37:06 2008
New Revision: 14086
URL: http://svn.gnome.org/viewvc/ooo-build?rev=14086&view=rev

Log:
backup this patch


Added:
   trunk/patches/test/vba/vba-intersection-union.diff

Added: trunk/patches/test/vba/vba-intersection-union.diff
==============================================================================
--- (empty file)
+++ trunk/patches/test/vba/vba-intersection-union.diff	Thu Sep 25 17:37:06 2008
@@ -0,0 +1,436 @@
+diff --git sc/source/ui/unoobj/.funcuno.cxx.swp sc/source/ui/unoobj/.funcuno.cxx.swp
+deleted file mode 100644
+index 481401c..0000000
+Files sc/source/ui/unoobj/.funcuno.cxx.swp and /dev/null differ
+diff --git sc/source/ui/vba/vbaapplication.cxx sc/source/ui/vba/vbaapplication.cxx
+index b451440..1c7960a 100644
+--- sc/source/ui/vba/vbaapplication.cxx
++++ sc/source/ui/vba/vbaapplication.cxx
+@@ -868,177 +868,263 @@ ScVbaApplication::PathSeparator(  ) thro
+ 	return sPathSep;
+ }
+ 
++typedef std::list< ScRange > Ranges;
++typedef std::list< ScRangeList > RangesList;
++
++void lcl_addRangesToVec( RangesList& vRanges, const uno::Any& aArg ) throw ( script::BasicErrorException, uno::RuntimeException )
++{
++    ScRangeList theRanges;
++    uno::Reference< excel::XRange > xRange( aArg, uno::UNO_QUERY_THROW );
++    uno::Reference< vba::XCollection > xCol( xRange->Areas( uno::Any() ), uno::UNO_QUERY_THROW );
++    sal_Int32 nCount = xCol->getCount();
++    for( sal_Int32 i = 1; i <= nCount; ++i )
++    {
++        uno::Reference< excel::XRange > xAreaRange( xCol->Item( uno::makeAny( sal_Int32(i) ), uno::Any() ), uno::UNO_QUERY_THROW );
++        uno::Reference< sheet::XCellRangeAddressable > xAddressable( xAreaRange->getCellRange(), uno::UNO_QUERY_THROW );
++        table::CellRangeAddress addr = xAddressable->getRangeAddress(); 
++        ScRange refRange;
++        ScUnoConversion::FillScRange( refRange, addr );
++        theRanges.Append( refRange );
++    }
++    vRanges.push_back( theRanges );
++}
++void lcl_addRangeToVec( Ranges& vRanges, const uno::Any& aArg ) throw ( script::BasicErrorException, uno::RuntimeException )
++{
++    uno::Reference< excel::XRange > xRange( aArg, uno::UNO_QUERY_THROW );
++    uno::Reference< vba::XCollection > xCol( xRange->Areas( uno::Any() ), uno::UNO_QUERY_THROW );
++    sal_Int32 nCount = xCol->getCount();
++    for( sal_Int32 i = 1; i <= nCount; ++i )
++    {
++        uno::Reference< excel::XRange > xAreaRange( xCol->Item( uno::makeAny( sal_Int32(i) ), uno::Any() ), uno::UNO_QUERY_THROW );
++        uno::Reference< sheet::XCellRangeAddressable > xAddressable( xAreaRange->getCellRange(), uno::UNO_QUERY_THROW );
++        table::CellRangeAddress addr = xAddressable->getRangeAddress(); 
++        ScRange refRange;
++        ScUnoConversion::FillScRange( refRange, addr );
++        vRanges.push_back( refRange );
++    }
++}
++void lcl_strip_containedRanges( Ranges& vRanges )
++{
++	// get rid of ranges that are surrounded by other ranges
++	for( Ranges::iterator it = vRanges.begin(); it != vRanges.end(); ++it )
++	{
++		for( Ranges::iterator it_inner = vRanges.begin(); it_inner != vRanges.end(); ++it_inner )
++		{
++			if ( it != it_inner )
++			{
++				if ( it->In( *it_inner ) )
++					it_inner = vRanges.erase( it_inner );
++                else if ( it_inner->In( *it ) )
++					it = vRanges.erase( it );
++			}
++		}
++	}
++    
++}
+ uno::Reference< excel::XRange > SAL_CALL 
+ ScVbaApplication::Intersect( const uno::Reference< excel::XRange >& Arg1, const uno::Reference< excel::XRange >& Arg2, const uno::Any& Arg3, const uno::Any& Arg4, const uno::Any& Arg5, const uno::Any& Arg6, const uno::Any& Arg7, const uno::Any& Arg8, const uno::Any& Arg9, const uno::Any& Arg10, const uno::Any& Arg11, const uno::Any& Arg12, const uno::Any& Arg13, const uno::Any& Arg14, const uno::Any& Arg15, const uno::Any& Arg16, const uno::Any& Arg17, const uno::Any& Arg18, const uno::Any& Arg19, const uno::Any& Arg20, const uno::Any& Arg21, const uno::Any& Arg22, const uno::Any& Arg23, const uno::Any& Arg24, const uno::Any& Arg25, const uno::Any& Arg26, const uno::Any& Arg27, const uno::Any& Arg28, const uno::Any& Arg29, const uno::Any& Arg30 ) throw (script::BasicErrorException, uno::RuntimeException)
+ {
+-	std::vector< uno::Reference< excel::XRange > > vRanges;
+ 	if ( !Arg1.is() || !Arg2.is() )
+ 		DebugHelper::exception(SbERR_BAD_PARAMETER, rtl::OUString() );
+ 
+-	vRanges.push_back( Arg1 );
+-	vRanges.push_back( Arg2 );
++	RangesList vRanges;
++	lcl_addRangesToVec( vRanges, uno::makeAny( Arg1 ) );
++	lcl_addRangesToVec( vRanges, uno::makeAny( Arg2 ) );
+ 
+ 	if ( Arg3.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg3, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg3 );
+ 	if ( Arg4.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg4, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg4 );
+ 	if ( Arg5.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg5, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg5 );
+ 	if ( Arg6.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg6, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg6 );
+ 	if ( Arg7.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg7, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg7 );
+ 	if ( Arg8.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg8, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg8 );
+ 	if ( Arg9.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg9, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg9 );
+ 	if ( Arg10.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg10, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg10 );
+ 	if ( Arg11.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg11, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg11 );
+ 	if ( Arg12.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg12, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg12 );
+ 	if ( Arg13.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg13, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg13 );
+ 	if ( Arg14.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg14, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg14 );
+ 	if ( Arg15.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg15, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg15 );
+ 	if ( Arg16.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg16, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg16 );
+ 	if ( Arg17.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg17, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg17 );
+ 	if ( Arg18.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg18, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg18 );
+ 	if ( Arg19.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg19, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg19 );
+ 	if ( Arg20.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg20, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg20 );
+ 	if ( Arg21.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg21, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg21 );
+ 	if ( Arg22.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg22, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg22 );
+ 	if ( Arg23.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg23, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg23 );
+ 	if ( Arg24.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg24, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg24 );
+ 	if ( Arg25.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg25, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg25 );
+ 	if ( Arg26.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg26, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg26 );
+ 	if ( Arg27.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg27, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg27 );
+ 	if ( Arg28.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg28, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg28 );
+ 	if ( Arg29.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg29, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg29 );
+ 	if ( Arg30.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg30, uno::UNO_QUERY_THROW ) );
++		lcl_addRangesToVec( vRanges, Arg30 );
+ 
+-	std::vector< uno::Reference< excel::XRange > >::iterator it = vRanges.begin();
+-	std::vector< uno::Reference< excel::XRange > >::iterator it_end = vRanges.end();
+-
+-	uno::Reference< excel::XRange > xRefRange( *it );
+-	++it;
+-	for ( ; it != it_end; ++it )
++    uno::Reference< excel::XRange > xRefRange; 
++    ScRange aIntersection;
++    ScRangeList aCellRanges;
++    Ranges intersections;
++	for( RangesList::iterator it = vRanges.begin(); it != vRanges.end(); ++it )
+ 	{
+-		ScVbaRange* pRange = dynamic_cast< ScVbaRange * >( xRefRange.get());
+-		if ( pRange )
+-			xRefRange = pRange->intersect( *it );
+-		if ( !xRefRange.is() )
+-			return uno::Reference< excel::XRange >();
+-	}
++		for( RangesList::iterator it_inner = vRanges.begin(); it_inner != vRanges.end(); ++it_inner )
++		{
++			if ( it != it_inner )
++			{
++                for ( USHORT x = 0 ; x < it->Count(); ++x )
++				{
++                	for ( USHORT y = 0 ; y < it_inner->Count(); ++y )
++					{
++	        			if( it->GetObject( x )->Intersects( *it_inner->GetObject( y ) ) )
++						{     
++				        	aIntersection = ScRange( Max( it->GetObject( x )->aStart.Col(), it_inner->GetObject( y )->aStart.Col() ),
++										Max( it->GetObject( x )->aStart.Row(), it_inner->GetObject( y )->aStart.Row() ),
++										Max( it->GetObject( x )->aStart.Tab(), it_inner->GetObject( y )->aStart.Tab() ),
++										Min( it->GetObject( x )->aEnd.Col(), it_inner->GetObject( y )->aEnd.Col() ),
++										Min( it->GetObject( x )->aEnd.Row(), it_inner->GetObject( y )->aEnd.Row() ),
++										Min( it->GetObject( x )->aEnd.Tab(), it_inner->GetObject( y )->aEnd.Tab() ) );
++							intersections.push_back( aIntersection );
++						}
++					}
++				}
++			}
++        }
++    }
++    // strip out intersections contained by other intesections
++    lcl_strip_containedRanges( intersections );
++	for( Ranges::iterator it = intersections.begin(); it != intersections.end(); ++it )
++		aCellRanges.Join( *it );
++
++	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
++    ScDocShell* pDocShell = getDocShell( xModel );
++    if ( aCellRanges.Count() == 1 )
++    {
++	    xRefRange = new ScVbaRange( uno::Reference< vba::XHelperInterface >(), mxContext, new ScCellRangeObj( pDocShell, *aCellRanges.First() ) );
++    }
++    else if ( aCellRanges.Count() > 1 )
++    {
++		uno::Reference< sheet::XSheetCellRangeContainer > xRanges( new ScCellRangesObj( pDocShell, aCellRanges ) );
++        xRefRange = new ScVbaRange( uno::Reference< vba::XHelperInterface >(), mxContext, xRanges );
++
++    }
+ 	return xRefRange;
+ }
+ 
+ uno::Reference< excel::XRange > SAL_CALL 
+ ScVbaApplication::Union( const uno::Reference< excel::XRange >& Arg1, const uno::Reference< excel::XRange >& Arg2, const uno::Any& Arg3, const uno::Any& Arg4, const uno::Any& Arg5, const uno::Any& Arg6, const uno::Any& Arg7, const uno::Any& Arg8, const uno::Any& Arg9, const uno::Any& Arg10, const uno::Any& Arg11, const uno::Any& Arg12, const uno::Any& Arg13, const uno::Any& Arg14, const uno::Any& Arg15, const uno::Any& Arg16, const uno::Any& Arg17, const uno::Any& Arg18, const uno::Any& Arg19, const uno::Any& Arg20, const uno::Any& Arg21, const uno::Any& Arg22, const uno::Any& Arg23, const uno::Any& Arg24, const uno::Any& Arg25, const uno::Any& Arg26, const uno::Any& Arg27, const uno::Any& Arg28, const uno::Any& Arg29, const uno::Any& Arg30 ) throw (script::BasicErrorException, uno::RuntimeException)
+ {
+-	std::vector< uno::Reference< excel::XRange > > vRanges;
+ 	if ( !Arg1.is() || !Arg2.is() )
+ 		DebugHelper::exception(SbERR_BAD_PARAMETER, rtl::OUString() );
+ 
+-	vRanges.push_back( Arg1 );
+-	vRanges.push_back( Arg2 );
++	uno::Reference< excel::XRange > xRange;
++	Ranges vRanges;
++	lcl_addRangeToVec( vRanges, uno::makeAny( Arg1 ) );
++	lcl_addRangeToVec( vRanges, uno::makeAny( Arg2 ) );
+ 
+ 	if ( Arg3.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg3, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg3 );
+ 	if ( Arg4.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg4, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg4 );
+ 	if ( Arg5.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg5, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg5 );
+ 	if ( Arg6.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg6, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg6 );
+ 	if ( Arg7.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg7, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg7 );
+ 	if ( Arg8.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg8, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg8 );
+ 	if ( Arg9.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg9, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg9 );
+ 	if ( Arg10.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg10, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg10 );
+ 	if ( Arg11.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg11, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg11 );
+ 	if ( Arg12.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg12, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg12 );
+ 	if ( Arg13.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg13, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg13 );
+ 	if ( Arg14.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg14, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg14 );
+ 	if ( Arg15.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg15, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg15 );
+ 	if ( Arg16.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg16, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg16 );
+ 	if ( Arg17.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg17, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg17 );
+ 	if ( Arg18.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg18, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg18 );
+ 	if ( Arg19.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg19, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg19 );
+ 	if ( Arg20.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg20, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg20 );
+ 	if ( Arg21.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg21, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg21 );
+ 	if ( Arg22.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg22, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg22 );
+ 	if ( Arg23.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg23, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg23 );
+ 	if ( Arg24.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg24, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg24 );
+ 	if ( Arg25.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg25, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg25 );
+ 	if ( Arg26.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg26, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg26 );
+ 	if ( Arg27.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg27, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg27 );
+ 	if ( Arg28.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg28, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg28 );
+ 	if ( Arg29.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg29, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg29 );
+ 	if ( Arg30.hasValue() )
+-		vRanges.push_back( uno::Reference< excel::XRange >( Arg30, uno::UNO_QUERY_THROW ) );
++		lcl_addRangeToVec( vRanges, Arg30 );
+ 
+-	std::vector< uno::Reference< excel::XRange > >::iterator it = vRanges.begin();
+-	std::vector< uno::Reference< excel::XRange > >::iterator it_end = vRanges.end();
++	ScRangeList aCellRanges;
++	lcl_strip_containedRanges( vRanges );
+ 
+-    uno::Reference< excel::XRange > xRange;
+-    ScRangeList aCellRanges;
+-    for( ; it != it_end; ++it )
+-    {
+-        xRange = *it;
+-        uno::Reference< table::XCellRange > xRangeParam;
+-        xRange->getCellRange() >>= xRangeParam;
+-        uno::Reference< sheet::XCellRangeAddressable > xAddressable( xRangeParam, uno::UNO_QUERY_THROW );
+-        ScRange refRange;
+-        ScUnoConversion::FillScRange( refRange, xAddressable->getRangeAddress() );
+-        aCellRanges.Append( refRange );
+-    }
++	for( Ranges::iterator it = vRanges.begin(); it != vRanges.end(); ++it )
++		aCellRanges.Append( *it );
+ 
+ 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
+     ScDocShell* pDocShell = getDocShell( xModel ); 
+-    uno::Reference< sheet::XSheetCellRangeContainer > xRanges( new ScCellRangesObj( pDocShell, aCellRanges ) );
++	if ( aCellRanges.Count() == 1 ) 
++	{
++	// normal range
++		xRange = new ScVbaRange( uno::Reference< vba::XHelperInterface >(), mxContext, new ScCellRangeObj( pDocShell, *aCellRanges.First() ) );
++	}
++	else if ( aCellRanges.Count() > 1 ) // Multi-Area
++	{
++    	uno::Reference< sheet::XSheetCellRangeContainer > xRanges( new ScCellRangesObj( pDocShell, aCellRanges ) );
++    	xRange = new ScVbaRange( uno::Reference< vba::XHelperInterface >(), mxContext, xRanges );
++	}
++	
+     // #FIXME need proper (WorkSheet) parent
+-    xRange = new ScVbaRange( uno::Reference< vba::XHelperInterface >(), mxContext, xRanges );
+ 	return xRange;
+ }
+ 
+diff --git sc/source/ui/vba/vbarange.cxx sc/source/ui/vba/vbarange.cxx
+index 1dde272..fcce0aa 100644
+--- sc/source/ui/vba/vbarange.cxx
++++ sc/source/ui/vba/vbarange.cxx
+@@ -5318,57 +5318,6 @@ ScVbaRange::Subtotal( ::sal_Int32 _nGrou
+ 	}
+ }
+ 
+-uno::Reference< excel::XRange > 
+-ScVbaRange::intersect( const css::uno::Reference< oo::excel::XRange >& xRange ) throw (script::BasicErrorException, uno::RuntimeException)
+-{
+-	uno::Reference< excel::XRange > xResult;
+-	sal_Int32 nLen = m_Areas->getCount();
+-	if ( nLen > 1 ) 
+-	{
+-		ScRangeList aCellRanges;
+-		for ( sal_Int32 index = 1; index != nLen; ++index )
+-		{
+-			uno::Reference< excel::XRange > xAreaRange( getArea( index ), uno::UNO_QUERY_THROW );
+-			ScVbaRange* pRange = dynamic_cast< ScVbaRange * >( xAreaRange.get());
+-			if ( pRange ) 
+-			{
+-				uno::Reference< excel::XRange > xResultRange = pRange->intersect( xAreaRange );
+-				if ( xResultRange.is() )
+-				{
+-					ScRange refRange;
+-					RangeHelper aRange( xResultRange->getCellRange() );
+-					ScUnoConversion::FillScRange( refRange, aRange.getCellRangeAddressable()->getRangeAddress() );
+-					aCellRanges.Append( refRange );
+-				}	 	
+-			}
+-		}
+-		if ( aCellRanges.First() != aCellRanges.Last() )
+-		{
+-			uno::Reference< sheet::XSheetCellRangeContainer > xRanges( new ScCellRangesObj( getScDocShell(), aCellRanges ) );
+-			xResult = new ScVbaRange( getParent(), mxContext, xRanges );
+-		}
+-		return xResult;
+-	}
+-	else
+-	{
+-		// This is a single range
+-	try
+-	{
+-			// xRange could be a single of multi-area range
+-			uno::Reference< sheet::XCellRangesQuery > xQuery( xRange->getCellRange(), uno::UNO_QUERY_THROW );
+-			RangeHelper aRange( mxRange );
+-		table::CellRangeAddress aAddress = aRange.getCellRangeAddressable()->getRangeAddress();
+-		uno::Reference< sheet::XSheetCellRanges > xIntersectRanges = xQuery->queryIntersection( aAddress );
+-		xResult = lcl_makeXRangeFromSheetCellRanges( getParent(), mxContext, xIntersectRanges, getScDocShell() );
+-
+-	}	
+-	catch( uno::Exception& )
+-	{
+-		DebugHelper::exception(SbERR_METHOD_FAILED, rtl::OUString());
+-	}
+-	}
+-	return xResult;
+-}
+ 
+ rtl::OUString& 
+ ScVbaRange::getServiceImplName()
+diff --git sc/source/ui/vba/vbarange.hxx sc/source/ui/vba/vbarange.hxx
+index 2ece2a2..585cadf 100644
+--- sc/source/ui/vba/vbarange.hxx
++++ sc/source/ui/vba/vbarange.hxx
+@@ -128,7 +128,6 @@ public:
+ 	virtual ~ScVbaRange();
+ 	virtual css::uno::Reference< oo::vba::XHelperInterface > thisHelperIface() { return this; }
+ 	bool isSingleCellRange(); 
+-	css::uno::Reference< oo::excel::XRange > intersect( const css::uno::Reference< oo::excel::XRange >& xRange ) throw (css::script::BasicErrorException, css::uno::RuntimeException);
+         static css::uno::Reference< oo::excel::XRange > getRangeObjectForName( const css::uno::Reference< css::uno::XComponentContext >& xContext, const rtl::OUString& sRangeName, ScDocShell* pDocSh, ScAddress::Convention eConv = ScAddress::CONV_XL_A1  ) throw ( css::uno::RuntimeException );
+ 
+     // Attributes



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]