Remove broadcaster from ScBaseCell, remove ScNoteCell and CELLTYPE_NOTE...
and Calc is now officially broken. Let's start fixing this bit by bit...
Change-Id: I383c88245fe1e573666da636c6a8ca8815352ce7
diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx
index 7b7019c..ef7c2f7 100644
--- a/sc/inc/cell.hxx
+++ b/sc/inc/cell.hxx
@@ -69,17 +69,6 @@ public:
Returns false for formula cells returning nothing, use HasEmptyData() for that. */
bool IsBlank() const;
/** Returns true, if the cell contains a broadcaster. */
inline bool HasBroadcaster() const { return mpBroadcaster != 0; }
/** Returns the pointer to the cell broadcaster. */
inline SvtBroadcaster* GetBroadcaster() const { return mpBroadcaster; }
/** Takes ownership of the passed cell broadcaster. */
void TakeBroadcaster( SvtBroadcaster* pBroadcaster );
/** Returns and forgets the own cell broadcaster. Caller takes ownership! */
SvtBroadcaster* ReleaseBroadcaster();
/** Deletes the own cell broadcaster. */
void DeleteBroadcaster();
/** ScFormulaCell with formula::svEmptyCell result, or ScNoteCell (may have been
created due to reference to empty cell). */
bool HasEmptyData() const;
@@ -90,33 +79,10 @@ public:
private:
ScBaseCell& operator=( const ScBaseCell& );
private:
SvtBroadcaster* mpBroadcaster; /// Broadcaster for changed values. Cell takes ownership!
protected:
sal_uInt8 eCellType; // enum CellType - sal_uInt8 spart Speicher
};
// ============================================================================
class ScNoteCell : public ScBaseCell
{
public:
#ifdef USE_MEMPOOL
DECL_FIXEDMEMPOOL_NEWDEL( ScNoteCell )
#endif
/** Cell takes ownership of the passed broadcaster. */
explicit ScNoteCell( SvtBroadcaster* pBC = 0 );
#if OSL_DEBUG_LEVEL > 0
~ScNoteCell();
#endif
private:
ScNoteCell( const ScNoteCell& );
};
class ScValueCell : public ScBaseCell
{
public:
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index ed1392a..907074d 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -119,8 +119,8 @@ struct ColDoubleEntry
class ScColumn
{
// Broadcaster storage container
typedef mdds::mtv::custom_block_func1<sc::element_type_broadcaster, sc::custom_broadcaster_block> BroadcasterBlkFunc;
typedef mdds::multi_type_vector<BroadcasterBlkFunc> BroadcasterStoreType;
typedef mdds::mtv::custom_block_func1<sc::element_type_broadcaster, sc::custom_broadcaster_block> BCBlkFunc;
typedef mdds::multi_type_vector<BCBlkFunc> BCStoreType;
typedef mdds::multi_type_vector<mdds::mtv::element_block_func> TextWidthType;
typedef mdds::multi_type_vector<mdds::mtv::element_block_func> ScriptType;
@@ -133,7 +133,7 @@ class ScColumn
// Script types are stored as unsigned char.
ScriptType maScriptTypes;
BroadcasterStoreType maBroadcasters;
BCStoreType maBroadcasters;
SCCOL nCol;
SCTAB nTab;
@@ -473,6 +473,8 @@ public:
void SetNumberFormat( SCROW nRow, sal_uInt32 nNumberFormat );
SvtBroadcaster* GetBroadcaster( SCROW nRow );
private:
const ScFormulaCell* FetchFormulaCell( SCROW nRow ) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 0920dd5e..79a0626 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1967,6 +1967,8 @@ private: // CLOOK-Impl-methods
ScDocument* mpDoc;
};
SvtBroadcaster* GetBroadcaster( const ScAddress& rPos );
bool TableExists( SCTAB nTab ) const;
void MergeNumberFormatter(ScDocument* pSrcDoc);
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index 0ef1bd8..f823232 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -286,7 +286,6 @@ enum CellType
CELLTYPE_VALUE,
CELLTYPE_STRING,
CELLTYPE_FORMULA,
CELLTYPE_NOTE,
CELLTYPE_EDIT,
#if OSL_DEBUG_LEVEL > 0
CELLTYPE_DESTROYED
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index c090f8b..c7b3498 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -831,6 +831,8 @@ public:
ScRefCellValue GetRefCellValue( SCCOL nCol, SCROW nRow );
SvtBroadcaster* GetBroadcaster( SCCOL nCol, SCROW nRow );
/** Replace behaves differently to the Search; adjust the rCol and rRow accordingly.
'Replace' replaces at the 'current' position, but in order to achieve
diff --git a/sc/source/core/data/autonamecache.cxx b/sc/source/core/data/autonamecache.cxx
index 1dca11e..ab03a95 100644
--- a/sc/source/core/data/autonamecache.cxx
+++ b/sc/source/core/data/autonamecache.cxx
@@ -81,7 +81,6 @@ const ScAutoNameAddresses& ScAutoNameCache::GetNameOccurrences( const String& rN
break;
case CELLTYPE_NONE:
case CELLTYPE_VALUE:
case CELLTYPE_NOTE:
#if OSL_DEBUG_LEVEL > 0
case CELLTYPE_DESTROYED:
#endif
diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx
index 0bde4bf..b5c8d33 100644
--- a/sc/source/core/data/cell.cxx
+++ b/sc/source/core/data/cell.cxx
@@ -29,26 +29,22 @@
#ifdef USE_MEMPOOL
IMPL_FIXEDMEMPOOL_NEWDEL( ScValueCell )
IMPL_FIXEDMEMPOOL_NEWDEL( ScStringCell )
IMPL_FIXEDMEMPOOL_NEWDEL( ScNoteCell )
#endif
// ============================================================================
ScBaseCell::ScBaseCell( CellType eNewType ) :
mpBroadcaster( 0 ),
eCellType( sal::static_int_cast<sal_uInt8>(eNewType) )
{
}
ScBaseCell::ScBaseCell( const ScBaseCell& rCell ) :
mpBroadcaster( 0 ),
eCellType( rCell.eCellType )
{
}
ScBaseCell::~ScBaseCell()
{
delete mpBroadcaster;
OSL_ENSURE( eCellType == CELLTYPE_DESTROYED, "BaseCell Destructor" );
}
@@ -66,8 +62,6 @@ ScBaseCell* lclCloneCell( const ScBaseCell& rSrcCell, ScDocument& rDestDoc, cons
return new ScEditCell(static_cast<const ScEditCell&>(rSrcCell), rDestDoc, rDestPos);
case CELLTYPE_FORMULA:
return new ScFormulaCell( static_cast< const ScFormulaCell& >( rSrcCell ), rDestDoc, rDestPos, nCloneFlags );
case CELLTYPE_NOTE:
return new ScNoteCell;
default:;
}
OSL_FAIL( "lclCloneCell - unknown cell type" );
@@ -106,9 +100,6 @@ void ScBaseCell::Delete()
case CELLTYPE_FORMULA:
delete (ScFormulaCell*) this;
break;
case CELLTYPE_NOTE:
delete (ScNoteCell*) this;
break;
default:
OSL_FAIL("Attempt to Delete() an unknown CELLTYPE");
break;
@@ -117,36 +108,13 @@ void ScBaseCell::Delete()
bool ScBaseCell::IsBlank() const
{
if(eCellType == CELLTYPE_NOTE)
return true;
return false;
}
void ScBaseCell::TakeBroadcaster( SvtBroadcaster* pBroadcaster )
{
delete mpBroadcaster;
mpBroadcaster = pBroadcaster;
}
SvtBroadcaster* ScBaseCell::ReleaseBroadcaster()
{
SvtBroadcaster* pBroadcaster = mpBroadcaster;
mpBroadcaster = 0;
return pBroadcaster;
}
void ScBaseCell::DeleteBroadcaster()
{
DELETEZ( mpBroadcaster );
}
bool ScBaseCell::HasEmptyData() const
{
switch ( eCellType )
{
case CELLTYPE_NOTE :
return true;
case CELLTYPE_FORMULA :
return ((ScFormulaCell*)this)->IsEmpty();
default:
@@ -201,21 +169,6 @@ OUString ScBaseCell::GetStringData() const
return aStr;
}
ScNoteCell::ScNoteCell( SvtBroadcaster* pBC ) :
ScBaseCell( CELLTYPE_NOTE )
{
TakeBroadcaster( pBC );
}
#if OSL_DEBUG_LEVEL > 0
ScNoteCell::~ScNoteCell()
{
eCellType = CELLTYPE_DESTROYED;
}
#endif
// ============================================================================
ScValueCell::ScValueCell( double fValue ) :
ScBaseCell( CELLTYPE_VALUE ),
mfValue( fValue )
diff --git a/sc/source/core/data/cellvalue.cxx b/sc/source/core/data/cellvalue.cxx
index 588ccfb..17a4262 100644
--- a/sc/source/core/data/cellvalue.cxx
+++ b/sc/source/core/data/cellvalue.cxx
@@ -24,8 +24,6 @@ CellType adjustCellType( CellType eOrig )
{
switch (eOrig)
{
case CELLTYPE_NOTE:
return CELLTYPE_NONE;
case CELLTYPE_EDIT:
return CELLTYPE_STRING;
default:
@@ -354,7 +352,7 @@ bool ScCellValue::hasNumeric() const
bool ScCellValue::isEmpty() const
{
return meType == CELLTYPE_NOTE || meType == CELLTYPE_NONE;
return meType == CELLTYPE_NONE;
}
bool ScCellValue::equalsWithoutFormat( const ScCellValue& r ) const
@@ -498,7 +496,7 @@ OUString ScRefCellValue::getString()
bool ScRefCellValue::isEmpty() const
{
return meType == CELLTYPE_NOTE || meType == CELLTYPE_NONE;
return meType == CELLTYPE_NONE;
}
bool ScRefCellValue::hasEmptyValue()
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index c98cc39..188932b 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -843,23 +843,6 @@ void ScColumn::ReserveSize( SCSIZE nSize )
maItems.reserve(nSize);
}
namespace {
/** Moves broadcaster from old cell to new cell if exists, otherwise creates a new note cell. */
void lclTakeBroadcaster( ScBaseCell*& rpCell, SvtBroadcaster* pBC )
{
if( pBC )
{
if( rpCell )
rpCell->TakeBroadcaster( pBC );
else
rpCell = new ScNoteCell( pBC );
}
}
} // namespace
// SwapRow for sorting
void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2)
{
@@ -907,9 +890,6 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2)
// simple swap if no formula cells present
if ( !pFmlaCell1 && !pFmlaCell2 )
{
// remember cell broadcasters, must remain at old position
SvtBroadcaster* pBC1 = pCell1->ReleaseBroadcaster();
if ( pCell2 )
{
/* Both cells exist, no formula cells involved, a simple swap can
@@ -917,10 +897,6 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2)
maItems[nIndex1].pCell = pCell2;
maItems[nIndex2].pCell = pCell1;
SvtBroadcaster* pBC2 = pCell2->ReleaseBroadcaster();
pCell1->TakeBroadcaster( pBC2 );
pCell2->TakeBroadcaster( pBC1 );
// Swap text width values.
unsigned short nVal1 = maTextWidths.get<unsigned short>(nRow1);
unsigned short nVal2 = maTextWidths.get<unsigned short>(nRow2);
@@ -937,19 +913,10 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2)
// Only cell 1 exists; cell 2 is empty. Move cell 1 from to row
// 2.
ScNoteCell* pDummyCell = pBC1 ? new ScNoteCell( pBC1 ) : 0;
if ( pDummyCell )
{
// insert dummy note cell (without note) containing old broadcaster
maItems[nIndex1].pCell = pDummyCell;
}
else
{
// remove ColEntry at old position
maItems.erase( maItems.begin() + nIndex1 );
maTextWidths.set_empty(nRow1, nRow1);
maScriptTypes.set_empty(nRow1, nRow1);
}
// remove ColEntry at old position
maItems.erase( maItems.begin() + nIndex1 );
maTextWidths.set_empty(nRow1, nRow1);
maScriptTypes.set_empty(nRow1, nRow1);
// Empty text width at the cell 1 position. For now, we don't
// transfer the old value to the cell 2 position since Insert() is
@@ -1012,12 +979,6 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2)
pNew1 = pCell2->Clone( *pDocument, aPos1, SC_CLONECELL_ADJUST3DREL );
}
// move old broadcasters new cells at the same old position
SvtBroadcaster* pBC1 = pCell1->ReleaseBroadcaster();
lclTakeBroadcaster( pNew1, pBC1 );
SvtBroadcaster* pBC2 = pCell2 ? pCell2->ReleaseBroadcaster() : 0;
lclTakeBroadcaster( pNew2, pBC2 );
/* Insert the new cells. Old cell has to be deleted, if there is no new
cell (call to Insert deletes old cell by itself). */
if ( !pNew1 )
@@ -1245,14 +1206,13 @@ void ScColumn::InsertRow( SCROW nStartRow, SCSIZE nSize )
for (i = 0; i < nDelCount; i++)
{
ScBaseCell* pCell = ppDelCells[i];
OSL_ENSURE( pCell->IsBlank(), "visible cell moved away" );
SvtBroadcaster* pBC = pCell->GetBroadcaster();
SCROW nDelRow = pDelRows[i];
SvtBroadcaster* pBC = GetBroadcaster(nDelRow);
if (pBC)
{
MoveListeners( *pBC, pDelRows[i] - nSize );
pCell->DeleteBroadcaster();
pCell->Delete();
maBroadcasters.set_empty(nDelRow, nDelRow);
ppDelCells[i]->Delete();
}
}
@@ -1773,7 +1733,6 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol)
ScAddress aAdr( nCol, 0, nTab );
ScHint aHint( SC_HINT_DYING, aAdr, NULL ); // areas only
ScAddress& rAddress = aHint.GetAddress();
ScNoteCell* pNoteCell = new ScNoteCell; // Dummy like in DeleteRange
// must iterate backwards, because indexes of following cells become invalid
bool bErased = false;
@@ -1783,8 +1742,6 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol)
nStartPos = (*it).first;
nStopPos = (*it).second;
for (i=nStartPos; i<nStopPos; ++i)
maItems[i].pCell = pNoteCell; // Assign the dumpy cell instance to all slots.
for (i=nStartPos; i<nStopPos; ++i)
{
rAddress.SetRow( maItems[i].nRow );
pDocument->AreaBroadcast( aHint );
@@ -1793,7 +1750,6 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol)
maItems.erase(maItems.begin() + nStartPos, maItems.begin() + nStopPos);
bErased = true;
}
pNoteCell->Delete(); // Delete the dummy cell instance.
if (bErased)
{
@@ -2175,7 +2131,7 @@ void ScColumn::SetDirty( const ScRange& rRange )
else
{
aHint.GetAddress().SetRow( nRow );
aHint.SetBroadcaster(pCell->GetBroadcaster());
aHint.SetBroadcaster(maBroadcasters.get<SvtBroadcaster*>(nRow));
pDocument->Broadcast( aHint );
}
nIndex++;
@@ -2204,7 +2160,7 @@ void ScColumn::SetTableOpDirty( const ScRange& rRange )
else
{
aHint.GetAddress().SetRow( nRow );
aHint.SetBroadcaster(pCell->GetBroadcaster());
aHint.SetBroadcaster(maBroadcasters.get<SvtBroadcaster*>(nRow));
pDocument->Broadcast( aHint );
}
nIndex++;
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index bad84e9..817fca0 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -61,6 +61,8 @@
#include <math.h>
#include <boost/scoped_ptr.hpp>
#if DEBUG_COLUMN_STORAGE
#include "columniterator.hxx"
#include <iostream>
@@ -902,7 +904,7 @@ bool ScColumn::GetNextSpellingCell(SCROW& nRow, bool bInSel, const ScMarkData& r
void ScColumn::RemoveAutoSpellObj()
{
ScTabEditEngine* pEngine = NULL;
boost::scoped_ptr<ScTabEditEngine> pEngine;
for (SCSIZE i=0; i<maItems.size(); i++)
if ( maItems[i].pCell->GetCellType() == CELLTYPE_EDIT )
@@ -918,29 +920,26 @@ void ScColumn::RemoveAutoSpellObj()
// test for attributes
if ( !pEngine )
pEngine = new ScTabEditEngine(pDocument);
pEngine.reset(new ScTabEditEngine(pDocument));
pEngine->SetText( *pData );
ScEditAttrTester aTester( pEngine );
ScEditAttrTester aTester(pEngine.get());
if ( aTester.NeedsObject() ) // only remove spelling errors
{
pOldCell->SetData(pEngine->CreateTextObject());
}
else // create a string
{
String aText = ScEditUtil::GetSpaceDelimitedString( *pEngine );
OUString aText = ScEditUtil::GetSpaceDelimitedString(*pEngine);
ScBaseCell* pNewCell = new ScStringCell( aText );
pNewCell->TakeBroadcaster( pOldCell->ReleaseBroadcaster() );
maItems[i].pCell = pNewCell;
delete pOldCell;
}
}
delete pEngine;
}
void ScColumn::RemoveEditAttribs( SCROW nStartRow, SCROW nEndRow )
{
ScFieldEditEngine* pEngine = NULL;
boost::scoped_ptr<ScFieldEditEngine> pEngine;
SCSIZE i;
Search( nStartRow, i );
@@ -958,7 +957,7 @@ void ScColumn::RemoveEditAttribs( SCROW nStartRow, SCROW nEndRow )
// test for attributes
if ( !pEngine )
{
pEngine = new ScFieldEditEngine(pDocument, pDocument->GetEditPool());
pEngine.reset(new ScFieldEditEngine(pDocument, pDocument->GetEditPool()));
// EE_CNTRL_ONLINESPELLING if there are errors already
pEngine->SetControlWord( pEngine->GetControlWord() | EE_CNTRL_ONLINESPELLING );
pDocument->ApplyAsianEditSettings( *pEngine );
@@ -994,13 +993,10 @@ void ScColumn::RemoveEditAttribs( SCROW nStartRow, SCROW nEndRow )
{
String aText = ScEditUtil::GetSpaceDelimitedString( *pEngine );
ScBaseCell* pNewCell = new ScStringCell( aText );
pNewCell->TakeBroadcaster( pOldCell->ReleaseBroadcaster() );
maItems[i].pCell = pNewCell;
delete pOldCell;
}
}
delete pEngine;
}
// =========================================================================================
@@ -1522,18 +1518,8 @@ void ScColumn::SetCell(SCROW nRow, ScBaseCell* pNewCell)
if (Search(nRow, nIndex))
{
ScBaseCell* pOldCell = maItems[nIndex].pCell;
// move broadcaster and note to new cell, if not existing in new cell
if (pOldCell->HasBroadcaster() && !pNewCell->HasBroadcaster())
pNewCell->TakeBroadcaster( pOldCell->ReleaseBroadcaster() );
if ( pOldCell->GetCellType() == CELLTYPE_FORMULA && !pDocument->IsClipOrUndo() )
{
static_cast<ScFormulaCell*>(pOldCell)->EndListeningTo( pDocument );
// If in EndListening NoteCell is destroyed in same Col
if ( nIndex >= maItems.size() || maItems[nIndex].nRow != nRow )
Search(nRow, nIndex);
}
pOldCell->Delete();
maItems[nIndex].pCell = pNewCell;
}
@@ -1550,6 +1536,11 @@ void ScColumn::SetCell(SCROW nRow, ScBaseCell* pNewCell)
}
}
SvtBroadcaster* ScColumn::GetBroadcaster(SCROW nRow)
{
return maBroadcasters.get<SvtBroadcaster*>(nRow);
}
unsigned short ScColumn::GetTextWidth(SCROW nRow) const
{
return maTextWidths.get<unsigned short>(nRow);
@@ -1883,83 +1874,46 @@ void ScColumn::FindUsed( SCROW nStartRow, SCROW nEndRow, bool* pUsed ) const
void ScColumn::StartListening( SvtListener& rLst, SCROW nRow )
{
SvtBroadcaster* pBC = NULL;
ScBaseCell* pCell;
SCSIZE nIndex;
if (Search(nRow,nIndex))
{
pCell = maItems[nIndex].pCell;
pBC = pCell->GetBroadcaster();
}
else
{
pCell = new ScNoteCell;
Insert(nRow, pCell);
}
if (!pBC)
{
pBC = new SvtBroadcaster;
pCell->TakeBroadcaster(pBC);
}
SvtBroadcaster* pBC = new SvtBroadcaster;
maBroadcasters.set(nRow, pBC);
rLst.StartListening(*pBC);
}
void ScColumn::MoveListeners( SvtBroadcaster& rSource, SCROW nDestRow )
{
// Move listeners from the source position to the destination position.
if (!rSource.HasListeners())
// No listeners to relocate. Bail out.
return;
// See if the destination position already has a broadcaster, if not, create one.
SvtBroadcaster* pBC = NULL;
ScBaseCell* pCell;
SCSIZE nIndex;
if (Search(nDestRow,nIndex))
{
pCell = maItems[nIndex].pCell;
pBC = pCell->GetBroadcaster();
}
else
{
pCell = new ScNoteCell;
Insert(nDestRow, pCell);
}
if (!pBC)
if (maBroadcasters.is_empty(nDestRow))
{
pBC = new SvtBroadcaster;
pCell->TakeBroadcaster(pBC);
maBroadcasters.set(nDestRow, pBC);
}
else
pBC = maBroadcasters.get<SvtBroadcaster*>(nDestRow);
if (rSource.HasListeners())
SvtListenerIter aIter(rSource);
for (SvtListener* pLst = aIter.GoStart(); pLst; pLst = aIter.GoNext())
{
SvtListenerIter aIter( rSource);
for (SvtListener* pLst = aIter.GoStart(); pLst; pLst = aIter.GoNext())
{
pLst->StartListening( *pBC);
pLst->EndListening( rSource);
}
pLst->StartListening(*pBC);
pLst->EndListening(rSource);
}
}
void ScColumn::EndListening( SvtListener& rLst, SCROW nRow )
{
SCSIZE nIndex;
if (Search(nRow,nIndex))
{
ScBaseCell* pCell = maItems[nIndex].pCell;
SvtBroadcaster* pBC = pCell->GetBroadcaster();
if (pBC)
{
rLst.EndListening(*pBC);
SvtBroadcaster* pBC = maBroadcasters.get<SvtBroadcaster*>(nRow);
if (!pBC)
return;
if (!pBC->HasListeners())
{
if (pCell->IsBlank())
DeleteAtIndex(nIndex);
else
pCell->DeleteBroadcaster();
}
}
}
rLst.EndListening(*pBC);
if (!pBC->HasListeners())
// There is no more listeners for this cell. Remove the broadcaster.
maBroadcasters.set_empty(nRow, nRow);
}
void ScColumn::CompileDBFormula()
@@ -2036,10 +1990,6 @@ static void lcl_UpdateSubTotal( ScFunctionData& rData, const ScBaseCell* pCell )
}
}
break;
case CELLTYPE_NOTE:
bCell = false;
break;
// nothing for strings
default:
{
// added to avoid warnings
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 2334330..8cd890e 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -75,17 +75,6 @@ void ScColumn::Insert( SCROW nRow, ScBaseCell* pNewCell )
CellType eCellType = pNewCell->GetCellType();
if (eCellType == CELLTYPE_FORMULA)
static_cast<ScFormulaCell*>(pNewCell)->StartListeningTo(pDocument);
// A note cell is only created by StartListeningCell when loading,
// triggering Formula cells must be dirty anyway.
if ( !(pDocument->IsCalcingAfterLoad() && eCellType == CELLTYPE_NOTE) )
{
if ( eCellType == CELLTYPE_FORMULA )
((ScFormulaCell*)pNewCell)->SetDirty();
else
pDocument->Broadcast( ScHint( SC_HINT_DATACHANGED,
ScAddress( nCol, nRow, nTab ), pNewCell->GetBroadcaster()) );
}
}
}
@@ -112,32 +101,22 @@ void ScColumn::Append( SCROW nRow, ScBaseCell* pCell )
void ScColumn::Delete( SCROW nRow )
{
SCSIZE nIndex;
if (!Search(nRow, nIndex))
return;
if (Search(nRow, nIndex))
{
ScBaseCell* pCell = maItems[nIndex].pCell;
ScNoteCell* pNoteCell = new ScNoteCell;
maItems[nIndex].pCell = pNoteCell; // Dummy for Interpret
pDocument->Broadcast( ScHint( SC_HINT_DYING,
ScAddress( nCol, nRow, nTab ), pCell->GetBroadcaster()));
if ( SvtBroadcaster* pBC = pCell->ReleaseBroadcaster() )
{
pNoteCell->TakeBroadcaster( pBC );
}
else
{
pNoteCell->Delete();
maItems.erase( maItems.begin() + nIndex);
maTextWidths.set_empty(nRow, nRow);
maScriptTypes.set_empty(nRow, nRow);
// Should we free memory here (delta)? It'll be slower!
}
if (pCell->GetCellType() == CELLTYPE_FORMULA)
static_cast<ScFormulaCell*>(pCell)->EndListeningTo(pDocument);
pCell->Delete();
ScBaseCell* pCell = maItems[nIndex].pCell;
pDocument->Broadcast(
ScHint(SC_HINT_DYING, ScAddress(nCol, nRow, nTab), GetBroadcaster(nRow)));
CellStorageModified();
}
maItems.erase(maItems.begin() + nIndex);
maTextWidths.set_empty(nRow, nRow);
maScriptTypes.set_empty(nRow, nRow);
// Should we free memory here (delta)? It'll be slower!
if (pCell->GetCellType() == CELLTYPE_FORMULA)
static_cast<ScFormulaCell*>(pCell)->EndListeningTo(pDocument);
pCell->Delete();
CellStorageModified();
}
@@ -145,11 +124,8 @@ void ScColumn::DeleteAtIndex( SCSIZE nIndex )
{
ScBaseCell* pCell = maItems[nIndex].pCell;
SCROW nRow = maItems[nIndex].nRow;
ScNoteCell* pNoteCell = new ScNoteCell;
maItems[nIndex].pCell = pNoteCell; // Dummy for Interpret
pDocument->Broadcast(
ScHint(SC_HINT_DYING, ScAddress(nCol, nRow, nTab), pCell->GetBroadcaster()));
pNoteCell->Delete();
ScHint(SC_HINT_DYING, ScAddress(nCol, nRow, nTab), maBroadcasters.get<SvtBroadcaster*>(nRow)));
maItems.erase(maItems.begin() + nIndex);
if (pCell->GetCellType() == CELLTYPE_FORMULA)
static_cast<ScFormulaCell*>(pCell)->EndListeningTo(pDocument);
@@ -191,30 +167,24 @@ void ScColumn::DeleteRow( SCROW nStartRow, SCSIZE nSize )
sal_Bool bOldAutoCalc = pDocument->GetAutoCalc();
pDocument->SetAutoCalc( false ); // Avoid calculating it multiple times
sal_Bool bFound=false;
bool bFound = false;
SCROW nEndRow = nStartRow + nSize - 1;
SCSIZE nStartIndex = 0;
SCSIZE nEndIndex = 0;
SCSIZE i;
maBroadcasters.set_empty(nStartRow, nEndRow);
for ( i = nFirstIndex; i < maItems.size() && maItems[i].nRow <= nEndRow; i++ )
{
if (!bFound)
{
nStartIndex = i;
bFound = sal_True;
bFound = true;
}
nEndIndex = i;
ScBaseCell* pCell = maItems[i].pCell;
SvtBroadcaster* pBC = pCell->GetBroadcaster();
if (pBC)
{
// Now returns invalid reference; direct References are not moved
pCell->DeleteBroadcaster();
// We delete empty Broadcaster in DeleteRange
}
}
if (bFound)
{
DeleteRange( nStartIndex, nEndIndex, IDF_CONTENTS );
@@ -319,10 +289,6 @@ bool checkDeleteCellByFlag(
case CELLTYPE_FORMULA:
bDelete = (nDelFlag & IDF_FORMULA) != 0;
break;
case CELLTYPE_NOTE:
// do note delete note cell with broadcaster
bDelete = !rEntry.pCell->GetBroadcaster();
break;
default:; // added to avoid warnings
}
@@ -349,12 +315,10 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe
RemovedSegments_t aRemovedSegments(nStartIndex, maItems.size(), false);
SCSIZE nFirst = nStartIndex;
// dummy replacement for old cells, to prevent that interpreter uses old cell
boost::scoped_ptr<ScNoteCell> pDummyCell(new ScNoteCell);
for ( SCSIZE nIdx = nStartIndex; nIdx <= nEndIndex; ++nIdx )
{
if (((nDelFlag & IDF_CONTENTS) == IDF_CONTENTS) && !maItems[ nIdx ].pCell->GetBroadcaster())
SCROW nRow = maItems[nIdx].nRow;
if (((nDelFlag & IDF_CONTENTS) == IDF_CONTENTS) && maBroadcasters.is_empty(nRow))
{
// all content is deleted and cell does not contain broadcaster
@@ -365,14 +329,8 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe
aDelCells.push_back( static_cast< ScFormulaCell* >( pOldCell ) );
}
else
{
// interpret in broadcast must not use the old cell
maItems[ nIdx ].pCell = pDummyCell.get();
aHint.GetAddress().SetRow( maItems[ nIdx ].nRow );
aHint.SetBroadcaster(pOldCell->GetBroadcaster());
pDocument->Broadcast( aHint );
pOldCell->Delete();
}
continue;
}
@@ -392,51 +350,14 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe
if (bDelete)
{
// Try to create a replacement "note" cell if broadcaster exists.
ScNoteCell* pNoteCell = NULL;
SvtBroadcaster* pBC = pOldCell->GetBroadcaster();
if (pBC && pBC->HasListeners())
{
// NOTE: the broadcaster here is transferred and released only
// if it has listeners! If it does not, it will simply be
// deleted when the cell is deleted and no replacement cell is
// created.
pNoteCell = new ScNoteCell(pBC);
pOldCell->ReleaseBroadcaster();
}
// remove cell entry in cell item list
SCROW nOldRow = maItems[nIdx].nRow;
if (pNoteCell)
{
// replace old cell with the replacement note cell
maItems[nIdx].pCell = pNoteCell;
// ... so it's not really deleted
bDelete = false;
}
else
maItems[nIdx].pCell = pDummyCell.get();
if (eCellType == CELLTYPE_FORMULA)
{
// Cache formula cells (will be deleted later), delete cell of other type.
aDelCells.push_back(static_cast<ScFormulaCell*>(pOldCell));
}
else
{
aHint.GetAddress().SetRow(nOldRow);
SvtBroadcaster* pHintBC = NULL;
if (pNoteCell)
pHintBC = pNoteCell->GetBroadcaster();
else if (pOldCell)
pHintBC = pOldCell->GetBroadcaster();
aHint.SetBroadcaster(pHintBC);
pDocument->Broadcast(aHint);
if (pNoteCell != pOldCell)
{
pOldCell->Delete();
}
}
pOldCell->Delete();
}
if (!bDelete)
@@ -498,27 +419,14 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, sal_uInt16 nDe
// NOTE: this actually may remove ScNoteCell entries from maItems if
// the last listener is removed from a broadcaster.
for ( FormulaCellVector::iterator aIt = aDelCells.begin(), aEnd = aDelCells.end(); aIt != aEnd; ++aIt )
(*aIt)->EndListeningTo( pDocument );
// NOTE: the vector does not contain cells with broadcasters that have
// listeners. If it would, broadcasters that were deleted during
// EndListeningTo() would have to be released from these cells.
// broadcast SC_HINT_DYING for all cells and delete them
for ( FormulaCellVector::iterator aIt = aDelCells.begin(), aEnd = aDelCells.end(); aIt != aEnd; ++aIt )
{
// A formula cell's broadcaster now is at the replacement cell, use
// that. If there is no cell anymore it means all listeners are
// gone for this formula cell and the replacement cell was removed
// from maItems.
SCSIZE nIndex;
ScBaseCell* pCell = (Search( (*aIt)->aPos.Row(), nIndex) ? maItems[nIndex].pCell : NULL);
aHint.SetBroadcaster(pCell ? pCell->GetBroadcaster() : NULL);
aHint.SetAddress( (*aIt)->aPos );
pDocument->Broadcast( aHint );
(*aIt)->EndListeningTo( pDocument );
(*aIt)->Delete();
}
}
// TODO: Broadcasting is temporarily removed from this method. Add it back
// once the broadcaster refactoring is finished.
}
@@ -652,23 +560,19 @@ void ScColumn::CopyFromClip(SCROW nRow1, SCROW nRow2, long nDy,
while ( nStartIndex < rColumn.maItems.size() && rColumn.maItems[nStartIndex].nRow <= nRow2-nDy )
{
SCSIZE nEndIndex = nStartIndex;
if ( rColumn.maItems[nStartIndex].pCell->GetCellType() != CELLTYPE_NOTE )
SCROW nStartRow = rColumn.maItems[nStartIndex].nRow;
SCROW nEndRow = nStartRow;
// find consecutive non-empty cells
while ( nEndRow < nRow2-nDy &&
nEndIndex+1 < rColumn.maItems.size() &&
rColumn.maItems[nEndIndex+1].nRow == nEndRow+1 )
{
SCROW nStartRow = rColumn.maItems[nStartIndex].nRow;
SCROW nEndRow = nStartRow;
// find consecutive non-empty cells
while ( nEndRow < nRow2-nDy &&
nEndIndex+1 < rColumn.maItems.size() &&
rColumn.maItems[nEndIndex+1].nRow == nEndRow+1 &&
rColumn.maItems[nEndIndex+1].pCell->GetCellType() != CELLTYPE_NOTE )
{
++nEndIndex;
++nEndRow;
}
rColumn.pAttrArray->CopyAreaSafe( nStartRow+nDy, nEndRow+nDy, nDy, *pAttrArray );
++nEndIndex;
++nEndRow;
}
rColumn.pAttrArray->CopyAreaSafe( nStartRow+nDy, nEndRow+nDy, nDy, *pAttrArray );
nStartIndex = nEndIndex + 1;
}
}
@@ -780,10 +684,6 @@ ScBaseCell* ScColumn::CloneCell(
ScBaseCell& rSource = *maItems[nIndex].pCell;
switch (rSource.GetCellType())
{
case CELLTYPE_NOTE:
// note will be cloned below
break;
case CELLTYPE_STRING:
case CELLTYPE_EDIT:
// note will be cloned below
@@ -960,8 +860,8 @@ void ScColumn::MixData( SCROW nRow1, SCROW nRow2,
CellType eSrcType = pSrc ? pSrc->GetCellType() : CELLTYPE_NONE;
CellType eDestType = pDest ? pDest->GetCellType() : CELLTYPE_NONE;
sal_Bool bSrcEmpty = ( eSrcType == CELLTYPE_NONE || eSrcType == CELLTYPE_NOTE );
sal_Bool bDestEmpty = ( eDestType == CELLTYPE_NONE || eDestType == CELLTYPE_NOTE );
bool bSrcEmpty = (eSrcType == CELLTYPE_NONE);
bool bDestEmpty = (eDestType == CELLTYPE_NONE);
if ( bSkipEmpty && bDestEmpty ) // Restore original row
{
@@ -1060,10 +960,7 @@ void ScColumn::MixData( SCROW nRow1, SCROW nRow2,
{
if (pDest && !pNew) // Old cell present?
{
if ( pDest->GetBroadcaster() )
pNew = new ScNoteCell; // Take over Broadcaster
else
Delete(nRow); // -> Delete
Delete(nRow); // -> Delete
}
if (pNew)
Insert(nRow, pNew); // Insert new one
@@ -1139,21 +1036,23 @@ void ScColumn::StartNeededListeners()
void ScColumn::BroadcastInArea( SCROW nRow1, SCROW nRow2 )
{
if ( !maItems.empty() )
if (maItems.empty())
return;
SCROW nRow;
SCSIZE nIndex;
if (!Search(nRow1, nIndex))
return;
while ( nIndex < maItems.size() && (nRow = maItems[nIndex].nRow) <= nRow2 )
{
SCROW nRow;
SCSIZE nIndex;
Search( nRow1, nIndex );
while ( nIndex < maItems.size() && (nRow = maItems[nIndex].nRow) <= nRow2 )
{
ScBaseCell* pCell = maItems[nIndex].pCell;
if ( pCell->GetCellType() == CELLTYPE_FORMULA )
((ScFormulaCell*)pCell)->SetDirty();
else
pDocument->Broadcast( ScHint( SC_HINT_DATACHANGED,
ScAddress(nCol, nRow, nTab), pCell->GetBroadcaster()));
nIndex++;
}
ScBaseCell* pCell = maItems[nIndex].pCell;
if ( pCell->GetCellType() == CELLTYPE_FORMULA )
((ScFormulaCell*)pCell)->SetDirty();
else
pDocument->Broadcast( ScHint( SC_HINT_DATACHANGED,
ScAddress(nCol, nRow, nTab), GetBroadcaster(nRow)));
nIndex++;
}
}
@@ -1272,8 +1171,6 @@ bool ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
if ( rString == aStr )
bIsText = true;
break;
case CELLTYPE_NOTE : // Referenced via = Formula
break;
default:
if ( i == maItems.size() - 1 )
i = 0;
@@ -1392,25 +1289,10 @@ bool ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
if (Search(nRow, i))
{
ScBaseCell* pOldCell = maItems[i].pCell;
SvtBroadcaster* pBC = pOldCell->ReleaseBroadcaster();
if (pNewCell || pBC)
if (pNewCell)
{
if(!pNewCell)
pNewCell = new ScNoteCell();
if (pBC)
{
pNewCell->TakeBroadcaster(pBC);
pLastFormulaTreeTop = 0; // Err527 Workaround
}
if ( pOldCell->GetCellType() == CELLTYPE_FORMULA )
{
static_cast<ScFormulaCell*>(pOldCell)->EndListeningTo(pDocument);
// If in EndListening NoteCell destroyed in same in gleicher Col
if ( i >= maItems.size() || maItems[i].nRow != nRow )
Search(nRow, i);
}
pOldCell->Delete();
maItems[i].pCell = pNewCell; // Replace
@@ -1425,7 +1307,7 @@ bool ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
}
else
pDocument->Broadcast( ScHint( SC_HINT_DATACHANGED,
ScAddress(nCol, nRow, nTabP), pNewCell->GetBroadcaster()));
ScAddress(nCol, nRow, nTabP), GetBroadcaster(nRow)));
}
else
{
@@ -1525,11 +1407,6 @@ void ScColumn::GetFilterEntries(SCROW nStartRow, SCROW nEndRow, std::vector<ScTy
nValue = pFC->GetValue();
}
break;
// skip broadcaster cells
case CELLTYPE_NOTE:
continue;
default:
;
}
@@ -1710,13 +1587,8 @@ void ScColumn::GetString( SCROW nRow, OUString& rString ) const
{
ScRefCellValue aCell;
aCell.assign(*maItems[nIndex].pCell);
if (aCell.meType != CELLTYPE_NOTE)
{
sal_uLong nFormat = GetNumberFormat( nRow );
ScCellFormat::GetString(aCell, nFormat, rString, &pColor, *(pDocument->GetFormatTable()));
}
else
rString = EMPTY_OUSTRING;
sal_uLong nFormat = GetNumberFormat( nRow );
ScCellFormat::GetString(aCell, nFormat, rString, &pColor, *(pDocument->GetFormatTable()));
}
else
rString = EMPTY_OUSTRING;
@@ -1755,13 +1627,8 @@ void ScColumn::GetInputString( SCROW nRow, OUString& rString ) const
{
ScRefCellValue aCell;
aCell.assign(*maItems[nIndex].pCell);
if (aCell.meType != CELLTYPE_NOTE)
{
sal_uLong nFormat = GetNumberFormat( nRow );
ScCellFormat::GetInputString(aCell, nFormat, rString, *(pDocument->GetFormatTable()));
}
else
rString = OUString();
sal_uLong nFormat = GetNumberFormat( nRow );
ScCellFormat::GetInputString(aCell, nFormat, rString, *(pDocument->GetFormatTable()));
}
else
rString = OUString();
@@ -1936,31 +1803,28 @@ sal_Int32 ScColumn::GetMaxStringLen( SCROW nRowStart, SCROW nRowEnd, CharSet eCh
{
ScRefCellValue aCell;
aCell.assign(*maItems[nIndex].pCell);
if (aCell.meType != CELLTYPE_NOTE)
Color* pColor;
sal_uLong nFormat = (sal_uLong) ((SfxUInt32Item*) GetAttr(
nRow, ATTR_VALUE_FORMAT ))->GetValue();
ScCellFormat::GetString(aCell, nFormat, aString, &pColor, *pNumFmt);
sal_Int32 nLen;
if (bIsOctetTextEncoding)
{
Color* pColor;
sal_uLong nFormat = (sal_uLong) ((SfxUInt32Item*) GetAttr(
nRow, ATTR_VALUE_FORMAT ))->GetValue();
ScCellFormat::GetString(aCell, nFormat, aString, &pColor, *pNumFmt);
sal_Int32 nLen;
if (bIsOctetTextEncoding)
if (!aString.convertToString( &aOString, eCharSet,
RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR))
{
if (!aString.convertToString( &aOString, eCharSet,
RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR))
{
// TODO: anything? this is used by the dBase export filter
// that throws an error anyway, but in case of another
// context we might want to indicate a conversion error
// early.
}
nLen = aOString.getLength();
// TODO: anything? this is used by the dBase export filter
// that throws an error anyway, but in case of another
// context we might want to indicate a conversion error
// early.
}
else
nLen = aString.getLength() * sizeof(sal_Unicode);
if ( nStringLen < nLen)
nStringLen = nLen;
nLen = aOString.getLength();
}
else
nLen = aString.getLength() * sizeof(sal_Unicode);
if ( nStringLen < nLen)
nStringLen = nLen;
nIndex++;
}
}
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index c091cd5..e889a93 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1650,7 +1650,7 @@ bool ScCondDateFormatEntry::IsValid( const ScAddress& rPos ) const
{
CellType eCellType = mpDoc->GetCellType(rPos);
if (eCellType == CELLTYPE_NONE || eCellType == CELLTYPE_NOTE)
if (eCellType == CELLTYPE_NONE)
// empty cell.
return false;
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index 173905a..b834a0c 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -1245,9 +1245,7 @@ ScBaseCell* ScQueryCellIterator::GetThis()
(nRow = pCol->maItems[nColRow].nRow) <= mpParam->nRow2 )
{
ScBaseCell* pCell = pCol->maItems[nColRow].pCell;
if ( pCell->GetCellType() == CELLTYPE_NOTE )
++nRow;
else if (bAllStringIgnore && pCell->HasStringData())
if (bAllStringIgnore && pCell->HasStringData())
++nRow;
else
{
@@ -1559,8 +1557,6 @@ ScBaseCell* ScQueryCellIterator::BinarySearch()
{
SCSIZE nMid = (nLo+nHi)/2;
SCSIZE i = nMid;
while (i <= nHi && pCol->maItems[i].pCell->GetCellType() == CELLTYPE_NOTE)
++i;
if (i > nHi)
{
if (nMid > 0)
diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index 37e4be0..fa5f79e 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -69,7 +69,7 @@ bool ScDocument::Solver(SCCOL nFCol, SCROW nFRow, SCTAB nFTab,
// as previously done in ScInterpreter::GetDouble
double nTargetVal = 0.0;
sal_uInt32 nFIndex = 0;
if (eFType == CELLTYPE_FORMULA && (eVType == CELLTYPE_VALUE || eVType == CELLTYPE_NOTE) &&
if (eFType == CELLTYPE_FORMULA && (eVType == CELLTYPE_VALUE) &&
GetFormatTable()->IsNumberFormat(sValStr, nFIndex, nTargetVal))
{
ScSingleRefData aRefData;
diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx
index 191ca7d..1af78e0 100644
--- a/sc/source/core/data/documen7.cxx
+++ b/sc/source/core/data/documen7.cxx
@@ -444,8 +444,9 @@ void ScDocument::TrackFormulas( sal_uLong nHintId )
pTrack = pFormulaTrack;
do
{
ScHint aHint( nHintId, pTrack->aPos, pTrack->GetBroadcaster() );
if ( ( pBC = pTrack->GetBroadcaster() ) != NULL )
pBC = GetBroadcaster(pTrack->aPos);
ScHint aHint(nHintId, pTrack->aPos, pBC);
if (pBC)
pBC->Broadcast( aHint );
pBASM->AreaBroadcast( aHint );
// Repaint fuer bedingte Formate mit relativen Referenzen:
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 3a07d3f..7a26719 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2202,6 +2202,14 @@ ScDocument::NumFmtMergeHandler::~NumFmtMergeHandler()
mpDoc->pFormatExchangeList = NULL;
}
SvtBroadcaster* ScDocument::GetBroadcaster( const ScAddress& rPos )
{
if (!TableExists(rPos.Tab()))
return NULL;
return maTabs[rPos.Tab()]->GetBroadcaster(rPos.Col(), rPos.Row());
}
bool ScDocument::TableExists( SCTAB nTab ) const
{
return ValidTab(nTab) && static_cast<size_t>(nTab) < maTabs.size() && maTabs[nTab];
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 1e37c6d..8eb78e64 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -381,11 +381,8 @@ void ScDocument::FillInfo( ScTableInfo& rTabInfo, SCCOL nX1, SCROW nY1, SCCOL nX
RowInfo* pThisRowInfo = &pRowInfo[nArrY];
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrX];
pInfo->maCell.assign(*pThisCol->maItems[nUIndex].pCell);
if (pInfo->maCell.meType != CELLTYPE_NOTE)
{
pThisRowInfo->bEmptyText = false; // Zeile nicht leer
pInfo->bEmptyCellText = false; // Zelle nicht leer
}
pThisRowInfo->bEmptyText = false; // Zeile nicht leer
pInfo->bEmptyCellText = false; // Zelle nicht leer
++nArrY;
}
++nUIndex;
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 7abc279..37278d6 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -1390,7 +1390,7 @@ bool ScTable::GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, const ScMarkData& rMa
ScBaseCell* pCell = NULL;
while ( aColIter.Next( nCellRow, pCell ) )
{
if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
if (pCell)
{
rRow = nCellRow;
return true; // Zelle gefunden
@@ -1800,7 +1800,7 @@ void ScTable::MaybeAddExtraColumn(SCCOL& rCol, SCROW nRow, OutputDevice* pDev, d
while (nMissing > 0 && nNewCol < MAXCOL)
{
ScBaseCell* pNextCell = aCol[nNewCol+1].GetCell(nRow);
if (pNextCell && pNextCell->GetCellType() != CELLTYPE_NOTE)
if (pNextCell)
// Cell content in a next column ends display of this string.
nMissing = 0;
else
@@ -2160,6 +2160,14 @@ ScRefCellValue ScTable::GetRefCellValue( SCCOL nCol, SCROW nRow )
return aCol[nCol].GetRefCellValue(nRow);
}
SvtBroadcaster* ScTable::GetBroadcaster( SCCOL nCol, SCROW nRow )
{
if (!ValidColRow(nCol, nRow))
return NULL;
return aCol[nCol].GetBroadcaster(nRow);
}
void ScTable::DeleteConditionalFormat( sal_uLong nIndex )
{
mpCondFormatList->erase(nIndex);
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index ec4e67b..a668a2c 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -377,18 +377,6 @@ short ScTable::CompareCell( sal_uInt16 nSort,
short nRes = 0;
CellType eType1 = CELLTYPE_NONE, eType2 = CELLTYPE_NONE;
if (pCell1)
{
eType1 = pCell1->GetCellType();
if (eType1 == CELLTYPE_NOTE)
pCell1 = NULL;
}
if (pCell2)
{
eType2 = pCell2->GetCellType();
if (eType2 == CELLTYPE_NOTE)
pCell2 = NULL;
}
if (pCell1)
{
@@ -1367,7 +1355,7 @@ public:
// Error cell is evaluated as string (for now).
aCellStr = ScGlobal::GetErrorString(static_cast<ScFormulaCell*>(pCell)->GetErrCode());
}
else if (pCell->GetCellType() != CELLTYPE_NOTE)
else
{
sal_uLong nFormat = mrTab.GetNumberFormat( static_cast<SCCOL>(rEntry.nField), nRow );
ScRefCellValue aCell;
@@ -1660,8 +1648,7 @@ void ScTable::TopTenQuery( ScQueryParam& rParam )
ScSortInfo** ppInfo = pArray->GetFirstArray();
SCSIZE nValidCount = nCount;
// keine Note-/Leerzellen zaehlen, sind ans Ende sortiert
while ( nValidCount > 0 && ( ppInfo[nValidCount-1]->pCell == NULL ||
ppInfo[nValidCount-1]->pCell->GetCellType() == CELLTYPE_NOTE ) )
while ( nValidCount > 0 && (ppInfo[nValidCount-1]->pCell == NULL) )
nValidCount--;
// keine Strings zaehlen, sind zwischen Value und Leer
while ( nValidCount > 0
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index 8b8b67b..d63971e 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -1477,7 +1477,7 @@ void ScTable::FillSeries( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
pProgress->SetStateOnPercent( ++nProgress );
}
}
else if (eCellType != CELLTYPE_NOTE)
else
{
for (rInner = nIMin; rInner <= nIMax; rInner++)
{
diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx
index cbffff1..852c2c0 100644
--- a/sc/source/core/data/table5.cxx
+++ b/sc/source/core/data/table5.cxx
@@ -1166,7 +1166,7 @@ void ScTable::InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress* p
switch ( pCell->GetCellType() )
{
case CELLTYPE_VALUE :
pDocument->Broadcast(ScHint(SC_HINT_DATACHANGED, ScAddress(nCol, nRow, nTab), pCell->GetBroadcaster()));
pDocument->Broadcast(ScHint(SC_HINT_DATACHANGED, ScAddress(nCol, nRow, nTab), GetBroadcaster(nCol, nRow)));
break;
case CELLTYPE_FORMULA :
((ScFormulaCell*)pCell)->SetDirty();
@@ -1209,7 +1209,7 @@ void ScTable::InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress* p
{
case CELLTYPE_VALUE :
pDocument->Broadcast(
ScHint(SC_HINT_DATACHANGED, ScAddress(nCol, nRow, nTab), pCell->GetBroadcaster()));
ScHint(SC_HINT_DATACHANGED, ScAddress(nCol, nRow, nTab), GetBroadcaster(nCol, nRow)));
break;
case CELLTYPE_FORMULA :
((ScFormulaCell*)pCell)->SetDirty();
diff --git a/sc/source/core/data/table6.cxx b/sc/source/core/data/table6.cxx
index 729f912..17f62da 100644
--- a/sc/source/core/data/table6.cxx
+++ b/sc/source/core/data/table6.cxx
@@ -817,7 +817,7 @@ bool lcl_maybeReplaceCellString(
ScColumn& rColObj, SCCOL& rCol, SCROW& rRow, OUString& rUndoStr, SCCOL nCol, SCROW nRow, const SvxSearchItem& rSearchItem)
{
ScBaseCell* pCell = rColObj.GetCell(nRow);
if (!pCell || pCell->GetCellType() == CELLTYPE_NOTE)
if (!pCell)
{
// empty cell found.
rCol = nCol;
@@ -1020,27 +1020,6 @@ bool ScTable::SearchRangeForAllEmptyCells(
}
}
}
else if (pCell->GetCellType() == CELLTYPE_NOTE)
{
rMatchedRanges.Join(ScRange(nCol, nRow, nTab));
bFound = true;
if (bReplace)
{
if (pUndoDoc)
{
ScAddress aCellPos(nCol, nRow, nTab);
pUndoDoc->PutCell(aCellPos, pCell->Clone(*pUndoDoc, aCellPos));
ScNotes* pNotes = pUndoDoc->GetNotes(nTab);
ScPostIt* pPostIt = maNotes.findByAddress(nCol, nRow);
if (pPostIt)
{
pNotes->insert(nCol, nRow, pPostIt->Clone(ScAddress(nCol, nRow, nTab), *pUndoDoc, ScAddress(nCol, nRow, nTab), true));
}
}
aCol[nCol].SetString(nRow, nTab, rSearchItem.GetReplaceString(), pDocument->GetAddressConvention());
}
}
}
}
return bFound;
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 0c16240..ff9f7cb 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -2130,7 +2130,7 @@ void ScInterpreter::ScIsEmpty()
// ScCountEmptyCells().
ScRefCellValue aCell;
aCell.assign(*pDok, aAdr);
if ((aCell.meType == CELLTYPE_NONE) || (aCell.meType == CELLTYPE_NOTE))
if (aCell.meType == CELLTYPE_NONE)
nRes = 1;
}
break;
@@ -2298,9 +2298,6 @@ void ScInterpreter::ScType()
switch (aCell.meType)
{
// NOTE: this is Xcl nonsense!
case CELLTYPE_NOTE :
nType = 1; // empty cell is value (0)
break;
case CELLTYPE_STRING :
case CELLTYPE_EDIT :
nType = 2;
@@ -4129,7 +4126,7 @@ double ScInterpreter::IterateParameters( ScIterFunc eFunc, bool bTextAsZero )
if( eFunc == ifCOUNT2 )
{
CellType eCellType = aCell.meType;
if (eCellType != CELLTYPE_NONE && eCellType != CELLTYPE_NOTE)
if (eCellType != CELLTYPE_NONE)
nCount++;
if ( nGlobalError )
nGlobalError = 0;
@@ -5399,7 +5396,7 @@ void ScInterpreter::ScCountEmptyCells()
ScAddress aAdr;
PopSingleRef( aAdr );
eCellType = pDok->GetCellType(aAdr);
if (eCellType != CELLTYPE_NONE && eCellType != CELLTYPE_NOTE)
if (eCellType != CELLTYPE_NONE)
nCount = 1;
}
break;
@@ -7314,18 +7311,10 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
}
else
{
if (aCell.meType == CELLTYPE_NOTE)
{
rItem.meType = ScQueryEntry::ByValue;
rItem.mfVal = 0.0;
}
else
{
OUString aStr;
GetCellString(aStr, aCell);
rItem.meType = ScQueryEntry::ByString;
rItem.maString = aStr;
}
OUString aStr;
GetCellString(aStr, aCell);
rItem.meType = ScQueryEntry::ByString;
rItem.maString = aStr;
}
}
break;
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 40d5d83..adbf268 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -498,7 +498,6 @@ double ScInterpreter::GetCellValueOrZero( const ScAddress& rPos, ScRefCellValue&
}
break;
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
fValue = 0.0; // empty or broadcaster cell
break;
#if OSL_DEBUG_LEVEL > 0
diff --git a/sc/source/filter/dif/difexp.cxx b/sc/source/filter/dif/difexp.cxx
index 704edb1..e4b5a77 100644
--- a/sc/source/filter/dif/difexp.cxx
+++ b/sc/source/filter/dif/difexp.cxx
@@ -163,7 +163,6 @@ FltError ScFormatFilterPluginImpl::ScExportDif( SvStream& rOut, ScDocument* pDoc
switch (aCell.meType)
{
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
aOS.appendAscii(pEmptyData);
break;
case CELLTYPE_VALUE:
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index 4851f20..9c29380 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -2383,7 +2383,6 @@ XclExpCellTable::XclExpCellTable( const XclExpRoot& rRoot ) :
OSL_FAIL( "XclExpCellTable::XclExpCellTable - unknown cell type" );
// run-through!
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
{
xCell.reset( new XclExpBlankCell(
GetRoot(), aXclPos, nLastXclCol, pPattern, nMergeBaseXFId ) );
diff --git a/sc/source/filter/html/htmlexp.cxx b/sc/source/filter/html/htmlexp.cxx
index 9cf0b3e..424f1d9 100644
--- a/sc/source/filter/html/htmlexp.cxx
+++ b/sc/source/filter/html/htmlexp.cxx
@@ -1138,9 +1138,6 @@ void ScHTMLExport::WriteCell( SCCOL nCol, SCROW nRow, SCTAB nTab )
Color* pColor;
switch (aCell.meType)
{
case CELLTYPE_NOTE :
// nothing
break;
case CELLTYPE_EDIT :
bFieldText = WriteFieldText(aCell.mpEditText);
if ( bFieldText )
diff --git a/sc/source/filter/rtf/rtfexp.cxx b/sc/source/filter/rtf/rtfexp.cxx
index 7dd2475..0ab1395 100644
--- a/sc/source/filter/rtf/rtfexp.cxx
+++ b/sc/source/filter/rtf/rtfexp.cxx
@@ -177,7 +177,6 @@ void ScRTFExport::WriteCell( SCTAB nTab, SCROW nRow, SCCOL nCol )
ScAddress aPos(nCol, nRow, nTab);
switch (pDoc->GetCellType(aPos))
{
case CELLTYPE_NOTE:
case CELLTYPE_NONE:
bValueData = false;
break;
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index 556f27b..b1f83dc 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -1137,7 +1137,7 @@ namespace {
bool isEmptyOrNote( ScDocument* pDoc, const ScAddress& rCurrentPos )
{
CellType eType = pDoc->GetCellType(rCurrentPos);
return (eType == CELLTYPE_NONE) || (eType == CELLTYPE_NOTE);
return (eType == CELLTYPE_NONE);
}
}
@@ -1255,7 +1255,6 @@ OUString getOutputString( ScDocument* pDoc, const ScAddress& aCellPos )
switch (eType)
{
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
return EMPTY_OUSTRING;
case CELLTYPE_EDIT:
{
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 0fd8177..bc71e3b 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -1916,7 +1916,6 @@ void ScDocShell::AsciiSave( SvStream& rStream, const ScImportOptions& rAsciiOpt
bool bString;
switch ( eType )
{
case CELLTYPE_NOTE:
case CELLTYPE_NONE:
aString = OUString();
bString = false;
diff --git a/sc/source/ui/docshell/docsh8.cxx b/sc/source/ui/docshell/docsh8.cxx
index d86db25..120b386 100644
--- a/sc/source/ui/docshell/docsh8.cxx
+++ b/sc/source/ui/docshell/docsh8.cxx
@@ -1081,14 +1081,11 @@ sal_uLong ScDocShell::DBaseExport( const OUString& rFullFileName, CharSet eCharS
{
case sdbc::DataType::LONGVARCHAR:
{
if (pCell->meType != CELLTYPE_NOTE)
{
if (pCell->meType == CELLTYPE_EDIT)
lcl_getLongVarCharEditString(aString, *pCell, aEditEngine);
else
lcl_getLongVarCharString(
aString, aDocument, nDocCol, nDocRow, nTab, *pNumFmt);
}
if (pCell->meType == CELLTYPE_EDIT)
lcl_getLongVarCharEditString(aString, *pCell, aEditEngine);
else
lcl_getLongVarCharString(
aString, aDocument, nDocCol, nDocRow, nTab, *pNumFmt);
}
break;
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index d50856f..9b466bf 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -1650,7 +1650,6 @@ bool ScImportExport::Doc2Text( SvStream& rStrm )
lcl_WriteSimpleString( rStrm, aCell );
}
break;
case CELLTYPE_NOTE:
case CELLTYPE_NONE:
break;
default:
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 346eff2..d015522 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -3737,32 +3737,29 @@ uno::Reference<sheet::XSheetCellRanges> ScCellRangesBase::QueryDifferences_Impl(
ScCellIterator aCmpIter( pDoc, aCmpRange );
for (bool bHasCell = aCmpIter.first(); bHasCell; bHasCell = aCmpIter.next())
{
if (aCmpIter.getType() != CELLTYPE_NOTE)
{
SCCOLROW nCellPos = bColumnDiff ? static_cast<SCCOLROW>(aCmpIter.GetPos().Col()) : static_cast<SCCOLROW>(aCmpIter.GetPos().Row());
if (bColumnDiff)
aCellRange = ScRange( static_cast<SCCOL>(nCellPos),0,nTab,
static_cast<SCCOL>(nCellPos),MAXROW,nTab );
else
aCellRange = ScRange( 0,nCellPos,nTab, MAXCOL,nCellPos,nTab );
SCCOLROW nCellPos = bColumnDiff ? static_cast<SCCOLROW>(aCmpIter.GetPos().Col()) : static_cast<SCCOLROW>(aCmpIter.GetPos().Row());
if (bColumnDiff)
aCellRange = ScRange( static_cast<SCCOL>(nCellPos),0,nTab,
static_cast<SCCOL>(nCellPos),MAXROW,nTab );
else
aCellRange = ScRange( 0,nCellPos,nTab, MAXCOL,nCellPos,nTab );
for (i=0; i<nRangeCount; i++)
for (i=0; i<nRangeCount; i++)
{
ScRange aRange( *aRanges[ i ] );
if ( aRange.Intersects( aCellRange ) )
{
ScRange aRange( *aRanges[ i ] );
if ( aRange.Intersects( aCellRange ) )
if (bColumnDiff)
{
if (bColumnDiff)
{
aRange.aStart.SetCol(static_cast<SCCOL>(nCellPos));
aRange.aEnd.SetCol(static_cast<SCCOL>(nCellPos));
}
else
{
aRange.aStart.SetRow(nCellPos);
aRange.aEnd.SetRow(nCellPos);
}
aMarkData.SetMultiMarkArea( aRange );
aRange.aStart.SetCol(static_cast<SCCOL>(nCellPos));
aRange.aEnd.SetCol(static_cast<SCCOL>(nCellPos));
}
else
{
aRange.aStart.SetRow(nCellPos);
aRange.aEnd.SetRow(nCellPos);
}
aMarkData.SetMultiMarkArea( aRange );
}
}
}
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 38036b7..6ce49d2 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -2624,7 +2624,6 @@ void ScChart2DataSequence::BuildDataCache()
#endif
case CELLTYPE_EDIT:
case CELLTYPE_NONE:
case CELLTYPE_NOTE:
case CELLTYPE_STRING:
default:
; // do nothing
diff --git a/sc/source/ui/view/spelleng.cxx b/sc/source/ui/view/spelleng.cxx
index d66fc09..b900c01 100644
--- a/sc/source/ui/view/spelleng.cxx
+++ b/sc/source/ui/view/spelleng.cxx
@@ -107,7 +107,7 @@ bool ScConversionEngineBase::FindNextConversionCell()
{
ScAddress aPos( mnCurrCol, mnCurrRow, nTab );
CellType eCellType = mrDoc.GetCellType( aPos );
bool bEmptyCell = eCellType == CELLTYPE_NONE || eCellType == CELLTYPE_NOTE;
bool bEmptyCell = eCellType == CELLTYPE_NONE;
if (mpUndoDoc && !bEmptyCell)
mrDoc.CopyCellToDocument(aPos, aPos, *mpUndoDoc);