ScPostIt is the behind-the-scenes name for Notes. This move removes a
usually empty pointer for each ScBaseCell to list of pointers within
ScDocument. The advantage is basically a reduction in size of 8 bytes
per cell. The current sizeof(ScBaseCell) is 16. Here are the
highlights:
* Remove mpNote from ScBaseCell, and add a std::map (data structure) to
ScDocument to store notes and associate with addresses.
* Remove ScPostIt accessors and mutators from ScTable, ScColumn, and
ScBaseCell
* Replace ScPostIt accessors and mutators in ScDocument with ones to
handle move of data structure from ScBaseCell to ScDocument
* Rename ScPostIt.CloneWithoutNote to ScPostIt.Clone, while completely
removing ScPostIt.CloneWithNote. Any cloning of cell notes must now
be handled outside external to the ScPostIt class, through
ScDocument.*Note() functions.
* Rename ScNoteCell to a more ScEmptyCell. I expect this can be
completely removed at some point the future, if we can handle
broadcasters external to the cell logic.
* Add ScDocument and ScTable to ScUsedAreaIterator data structure to
accomodate for new placement of ScPostIt objects in ScDocument.
* Convert CELLTYPE_NOTE to CELLTYPE_EMPTY (and all ensuing uses).
* Wherever possible, respect 80-columns.
* New ScDocument based API (individually block-comment documented before
their definitions):
SC_DLLPUBLIC ScPostIt* GetNote( ScAddress const & );
SC_DLLPUBLIC ScPostIt* GetOrCreateNote( const ScAddress& rPos );
bool SetNote( ScAddress const &, ScPostIt* );
bool MoveNote( ScAddress const & from, ScAddress const & to );
bool SwapNotes( ScAddress const &, ScAddress const & );
ScPostIt* ReleaseNote( ScAddress const & );
void DeleteNote( ScAddress const & );
Of note, TakeNote has been replaced with SetNote, which returns true on
success, and false on failure. TakeNote indicated failure by removing
the passed note. The SetNote approach leaves room for the caller to
attempt to fix the issue, but also means the caller is now on the hook
to cleanup the memory. For now, the Calc-internal API is lazy and does
not take advantage of this, but merely says "You failed? Oh well,
delete the note." ... which is exactly what TakeNote did. This means, the
lazy-programmer's idiom for SetNote use is:
if ( ! pDoc->SetNote( aAddress, pNotePointer ) )
DELETEZ( pNotePointer );