[Libreoffice-commits] .: 2 commits - sc/source

Eike Rathke erack at kemper.freedesktop.org
Fri Jan 27 04:52:28 PST 2012


 sc/source/core/data/column3.cxx  |   34 +++++++++++++++++++++-------------
 sc/source/core/data/dpoutput.cxx |    5 +++++
 2 files changed, 26 insertions(+), 13 deletions(-)

New commits:
commit 41e92ab2b7a8fcb7f5738f656bdac47bc0847f29
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Thu Jan 26 15:47:52 2012 -0500

    fdo#44143: Keep cells with broadcasters alive during deletion.
    
    Or else it would partially break formula reference chain.

diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 73c0bbb..9a96323 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"
@@ -404,14 +405,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 );
                 }
 
@@ -437,9 +449,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
commit ded70d46dceae53fed54888172a135cb2adc80de
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Jan 27 13:44:30 2012 +0100

    Revert "fdo#44143: Keep cells with broadcasters alive during deletion."
    
    This reverts commit af70bc00c6714eb8695babdf5af07416552f7034.
    
    To be replaced by a better solution.

diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 8bd0a45..73c0bbb 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -35,7 +35,6 @@
 #include <sfx2/objsh.hxx>
 #include <svl/zforlist.hxx>
 #include <svl/zformat.hxx>
-#include <svl/broadcast.hxx>
 
 #include "scitems.hxx"
 #include "column.hxx"
@@ -415,12 +414,6 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe
                     if( pNote || pBC )
                         pNoteCell = new ScNoteCell( pNote, pBC );
                 }
-                else
-                {
-                    SvtBroadcaster* pBC = pOldCell->GetBroadcaster();
-                    if (pBC && pBC->HasListeners())
-                        pNoteCell = new ScNoteCell(pOldCell->ReleaseNote(), pBC);
-                }
 
                 // remove cell entry in cell item list
                 SCROW nOldRow = maItems[nIdx].nRow;
diff --git a/sc/source/core/data/dpoutput.cxx b/sc/source/core/data/dpoutput.cxx
index ccec280..32179e3 100644
--- a/sc/source/core/data/dpoutput.cxx
+++ b/sc/source/core/data/dpoutput.cxx
@@ -973,6 +973,11 @@ void ScDPOutput::Output()
     if ( bSizeOverflow || bResultsError )   // does output area exceed sheet limits?
         return;                             // nothing
 
+    //  clear whole (new) output area
+    //! when modifying table, clear old area
+    //! include IDF_OBJECTS ???
+    pDoc->DeleteAreaTab( aStartPos.Col(), aStartPos.Row(), nTabEndCol, nTabEndRow, nTab, IDF_ALL );
+
     if ( bDoFilter )
         lcl_DoFilterButton( pDoc, aStartPos.Col(), aStartPos.Row(), nTab );
 


More information about the Libreoffice-commits mailing list