Author: pfg
Date: Wed Aug 22 19:53:34 2012
New Revision: 1376211
URL: http://svn.apache.org/viewvc?rev=1376211&view=rev
Log:
#i108874# - Worksheet.Change event fix.
Fire the "cell-change" event when the range is changed.
Author: lihuiibm
Reviewed: Chen Peng
Modified:
incubator/ooo/trunk/main/sc/source/ui/vba/vbarange.cxx
Modified: incubator/ooo/trunk/main/sc/source/ui/vba/vbarange.cxx
URL:
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/ui/vba/vbarange.cxx?rev=1376211&r1=1376210&r2=1376211&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/ui/vba/vbarange.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/ui/vba/vbarange.cxx Wed Aug 22 19:53:34
2012
@@ -124,6 +124,7 @@
#include <cellsuno.hxx>
#include <dbcolect.hxx>
#include "docfunc.hxx"
+#include <docuno.hxx>
#include "transobj.hxx"
#include <sfx2/dispatch.hxx>
@@ -1408,6 +1409,19 @@ lcl_setupBorders( const uno::Reference<
return borders;
}
+void lcl_NotifyRangeChanges( const uno::Reference< frame::XModel >& xModel,
ScCellRangesBase* pUnoRangesBase ) // i108874
+{
+ 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 )
{
@@ -1571,6 +1585,8 @@ ScVbaRange::setValue( const uno::Any &a
}
CellValueSetter valueSetter( aValue );
setValue( aValue, valueSetter, true );
+ // Fire the range change event.
+ lcl_NotifyRangeChanges( getScDocShell()->GetModel(),
getCellRangesBase() );
}
void SAL_CALL
@@ -1579,6 +1595,8 @@ ScVbaRange::Clear() throw (uno::RuntimeE
using namespace ::com::sun::star::sheet::CellFlags;
sal_Int32 nFlags = VALUE | DATETIME | STRING | FORMULA | HARDATTR |
EDITATTR | FORMATTED;
ClearContents( nFlags, true );
+ // Fire the range change event
+ lcl_NotifyRangeChanges( getScDocShell()->GetModel(),
getCellRangesBase() );
}
//helper ClearContent
@@ -1631,6 +1649,8 @@ ScVbaRange::ClearFormats() throw (uno::R
using namespace ::com::sun::star::sheet::CellFlags;
sal_Int32 nFlags = HARDATTR | FORMATTED | EDITATTR;
ClearContents( nFlags, false );
+ // Fire the range change event.
+ lcl_NotifyRangeChanges( getScDocShell()->GetModel(),
getCellRangesBase() );
}
void
@@ -1646,6 +1666,8 @@ ScVbaRange::setFormulaValue( const uno::
}
CellFormulaValueSetter formulaValueSetter( rFormula, getScDocument(),
eGram );
setValue( rFormula, formulaValueSetter, bFireEvent );
+ // Fire the range change event.
+ lcl_NotifyRangeChanges( getScDocShell()->GetModel(),
getCellRangesBase() );
}
uno::Any
@@ -1805,6 +1827,9 @@ ScVbaRange::fillSeries( sheet::FillDirec
uno::Reference< sheet::XCellSeries > xCellSeries(mxRange,
uno::UNO_QUERY_THROW );
xCellSeries->fillSeries( nFillDirection, nFillMode, nFillDateMode,
fStep, fEndValue );
+
+ // Fire the range change event.
+ lcl_NotifyRangeChanges( getScDocShell()->GetModel(),
getCellRangesBase() );
}
void
@@ -3050,7 +3075,17 @@ ScVbaRange::Replace( const ::rtl::OUStri
// 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 )
+ {
+ // Fire the range change event.
+ ScCellRangesBase* pScCellRangesBase =
ScCellRangesBase::getImplementation( xIndexAccess );
+ // i108874 - the original convert method will fail in
SUSE
+ lcl_NotifyRangeChanges( getScDocShell()->GetModel(),
pScCellRangesBase );
+ }
}
return sal_True; // always
}