Hi Eike, On Fri, 2012-01-27 at 00:03 +0100, Eike Rathke wrote: > Maybe worth a thought.
So, I took a second look at this, and came up with the attached version which I think is better and more correct than the first one. This one will correctly honor the delete note flag, and also maintains the option of deleting the note cell if the right conditions are met (i.e. delete note flag is set and nobody is listening to it). As for the pivot table change, that code block is indeed necessary; when non-empty cells exist that overlaps the range where the new table output gets written, those cells may survive if they happen to be where the table content is empty. So I reverted that part of my initial change. Kohei -- Kohei Yoshida, LibreOffice hacker, Calc
>From 43f1d4516d87aba02fc3f410e1c6def4e45c696b Mon Sep 17 00:00:00 2001 From: Kohei Yoshida <kohei.yosh...@suse.com> Date: Thu, 26 Jan 2012 15:47:52 -0500 Subject: [PATCH] fdo#44143: Keep cells with broadcasters alive during deletion. Or else it would partially break formula reference chain. --- sc/source/core/data/column3.cxx | 29 ++++++++++++++++++++++------- 1 files changed, 22 insertions(+), 7 deletions(-) diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index fbeb951..5d96af1 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -35,6 +35,7 @@ #include <sfx2/objsh.hxx> #include <svl/zforlist.hxx> #include <svl/zformat.hxx> +#include <svl/broadcast.hxx> #include "scitems.hxx" #include "column.hxx" @@ -465,14 +466,25 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe if (bDelete) { // try to create a replacement note cell, if note or broadcaster exists - ScNoteCell* pNoteCell = 0; - if (eCellType != CELLTYPE_NOTE) + ScNoteCell* pNoteCell = NULL; + SvtBroadcaster* pBC = pOldCell->GetBroadcaster(); + bool bKeepBC = pBC && pBC->HasListeners(); + if (eCellType == CELLTYPE_NOTE) + { + if (bKeepBC) + { + // We need to keep this "note" cell to keep the broadcaster. + pNoteCell = static_cast<ScNoteCell*>(pOldCell); + if (bDeleteNote) + pOldCell->DeleteNote(); + } + } + else { // do not rescue note if it has to be deleted according to passed flags ScPostIt* pNote = bDeleteNote ? 0 : pOldCell->ReleaseNote(); // #i99844# do not release broadcaster from old cell, it still has to notify deleted content - SvtBroadcaster* pBC = pOldCell->GetBroadcaster(); - if( pNote || pBC ) + if (pNote || bKeepBC) pNoteCell = new ScNoteCell( pNote, pBC ); } @@ -498,9 +510,12 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe aHint.GetAddress().SetRow( nOldRow ); aHint.SetCell( pOldCell ); pDocument->Broadcast( aHint ); - // #i99844# after broadcasting, old cell has to forget the broadcaster (owned by pNoteCell) - pOldCell->ReleaseBroadcaster(); - pOldCell->Delete(); + if (pNoteCell != pOldCell) + { + // #i99844# after broadcasting, old cell has to forget the broadcaster (owned by pNoteCell) + pOldCell->ReleaseBroadcaster(); + pOldCell->Delete(); + } } } else -- 1.7.3.4
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice