summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2013-10-15 13:23:28 +0100
committerCaolán McNamara <caolanm@redhat.com>2013-10-15 13:26:10 +0100
commit1cb01c477cf1e84f6e1b2ca1771a9af53d81dc59 (patch)
treee0f02913facb084320853801d40290b33e75d0b1
parenta1077b3cbdb847a452fccd15d9b834bc262cfb62 (diff)
Resolves: fdo#47958 shrink cut/paste more and rework a bit
I'm concerned that the scoping of the dtor will cause events to happen in different order to the original. So rework the require explicit Notify calls rather than implicit dtor calls instead of going about the place putting in scoping brackets Change-Id: I7f3ac4ef3c073da74a9cc49888a59dec12805b0f
-rw-r--r--sc/source/ui/inc/docsh.hxx42
-rw-r--r--sc/source/ui/undo/undoblk3.cxx14
-rw-r--r--sc/source/ui/undo/undocell.cxx39
-rw-r--r--sc/source/ui/view/viewfun2.cxx36
-rw-r--r--sc/source/ui/view/viewfun3.cxx25
-rw-r--r--sc/source/ui/view/viewfunc.cxx71
6 files changed, 100 insertions, 127 deletions
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index 4159dd583c9e..1e1808b8b83d 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -475,32 +475,34 @@ public:
void SetDocumentModified();
};
-class HelperNotifyChanges
+//#i97876# Spreadsheet data changes are not notified
+namespace HelperNotifyChanges
{
- private:
- ScModelObj* pModelObj;
- bool mbMustPropagateChanges;
- ScRangeList* mpChangeRanges;
- OUString mpOperation;
-
- public:
- HelperNotifyChanges(ScRangeList* pChangeRanges, const OUString& pOperation)
+ inline ScModelObj* getMustPropagateChangesModel(ScDocShell &rDocShell)
{
- mpChangeRanges = pChangeRanges;
- mpOperation = pOperation;
- if ( pModelObj && pModelObj->HasChangesListeners() )
- mbMustPropagateChanges = true;
+ ScModelObj* pModelObj = ScModelObj::getImplementation(rDocShell.GetModel());
+ if (pModelObj && pModelObj->HasChangesListeners())
+ return pModelObj;
+ return NULL;
}
- ~HelperNotifyChanges()
+
+ inline void Notify(ScModelObj &rModelObj, const ScRangeList &rChangeRanges,
+ const OUString &rType = OUString("cell-change"),
+ const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rProperties =
+ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >())
{
- if (mbMustPropagateChanges && mpChangeRanges)
- {
- pModelObj->NotifyChanges(mpOperation, *mpChangeRanges);
- }
+ rModelObj.NotifyChanges(rType, rChangeRanges, rProperties);
}
- bool getMustPropagateChanges()
+
+ inline void NotifyIfChangesListeners(ScDocShell &rDocShell, const ScRange &rRange,
+ const OUString &rType = OUString("cell-change"))
{
- return mbMustPropagateChanges;
+ if (ScModelObj* pModelObj = getMustPropagateChangesModel(rDocShell))
+ {
+ ScRangeList aChangeRanges;
+ aChangeRanges.Append(rRange);
+ Notify(*pModelObj, aChangeRanges, rType);
+ }
}
};
diff --git a/sc/source/ui/undo/undoblk3.cxx b/sc/source/ui/undo/undoblk3.cxx
index 785a253bc5bb..53fb213f774f 100644
--- a/sc/source/ui/undo/undoblk3.cxx
+++ b/sc/source/ui/undo/undoblk3.cxx
@@ -182,12 +182,7 @@ void ScUndoDeleteContents::Undo()
DoChange( sal_True );
EndUndo();
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- aChangeRanges.Append(aRange);
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocShell, aRange);
}
void ScUndoDeleteContents::Redo()
@@ -196,12 +191,7 @@ void ScUndoDeleteContents::Redo()
DoChange( false );
EndRedo();
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- aChangeRanges.Append(aRange);
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocShell, aRange);
}
void ScUndoDeleteContents::Repeat(SfxRepeatTarget& rTarget)
diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx
index 710105601dc5..106a0771894c 100644
--- a/sc/source/ui/undo/undocell.cxx
+++ b/sc/source/ui/undo/undocell.cxx
@@ -47,6 +47,25 @@
using ::boost::shared_ptr;
+namespace HelperNotifyChanges
+{
+ void NotifyIfChangesListeners(ScDocShell &rDocShell, const ScAddress &rPos,
+ const ScUndoEnterData::ValuesType &rOldValues, const OUString &rType = OUString("cell-change"))
+ {
+ if (ScModelObj* pModelObj = getMustPropagateChangesModel(rDocShell))
+ {
+ ScRangeList aChangeRanges;
+
+ for (size_t i = 0, n = rOldValues.size(); i < n; ++i)
+ {
+ aChangeRanges.Append( ScRange(rPos.Col(), rPos.Row(), rOldValues[i].mnTab));
+ }
+
+ Notify(*pModelObj, aChangeRanges, rType);
+ }
+ }
+}
+
TYPEINIT1(ScUndoCursorAttr, ScSimpleUndo);
TYPEINIT1(ScUndoEnterData, ScSimpleUndo);
TYPEINIT1(ScUndoEnterValue, ScSimpleUndo);
@@ -260,15 +279,7 @@ void ScUndoEnterData::Undo()
DoChange();
EndUndo();
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- for (size_t i = 0, n = maOldValues.size(); i < n; ++i)
- {
- aChangeRanges.Append( ScRange(maPos.Col(), maPos.Row(), maOldValues[i].mnTab));
- }
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocShell, maPos, maOldValues);
}
void ScUndoEnterData::Redo()
@@ -297,15 +308,7 @@ void ScUndoEnterData::Redo()
DoChange();
EndRedo();
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- for (size_t i = 0, n = maOldValues.size(); i < n; ++i)
- {
- aChangeRanges.Append(ScRange(maPos.Col(), maPos.Row(), maOldValues[i].mnTab));
- }
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocShell, maPos, maOldValues);
}
void ScUndoEnterData::Repeat(SfxRepeatTarget& rTarget)
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 2d03320bc918..8ee0da43db1d 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -1284,12 +1284,7 @@ void ScViewFunc::FillSeries( FillDir eDir, FillCmd eCmd, FillDateCmd eDateCmd,
pDocSh->UpdateOle(GetViewData());
UpdateScrollBars();
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- aChangeRanges.Append(aRange);
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocSh, aRange);
}
}
else
@@ -1314,40 +1309,29 @@ void ScViewFunc::FillAuto( FillDir eDir, SCCOL nStartCol, SCROW nStartRow,
pDocSh->UpdateOle(GetViewData());
UpdateScrollBars();
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
+ if (ScModelObj* pModelObj = HelperNotifyChanges::getMustPropagateChangesModel(*pDocSh))
{
+ ScRangeList aChangeRanges;
ScRange aChangeRange( aRange );
- switch ( eDir )
+ switch (eDir)
{
case FILL_TO_BOTTOM:
- {
- aChangeRange.aStart.SetRow( aSourceRange.aEnd.Row() + 1 );
- }
+ aChangeRange.aStart.SetRow( aSourceRange.aEnd.Row() + 1 );
break;
case FILL_TO_TOP:
- {
- aChangeRange.aEnd.SetRow( aSourceRange.aStart.Row() - 1 );
- }
+ aChangeRange.aEnd.SetRow( aSourceRange.aStart.Row() - 1 );
break;
case FILL_TO_RIGHT:
- {
- aChangeRange.aStart.SetCol( aSourceRange.aEnd.Col() + 1 );
- }
+ aChangeRange.aStart.SetCol( aSourceRange.aEnd.Col() + 1 );
break;
case FILL_TO_LEFT:
- {
- aChangeRange.aEnd.SetCol( aSourceRange.aStart.Col() - 1 );
- }
+ aChangeRange.aEnd.SetCol( aSourceRange.aStart.Col() - 1 );
break;
default:
- {
-
- }
break;
}
- aChangeRanges.Append(aChangeRange);
+ aChangeRanges.Append( aChangeRange );
+ HelperNotifyChanges::Notify(*pModelObj, aChangeRanges);
}
}
}
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index 6698164fca99..5f4dac21e73e 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -1703,23 +1703,24 @@ void ScViewFunc::PostPasteFromClip(const ScRangeList& rPasteRanges, const ScMark
SelectionChanged();
+ ScModelObj* pModelObj = HelperNotifyChanges::getMustPropagateChangesModel(*pDocSh);
+ if (!pModelObj)
+ return;
+
ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
+ for (size_t i = 0, n = rPasteRanges.size(); i < n; ++i)
{
- for (size_t i = 0, n = rPasteRanges.size(); i < n; ++i)
+ const ScRange& r = *rPasteRanges[i];
+ ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
+ for (; itr != itrEnd; ++itr)
{
- const ScRange& r = *rPasteRanges[i];
- ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
- for (; itr != itrEnd; ++itr)
- {
- ScRange aChangeRange(r);
- aChangeRange.aStart.SetTab(*itr);
- aChangeRange.aEnd.SetTab(*itr);
- aChangeRanges.Append(aChangeRange);
- }
+ ScRange aChangeRange(r);
+ aChangeRange.aStart.SetTab(*itr);
+ aChangeRange.aEnd.SetTab(*itr);
+ aChangeRanges.Append(aChangeRange);
}
}
+ HelperNotifyChanges::Notify(*pModelObj, aChangeRanges);
}
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 1bf2741d65cf..033b828afc48 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -322,6 +322,23 @@ static sal_Bool lcl_AddFunction( ScAppOptions& rAppOpt, sal_uInt16 nOpCode )
return sal_True; // list has changed
}
+namespace HelperNotifyChanges
+{
+ void NotifyIfChangesListeners(ScDocShell &rDocShell, ScMarkData& rMark, SCCOL nCol, SCROW nRow,
+ const OUString &rType = OUString("cell-change"))
+ {
+ if (ScModelObj *pModelObj = getMustPropagateChangesModel(rDocShell))
+ {
+ ScRangeList aChangeRanges;
+ ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
+ for (; itr != itrEnd; ++itr)
+ aChangeRanges.Append( ScRange( nCol, nRow, *itr ) );
+
+ HelperNotifyChanges::Notify(*pModelObj, aChangeRanges, rType);
+ }
+ }
+}
+
// actual functions
// input - undo OK
@@ -551,14 +568,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
pDocSh->UpdateOle(GetViewData());
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
- for (; itr != itrEnd; ++itr)
- aChangeRanges.Append( ScRange( nCol, nRow, *itr ) );
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocSh, rMark, nCol, nRow);
if ( bRecord )
rFunc.EndListAction();
@@ -725,16 +735,8 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
pDocSh->UpdateOle(GetViewData());
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- itr = rMark.begin();
- for (; itr != itrEnd; ++itr)
- {
- aChangeRanges.Append( ScRange( nCol, nRow, *itr ) );
- }
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocSh, rMark, nCol, nRow);
+
aModificator.SetDocumentModified();
}
lcl_PostRepaintCondFormat( pDoc->GetCondFormat( nCol, nRow, nTab ), pDocSh );
@@ -1240,8 +1242,8 @@ void ScViewFunc::ApplySelectionPattern( const ScPatternAttr& rAttr,
CellContentChanged();
}
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "attribute");
- if (aHelperNotifyChanges.getMustPropagateChanges())
+ ScModelObj* pModelObj = HelperNotifyChanges::getMustPropagateChangesModel(*pDocSh);
+ if (pModelObj)
{
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aProperties;
sal_Int32 nCount = 0;
@@ -1268,7 +1270,9 @@ void ScViewFunc::ApplySelectionPattern( const ScPatternAttr& rAttr,
}
}
}
+ HelperNotifyChanges::Notify(*pModelObj, aChangeRanges, "attribute", aProperties);
}
+
StartFormatArea();
}
@@ -1481,17 +1485,12 @@ bool ScViewFunc::InsertCells( InsCellCmd eCmd, bool bRecord, bool bPartOfPaste )
CellContentChanged();
ResetAutoSpell();
- ScRangeList aChangeRanges;
if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS )
{
OUString aOperation = ( eCmd == INS_INSROWS) ?
OUString("insert-rows"):
OUString("insert-columns");
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, aOperation);
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- aChangeRanges.Append( aRange );
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocSh, aRange, aOperation);
}
}
return bSuccess;
@@ -1545,15 +1544,10 @@ void ScViewFunc::DeleteCells( DelCellCmd eCmd, bool bRecord )
if ( eCmd == DEL_DELROWS || eCmd == DEL_DELCOLS )
{
- ScRangeList aChangeRanges;
OUString aOperation = ( eCmd == DEL_DELROWS) ?
OUString("delete-rows"):
OUString("delete-columns");
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, aOperation);
- if (aHelperNotifyChanges.getMustPropagateChanges())
- {
- aChangeRanges.Append(aRange);
- }
+ HelperNotifyChanges::NotifyIfChangesListeners(*pDocSh, aRange, aOperation);
}
// put cursor directly behind deleted range
@@ -1911,10 +1905,9 @@ void ScViewFunc::DeleteContents( sal_uInt16 nFlags, bool bRecord )
pDocSh->UpdateOle(GetViewData());
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "cell-change");
- if (aHelperNotifyChanges.getMustPropagateChanges())
+ if (ScModelObj *pModelObj = HelperNotifyChanges::getMustPropagateChangesModel(*pDocSh))
{
+ ScRangeList aChangeRanges;
if ( bSimple )
{
aChangeRanges.Append( aMarkRange );
@@ -1923,6 +1916,7 @@ void ScViewFunc::DeleteContents( sal_uInt16 nFlags, bool bRecord )
{
aFuncMark.FillRangeListWithMarks( &aChangeRanges, false );
}
+ HelperNotifyChanges::Notify(*pModelObj, aChangeRanges);
}
aModificator.SetDocumentModified();
@@ -2204,13 +2198,11 @@ void ScViewFunc::SetWidthOrHeight( bool bWidth, SCCOLROW nRangeCnt, SCCOLROW* pR
aModificator.SetDocumentModified();
}
- // #i97876# Spreadsheet data changes are not notified
if ( bWidth )
{
- ScRangeList aChangeRanges;
- HelperNotifyChanges aHelperNotifyChanges(&aChangeRanges, "column-resize");
- if (aHelperNotifyChanges.getMustPropagateChanges())
+ if (ScModelObj* pModelObj = HelperNotifyChanges::getMustPropagateChangesModel(*pDocSh))
{
+ ScRangeList aChangeRanges;
itr = pMarkData->begin();
for (; itr != itrEnd; ++itr)
{
@@ -2226,6 +2218,7 @@ void ScViewFunc::SetWidthOrHeight( bool bWidth, SCCOLROW nRangeCnt, SCCOLROW* pR
}
}
}
+ HelperNotifyChanges::Notify(*pModelObj, aChangeRanges, "column-resize");
}
}
}