diff -u -r ./old/sc/source/ui/vba/vbarange.cxx ./new/sc/source/ui/vba/vbarange.cxx --- ./old/sc/source/ui/vba/vbarange.cxx 2009-12-26 11:03:34.000000000 +0800 +++ ./new/sc/source/ui/vba/vbarange.cxx 2010-01-20 13:30:34.000000000 +0800 @@ -2,7 +2,7 @@ * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Copyright 2008 by Sun Microsystems, Inc. + * Copyright 2008, 2010 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * @@ -134,6 +134,7 @@ #include #include #include "docfunc.hxx" +#include #include #include @@ -1239,6 +1240,19 @@ return borders; } +void lcl_NotifyRangeChanges( const uno::Reference< frame::XModel >& xModel, ScCellRangesBase* pUnoRangesBase ) +{ + if ( xModel.is() && pUnoRangesBase ) + { + ScModelObj* pModelObj = ScModelObj::getImplementation( xModel ); + const ScRangeList& aCellRanges = pUnoRangesBase->GetRangeList(); + if ( pModelObj && pModelObj->HasChangesListeners() ) + { + pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aCellRanges ); + } + } +} + ScVbaRange::ScVbaRange( uno::Sequence< uno::Any> const & args, uno::Reference< uno::XComponentContext> const & xContext ) throw ( lang::IllegalArgumentException ) : ScVbaRange_BASE( getXSomethingFromArgs< XHelperInterface >( args, 0 ), xContext, getXSomethingFromArgs< beans::XPropertySet >( args, 1, false ), getModelFromXIf( getXSomethingFromArgs< uno::XInterface >( args, 1 ) ), true ), mbIsRows( sal_False ), mbIsColumns( sal_False ) { @@ -1401,6 +1415,9 @@ } CellValueSetter valueSetter( aValue ); setValue( aValue, valueSetter ); + + // Fires the range change event. + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), getCellRangesBase() ); } void @@ -1408,6 +1425,9 @@ { sal_Int32 nFlags = sheet::CellFlags::VALUE | sheet::CellFlags::STRING | sheet::CellFlags::HARDATTR | sheet::CellFlags::FORMATTED | sheet::CellFlags::EDITATTR | sheet::CellFlags::FORMULA; ClearContents( nFlags ); + + // Fires the range change event. + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), getCellRangesBase() ); } //helper ClearContent @@ -1448,6 +1468,9 @@ sheet::CellFlags::STRING | sheet::CellFlags::DATETIME | sheet::CellFlags::FORMULA ); ClearContents( nClearFlags ); + + // Fires the range change event. + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), getCellRangesBase() ); } void @@ -1456,6 +1479,9 @@ //FIXME: need to check if we need to combine sheet::CellFlags::FORMATTED sal_Int32 nClearFlags = sheet::CellFlags::HARDATTR | sheet::CellFlags::FORMATTED | sheet::CellFlags::EDITATTR; ClearContents( nClearFlags ); + + // Fires the range change event. + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), getCellRangesBase() ); } void @@ -1471,6 +1497,9 @@ } CellFormulaValueSetter formulaValueSetter( rFormula, getScDocument(), eGram ); setValue( rFormula, formulaValueSetter ); + + // Fires the range change event. + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), getCellRangesBase() ); } uno::Any @@ -1630,6 +1659,9 @@ uno::Reference< sheet::XCellSeries > xCellSeries(mxRange, uno::UNO_QUERY_THROW ); xCellSeries->fillSeries( nFillDirection, nFillMode, nFillDateMode, fStep, fEndValue ); + + // Fires the range change event. + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), getCellRangesBase() ); } void @@ -2664,7 +2696,7 @@ uno::Reference< excel::XComment > SAL_CALL ScVbaRange::AddComment( const uno::Any& Text ) throw (uno::RuntimeException) { - + uno::Reference< excel::XComment > xComment( new ScVbaComment( this, mxContext, mxRange ) ); // if there is existing text then error if ( Text.hasValue() && xComment->Text( uno::Any(), uno::Any(), uno::Any() ).getLength() ) @@ -2829,7 +2861,16 @@ // OOo.org afaik uno::Reference< util::XSearchDescriptor > xSearch( xDescriptor, uno::UNO_QUERY ); + // Find all cells that being replaced, used to fire the range changed event. + uno::Reference< container::XIndexAccess > xIndexAccess = xReplace->findAll( xSearch ); xReplace->replaceAll( xSearch ); + + if ( xIndexAccess.is() && xIndexAccess->getCount() > 0 ) + { + // Fires the range change event. + ScCellRangesBase* pScCellRangesBase = ScCellRangesBase::getImplementation( xIndexAccess ); //liuchen 2010-01-05 + lcl_NotifyRangeChanges( getScDocShell()->GetModel(), pScCellRangesBase ); //liuchen 2010-01-05 the original convert method will fail in SUSE + } } return sal_True; // always } @@ -5510,19 +5551,19 @@ //Add by minz@cn.ibm.com. Range.PivotTable. //Returns a PivotTable object that represents the PivotTable report containing the upper-left corner of the specified range. -uno::Reference< excel::XPivotTable > -ScVbaRange::PivotTable() throw (uno::RuntimeException) -{ - uno::Reference< excel::XPivotTable > xDestPVTable; - - RangeHelper thisRange( mxRange ); +uno::Reference< excel::XPivotTable > +ScVbaRange::PivotTable() throw (uno::RuntimeException) +{ + uno::Reference< excel::XPivotTable > xDestPVTable; + + RangeHelper thisRange( mxRange ); uno::Reference< sheet::XSpreadsheet > xSheet = thisRange.getSpreadSheet(); uno::Reference< sheet::XDataPilotTablesSupplier > xTables(xSheet, uno::UNO_QUERY_THROW ) ; - uno::Reference< container::XIndexAccess > xIndexAccess( xTables->getDataPilotTables(), uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexAccess > xIndexAccess( xTables->getDataPilotTables(), uno::UNO_QUERY_THROW ); if ( xIndexAccess.is() ) { //get the upper-left cell address - uno::Reference< sheet::XCellAddressable > xCellAddr(mxRange->getCellByPosition(0, 0), uno::UNO_QUERY_THROW ); + uno::Reference< sheet::XCellAddressable > xCellAddr(mxRange->getCellByPosition(0, 0), uno::UNO_QUERY_THROW ); table::CellAddress aAddress = xCellAddr->getCellAddress(); sal_Int32 nCount = xIndexAccess->getCount(); @@ -5539,8 +5580,8 @@ break; } } - } - return xDestPVTable; + } + return xDestPVTable; }