summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-02-02 13:21:35 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-02-02 13:28:27 -0500
commit018500a73f3b1082b6662b7c123dfe5158ae5752 (patch)
tree8185e9232676ca390cb37082fe374982d7bb6dd5
parent31973b54efb1c607d7a53b0728264f8dd13bef0f (diff)
fdo#74325: Ensure that all note objects have an sdr object before exporting.
Otherwise, if a note hasn't been displayed at least once before saving that note would not get saved. In the future, we should modify the export code to not rely on SdrObject to check the presence of note. Change-Id: Ib7ca3ac00a0c9cdd3a01facda7af479ef172afbe
-rw-r--r--sc/inc/column.hxx1
-rw-r--r--sc/inc/document.hxx6
-rw-r--r--sc/inc/mtvcellfunc.hxx7
-rw-r--r--sc/inc/table.hxx1
-rw-r--r--sc/source/core/data/column2.cxx23
-rw-r--r--sc/source/core/data/document.cxx11
-rw-r--r--sc/source/core/data/table2.cxx6
-rw-r--r--sc/source/filter/xml/xmlwrap.cxx2
8 files changed, 57 insertions, 0 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 835daa8465db..34cef915e40a 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -515,6 +515,7 @@ public:
bool IsNotesEmptyBlock(SCROW nStartRow, SCROW nEndRow) const;
size_t GetNoteCount() const;
+ void CreateAllNoteCaptions();
SCROW GetNotePosition( size_t nIndex ) const;
void GetAllNoteEntries( std::vector<sc::NoteEntry>& rNotes ) const;
void GetNotesInRange( SCROW nStartRow, SCROW nEndRow, std::vector<sc::NoteEntry>& rNotes ) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 551557d280d8..ded209cf0439 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -913,6 +913,12 @@ public:
size_t CountNotes() const;
size_t GetNoteCount( SCTAB nTab, SCCOL nCol ) const;
+ /**
+ * Ensure that all note objects have an associated sdr object. The export
+ * code uses sdr objects to export note data.
+ */
+ void CreateAllNoteCaptions();
+
ScAddress GetNotePosition( size_t nIndex ) const;
SCROW GetNotePosition( SCTAB nTab, SCCOL nCol, size_t nIndex ) const;
diff --git a/sc/inc/mtvcellfunc.hxx b/sc/inc/mtvcellfunc.hxx
index c54d02ebd339..793f2dbc1872 100644
--- a/sc/inc/mtvcellfunc.hxx
+++ b/sc/inc/mtvcellfunc.hxx
@@ -159,6 +159,13 @@ FindFormulaEditText(const CellStoreType& rStore, SCROW nRow1, SCROW nRow2, _Func
return FindElement2<CellStoreType, edittext_block, formula_block, _Func, _Func>(rStore, nRow1, nRow2, rFunc, rFunc);
}
+template<typename _Func>
+void ProcessNote(CellNoteStoreType& rStore, _Func& rFunc)
+{
+ FuncElseNoOp<size_t> aElse;
+ ProcessElements1<CellNoteStoreType, cellnote_block, _Func, FuncElseNoOp<size_t> >(rStore, rFunc, aElse);
+}
+
}
#endif
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 548c6ccc0d81..eb17a18d90b8 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -388,6 +388,7 @@ public:
size_t GetNoteCount( SCCOL nCol ) const;
SCROW GetNotePosition( SCCOL nCol, size_t nIndex ) const;
+ void CreateAllNoteCaptions();
void GetAllNoteEntries( std::vector<sc::NoteEntry>& rNotes ) const;
void GetNotesInRange( const ScRange& rRange, std::vector<sc::NoteEntry>& rNotes ) const;
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 510ad177c9bf..7a58377ec683 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1227,6 +1227,29 @@ size_t ScColumn::GetNoteCount() const
return nCount;
}
+namespace {
+
+class NoteCaptionCreator
+{
+ ScAddress maPos;
+public:
+ NoteCaptionCreator( SCTAB nTab, SCCOL nCol ) : maPos(nCol,0,nTab) {}
+
+ void operator() ( size_t nRow, ScPostIt* p )
+ {
+ maPos.SetRow(nRow);
+ p->GetOrCreateCaption(maPos);
+ }
+};
+
+}
+
+void ScColumn::CreateAllNoteCaptions()
+{
+ NoteCaptionCreator aFunc(nTab, nCol);
+ sc::ProcessNote(maCellNotes, aFunc);
+}
+
SCROW ScColumn::GetNotePosition( size_t nIndex ) const
{
// Return the row position of the nth note in the column.
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 432888bdcef8..eab25945fddc 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -6224,6 +6224,17 @@ size_t ScDocument::GetNoteCount( SCTAB nTab, SCCOL nCol ) const
return pTab->GetNoteCount(nCol);
}
+void ScDocument::CreateAllNoteCaptions()
+{
+ TableContainer::iterator it = maTabs.begin(), itEnd = maTabs.end();
+ for (; it != itEnd; ++it)
+ {
+ ScTable* p = *it;
+ if (p)
+ p->CreateAllNoteCaptions();
+ }
+}
+
ScAddress ScDocument::GetNotePosition( size_t nIndex ) const
{
for (size_t nTab = 0; nTab < maTabs.size(); ++nTab)
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 8a16e49a2bdc..d8cfbfe3efe5 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1511,6 +1511,12 @@ SCROW ScTable::GetNotePosition( SCCOL nCol, size_t nIndex ) const
return aCol[nCol].GetNotePosition(nIndex);
}
+void ScTable::CreateAllNoteCaptions()
+{
+ for (SCCOL i = 0; i <= MAXCOL; ++i)
+ aCol[i].CreateAllNoteCaptions();
+}
+
void ScTable::GetAllNoteEntries( std::vector<sc::NoteEntry>& rNotes ) const
{
for (SCCOL nCol = 0; nCol < MAXCOLCOUNT; ++nCol)
diff --git a/sc/source/filter/xml/xmlwrap.cxx b/sc/source/filter/xml/xmlwrap.cxx
index 4e2ef7d1f5ea..b9658882bd0d 100644
--- a/sc/source/filter/xml/xmlwrap.cxx
+++ b/sc/source/filter/xml/xmlwrap.cxx
@@ -759,6 +759,8 @@ sal_Bool ScXMLImportWrapper::ExportToComponent(const uno::Reference<uno::XCompon
sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly)
{
+ rDoc.CreateAllNoteCaptions();
+
uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
uno::Reference<xml::sax::XWriter> xWriter = xml::sax::Writer::create(xContext);