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
 }


Reply via email to