[Libreoffice-commits] .: 5 commits - sc/inc sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri Aug 31 06:50:38 PDT 2012
sc/inc/conditio.hxx | 2
sc/inc/rangelst.hxx | 8
sc/source/core/data/conditio.cxx | 22 ++
sc/source/core/data/table2.cxx | 11 +
sc/source/core/tool/rangelst.cxx | 329 ++++++++++++++++++++++++++++++
sc/source/filter/oox/condformatbuffer.cxx | 1
sc/source/ui/condformat/condformatdlg.cxx | 4
7 files changed, 375 insertions(+), 2 deletions(-)
New commits:
commit 10efe1bcedfa450e95cbc3f08642d239ba2ab579
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Fri Aug 31 04:29:49 2012 +0200
handle missing cond format entries more gracefully, related fdo#52340
Change-Id: Id1cf7d99a13c04541e87ad00c5418dd4f766d268
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 12c9212..afb9c6b 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -669,6 +669,12 @@ void ScTable::CopyConditionalFormat( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCRO
if (aOldIdToNewId.find(nId) == aOldIdToNewId.end())
{
ScConditionalFormat* pFormat = pOldCondFormatList->GetFormat(nId);
+ if(!pFormat)
+ {
+ // may happen in some strange circumstances where cell storage and
+ // cond format storage are not in sync
+ continue;
+ }
ScConditionalFormat* pNewFormat = pFormat->Clone(pDocument);
pNewFormat->SetKey(0);
//not in list => create entries in both maps and new format
commit 3cf91a21fc5089fb7f051bf8a04d2049da88179f
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Fri Aug 31 04:25:47 2012 +0200
use Red as error color for cond format dlg
Change-Id: I1526a8d1f2999742f28600e771891e1489d62f4b
diff --git a/sc/source/ui/condformat/condformatdlg.cxx b/sc/source/ui/condformat/condformatdlg.cxx
index a84103c..1f9d638 100644
--- a/sc/source/ui/condformat/condformatdlg.cxx
+++ b/sc/source/ui/condformat/condformatdlg.cxx
@@ -836,7 +836,7 @@ IMPL_LINK_NOARG(ScCondFrmtEntry, TypeListHdl)
SetHeight();
return 0;
}
-
+#include <iostream>
IMPL_LINK(ScCondFrmtEntry, EdModifyHdl, Edit*, pEdit)
{
rtl::OUString aFormula = pEdit->GetText();
@@ -845,7 +845,7 @@ IMPL_LINK(ScCondFrmtEntry, EdModifyHdl, Edit*, pEdit)
boost::scoped_ptr<ScTokenArray> mpCode(aComp.CompileString(aFormula));
if(mpCode->GetCodeError())
{
- pEdit->SetControlBackground(GetSettings().GetStyleSettings().GetHighlightColor());
+ pEdit->SetControlBackground(COL_RED);
}
else
{
commit a3c4ee1653166ee2ac1f1b9d65ff1065b6288ebc
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Fri Aug 31 04:02:10 2012 +0200
update cond formats for deleting, moving and cut&paste
Change-Id: I52987e957918853bcd1abd1460c6166b52454d62
diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index 4967e82..9890758 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -290,6 +290,7 @@ public:
void CompileXML();
void UpdateReference( UpdateRefMode eUpdateRefMode,
const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
+ void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
void RenameCellStyle( const String& rOld, const String& rNew );
@@ -349,6 +350,7 @@ public:
const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
void RenameCellStyle( const String& rOld, const String& rNew );
void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
+ void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
void SourceChanged( const ScAddress& rAddr );
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 4a842fb..17483c3 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1471,6 +1471,12 @@ void ScConditionalFormat::UpdateReference( UpdateRefMode eUpdateRefMode,
itr->UpdateReference(eUpdateRefMode, rRange, nDx, nDy, nDz);
}
+void ScConditionalFormat::DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
+{
+ SCTAB nTab = maRanges[0]->aStart.Tab();
+ maRanges.DeleteArea( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
+}
+
void ScConditionalFormat::RenameCellStyle(const String& rOld, const String& rNew)
{
for(CondFormatContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
@@ -1626,6 +1632,22 @@ void ScConditionalFormatList::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos )
itr->UpdateMoveTab( nOldPos, nNewPos );
}
+void ScConditionalFormatList::DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
+{
+ for( iterator itr = begin(); itr != end(); ++itr)
+ itr->DeleteArea( nCol1, nRow1, nCol2, nRow2 );
+
+ // need to check which must be deleted
+ iterator itr = begin();
+ while(itr != end())
+ {
+ if(itr->GetRange().empty())
+ maConditionalFormats.erase(itr++);
+ else
+ ++itr;
+ }
+}
+
void ScConditionalFormatList::SourceChanged( const ScAddress& rAddr )
{
for( iterator itr = begin(); itr != end(); ++itr)
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index a2be5f5..12c9212 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -533,6 +533,8 @@ void ScTable::DeleteArea(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal
aPattern.GetItemSet().Put( ScProtectionAttr( false ) );
ApplyPatternArea( nCol1, nRow1, nCol2, nRow2, aPattern );
}
+
+ mpCondFormatList->DeleteArea( nCol1, nRow1, nCol2, nRow2 );
}
if (nDelFlag & IDF_NOTE)
@@ -561,6 +563,9 @@ void ScTable::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark )
ScRange* pRange = aRangeList[i];
if (nDelFlag & IDF_NOTE && pRange)
maNotes.erase(pRange->aStart.Col(), pRange->aStart.Row(), pRange->aEnd.Col(), pRange->aEnd.Row(), true);
+
+ if(pRange && pRange->aStart.Tab() == nTab)
+ mpCondFormatList->DeleteArea( pRange->aStart.Col(), pRange->aStart.Row(), pRange->aEnd.Col(), pRange->aEnd.Row() );
}
//
commit 7222a571d0d458810c1b23871f8b91491db4462d
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Fri Aug 31 03:59:51 2012 +0200
add ScRangeList::DeleteArea
DeleteArea can handle ranges that are deleting parts of an existing
range
Currently this code only supports a 2D deletion
Change-Id: I1c514437fdd09fea99f5c4dcf97b8375dcc53b40
diff --git a/sc/inc/rangelst.hxx b/sc/inc/rangelst.hxx
index 0c51506..74bb7be 100644
--- a/sc/inc/rangelst.hxx
+++ b/sc/inc/rangelst.hxx
@@ -68,6 +68,12 @@ public:
SCsTAB nDz
);
+ /** For now this method assumes that nTab1 == nTab2
+ * The algorithm will be much more complicated if nTab1 != nTab2
+ */
+ void DeleteArea( SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2,
+ SCROW nRow2, SCTAB nTab2 );
+
const ScRange* Find( const ScAddress& ) const;
ScRange* Find( const ScAddress& );
bool operator==( const ScRangeList& ) const;
@@ -93,6 +99,8 @@ public:
private:
::std::vector<ScRange*> maRanges;
+ typedef std::vector<ScRange*>::iterator iterator;
+ typedef std::vector<ScRange*>::const_iterator const_iterator;
};
SV_DECL_IMPL_REF( ScRangeList );
diff --git a/sc/source/core/tool/rangelst.cxx b/sc/source/core/tool/rangelst.cxx
index 4ff6ff0..14cf8b4 100644
--- a/sc/source/core/tool/rangelst.cxx
+++ b/sc/source/core/tool/rangelst.cxx
@@ -39,6 +39,8 @@
#include "compiler.hxx"
#include "stlalgorithm.hxx"
+#include <iostream>
+
using ::std::vector;
using ::std::advance;
using ::std::find_if;
@@ -62,6 +64,20 @@ private:
};
template<typename T>
+class FindRangeIn : public ::std::unary_function<bool, ScRange*>
+{
+public:
+ FindRangeIn(const T& rTest) : mrTest(rTest) {}
+ FindRangeIn(const FindRangeIn& r) : mrTest(r.mrTest) {}
+ bool operator() (const ScRange* pRange) const
+ {
+ return mrTest.In(*pRange);
+ }
+private:
+ const T& mrTest;
+};
+
+template<typename T>
class FindIntersectingRange : public ::std::unary_function<bool, ScRange*>
{
public:
@@ -436,6 +452,319 @@ bool ScRangeList::UpdateReference(
return bChanged;
}
+namespace {
+ //
+ // r.aStart.X() <= p.aStart.X() && r.aEnd.X() >= p.aEnd.X()
+ // && ( r.aStart.Y() <= p.aStart.Y() || r.aEnd.Y() >= r.aEnd.Y() )
+
+template<typename X, typename Y>
+bool checkForOneRange( X rStartX, X rEndX, Y rStartY, Y rEndY,
+ X pStartX, X pEndX, Y pStartY, Y pEndY )
+{
+ if( rStartX <= pStartX && rEndX >= pEndX
+ && ( rStartY <= pStartY || rEndY >= pEndY ) )
+ return true;
+
+ return false;
+}
+
+bool handleOneRange( const ScRange& rDeleteRange, ScRange* p )
+{
+ ScAddress rDelStart = rDeleteRange.aStart;
+ ScAddress rDelEnd = rDeleteRange.aEnd;
+ ScAddress rPStart = p->aStart;
+ ScAddress rPEnd = p->aEnd;
+ if(checkForOneRange(rDelStart.Col(), rDelEnd.Col(), rDelStart.Row(), rDelEnd.Row(),
+ rPStart.Col(), rPEnd.Col(), rPStart.Row(), rPEnd.Row()))
+ {
+ // X = Col
+ // Y = Row
+ if(rDelStart.Row() <= rPStart.Row())
+ {
+ p->aStart.SetRow(rDelEnd.Row()+1);
+ }
+ else if(rDelEnd.Row() >= rPEnd.Row())
+ {
+ p->aEnd.SetRow(rDelStart.Row()-1);
+ }
+
+ return true;
+ }
+ else if(checkForOneRange(rDelStart.Row(), rDelEnd.Row(), rDelStart.Col(), rDelEnd.Col(),
+ rPStart.Row(), rPEnd.Row(), rPStart.Col(), rPEnd.Col()))
+ {
+ // X = Row
+ // Y = Col
+ if(rDelStart.Col() <= rPStart.Col())
+ p->aStart.SetCol(rDelEnd.Col()+1);
+ else if(rDelEnd.Col() >= rPEnd.Col())
+ p->aEnd.SetCol(rDelStart.Col()-1);
+
+ return true;
+ }
+ return false;
+}
+
+template<typename X, typename Y>
+bool checkForTwoRangesCase2( X rStartX, X rEndX, Y rStartY, Y rEndY,
+ X pStartX, X pEndX, Y pStartY, Y pEndY )
+{
+ if(rStartY > pStartY && rStartX <= pStartX
+ && rEndY < pEndY && rEndX >= pEndX)
+ return true;
+
+ return false;
+}
+
+
+bool handleTwoRanges( const ScRange& rDeleteRange, ScRange* p, std::vector<ScRange>& rNewRanges )
+{
+ ScAddress rDelStart = rDeleteRange.aStart;
+ ScAddress rDelEnd = rDeleteRange.aEnd;
+ ScAddress rPStart = p->aStart;
+ ScAddress rPEnd = p->aEnd;
+ SCCOL rStartCol = rDelStart.Col();
+ SCCOL rEndCol = rDelEnd.Col();
+ SCCOL pStartCol = rPStart.Col();
+ SCCOL pEndCol = rPEnd.Col();
+ SCROW rStartRow = rDelStart.Row();
+ SCROW rEndRow = rDelEnd.Row();
+ SCROW pStartRow = rPStart.Row();
+ SCROW pEndRow = rPEnd.Row();
+ SCTAB nTab = rPStart.Tab();
+ if(rStartCol > pStartCol && rStartCol < pEndCol && rEndCol >= pEndCol)
+ {
+ if(rStartRow > pStartRow && rStartRow < pEndRow && rEndRow >= pEndRow)
+ {
+ ScRange aNewRange( pStartCol, rStartRow, nTab, rStartCol-1, pEndRow, nTab );
+ rNewRanges.push_back(aNewRange);
+
+ p->aEnd.SetRow(rStartRow -1);
+ return true;
+ }
+ else if(rEndRow > pStartRow && rEndRow < pEndRow && rStartRow <= pStartRow)
+ {
+ ScRange aNewRange( rPStart, ScAddress( pStartCol -1, pEndRow, nTab ) );
+ rNewRanges.push_back(aNewRange);
+
+ p->aStart.SetRow(rEndRow+1);
+ return true;
+ }
+ }
+ else if(rEndCol > pStartCol && rEndCol < pEndCol && rStartCol <= pStartCol)
+ {
+ if(rStartRow > pStartRow && rStartRow < pEndRow)
+ {
+ ScRange aNewRange( ScAddress( rEndCol +1, rStartRow, nTab ), rPEnd );
+ rNewRanges.push_back(aNewRange);
+
+ p->aEnd.SetRow(rStartRow-1);
+ return true;
+ }
+ else if(rEndRow > pStartRow && rEndRow < pEndRow)
+ {
+ ScRange aNewRange( rEndCol +1, pStartRow, nTab, rEndCol, rEndRow, nTab );
+ rNewRanges.push_back(aNewRange);
+
+ p->aStart.SetRow(rEndRow+1);
+ return true;
+ }
+ }
+ else if(checkForTwoRangesCase2(rDelStart.Col(), rDelEnd.Col(), rDelStart.Row(), rDelEnd.Row(),
+ rPStart.Col(), rPEnd.Col(), rPStart.Row(), rPEnd.Row()))
+ {
+ ScRange aNewRange( rPStart, ScAddress( rPEnd.Col(), rDelStart.Row() -1, nTab ) );
+ rNewRanges.push_back(aNewRange);
+
+ p->aStart.SetRow(rEndRow+1);
+ return true;
+ }
+ else if(checkForTwoRangesCase2(rDelStart.Row(), rDelEnd.Row(), rDelStart.Col(), rDelEnd.Col(),
+ rPStart.Row(), rPEnd.Row(), rPStart.Col(), rPEnd.Col()))
+ {
+ ScRange aNewRange( rPStart, ScAddress( rDelStart.Col() -1, rPEnd.Row(), nTab ) );
+ rNewRanges.push_back(aNewRange);
+
+ p->aStart.SetCol(rEndCol+1);
+ return true;
+ }
+
+ return false;
+}
+
+ // r.aStart.X() > p.aStart.X() && r.aEnd.X() >= p.aEnd.X()
+ // && r.aStart.Y() > p.aStart.Y() && r.aEnd.Y() < p.aEnd.Y()
+ // or
+ // r.aStart.X() <= p.aStart.X() && r.aEnd.X() < p.aEnd.X()
+ // && r.aStart.Y() > p.aStart.Y() && r.aEnd.Y() < p.aEnd.Y()
+template<typename X, typename Y>
+bool checkForThreeRanges( X rStartX, X rEndX, Y rStartY, Y rEndY,
+ X pStartX, X pEndX, Y pStartY, Y pEndY )
+{
+ if(rStartX > pStartX && rEndX >= pEndX
+ && rStartY > pStartY && rEndY < pEndY )
+ return true;
+ else if( rStartX <= pStartX && rEndX < pEndX
+ && rStartY > pStartY && rEndY < pEndY )
+ return true;
+
+ return false;
+}
+
+bool handleThreeRanges( const ScRange& rDeleteRange, ScRange* p, std::vector<ScRange>& rNewRanges )
+{
+ ScAddress rDelStart = rDeleteRange.aStart;
+ ScAddress rDelEnd = rDeleteRange.aEnd;
+ ScAddress rPStart = p->aStart;
+ ScAddress rPEnd = p->aEnd;
+ SCTAB nTab = rDelStart.Tab();
+ if(checkForThreeRanges(rDelStart.Col(), rDelEnd.Col(), rDelStart.Row(), rDelEnd.Row(),
+ rPStart.Col(), rPEnd.Col(), rPStart.Row(), rPEnd.Row()))
+ {
+ if(rDelStart.Col() > rPStart.Col())
+ {
+ SCCOL nCol1 = rDelStart.Col();
+
+ ScRange aNewRange( nCol1, rPStart.Row(), nTab, rPEnd.Col(), rDelStart.Row()-1, nTab);
+ rNewRanges.push_back(aNewRange);
+
+ aNewRange = ScRange( ScAddress(nCol1, rDelEnd.Row()+1, nTab), rPEnd);
+ rNewRanges.push_back(aNewRange);
+
+ p->aEnd.SetCol(nCol1-1);
+ }
+ else
+ {
+ SCCOL nCol1 = rDelEnd.Col();
+
+ ScRange aNewRange( rPStart, ScAddress( nCol1 - 1, rDelStart.Row() -1, nTab ) );
+ rNewRanges.push_back(aNewRange);
+
+ aNewRange = ScRange( rPStart.Col(), rDelEnd.Row() + 1, nTab, rDelEnd.Col() +1, rPEnd.Row(), nTab );
+ rNewRanges.push_back(aNewRange);
+
+ p->aStart.SetCol(nCol1+1);
+ }
+ return true;
+ }
+ else if(checkForThreeRanges(rDelStart.Row(), rDelEnd.Row(), rDelStart.Col(), rDelEnd.Col(),
+ rPStart.Row(), rPEnd.Row(), rPStart.Col(), rPEnd.Col()))
+ {
+ if(rDelStart.Row() > rPStart.Row())
+ {
+ SCROW nRow1 = rDelStart.Row();
+
+ ScRange aNewRange( rPStart.Col(), nRow1, nTab, rDelStart.Col() -1, rPEnd.Row(), nTab );
+ rNewRanges.push_back( aNewRange );
+
+ aNewRange = ScRange( ScAddress(rDelEnd.Col() +1, nRow1, nTab), rPEnd );
+ rNewRanges.push_back( aNewRange );
+
+ p->aEnd.SetRow(nRow1-1);
+ }
+ else
+ {
+ SCROW nRow1 = rDelEnd.Row();
+
+ ScRange aNewRange( rPStart, ScAddress( rDelStart.Col() -1, nRow1, nTab ) );
+ rNewRanges.push_back(aNewRange);
+
+ aNewRange = ScRange( rDelEnd.Col() +1, rPStart.Col(), nTab, rPEnd.Col(), nRow1, nTab );
+ rNewRanges.push_back( aNewRange );
+
+ p->aStart.SetRow(nRow1+1);
+ }
+ return true;
+ }
+
+ return false;
+}
+
+bool handleFourRanges( const ScRange& rDelRange, ScRange* p, std::vector<ScRange>& rNewRanges )
+{
+ ScAddress rDelStart = rDelRange.aStart;
+ ScAddress rDelEnd = rDelRange.aEnd;
+ ScAddress rPStart = p->aStart;
+ ScAddress rPEnd = p->aEnd;
+ if( rDelRange.aStart.Col() > p->aStart.Col() && rDelRange.aEnd.Col() < p->aEnd.Col()
+ && rDelRange.aStart.Row() > p->aStart.Row() && rDelRange.aEnd.Row() < p->aEnd.Row() )
+ {
+ SCTAB nTab = rDelStart.Tab();
+
+ ScRange aNewRange( ScAddress( rPStart.Col(), rDelEnd.Row(), nTab ), rDelEnd );
+ rNewRanges.push_back( aNewRange );
+
+ aNewRange = ScRange( rPStart.Col(), rDelStart.Row(), nTab, rDelStart.Col() -1, rDelEnd.Row(), nTab );
+ rNewRanges.push_back( aNewRange );
+
+ aNewRange = ScRange( rDelEnd.Col() +1, rDelStart.Row(), nTab, rPEnd.Col(), rDelEnd.Row(), nTab );
+ rNewRanges.push_back( aNewRange );
+
+ rPEnd.SetRow(rDelStart.Row()-1);
+ p->aEnd = rPEnd;
+
+ return true;
+ }
+
+ return false;
+}
+
+}
+
+void ScRangeList::DeleteArea( SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2 )
+{
+ ScRange aRange( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 );
+ iterator itrDel = std::remove_if(maRanges.begin(), maRanges.end(), FindRangeIn<ScRange>(aRange));
+ for_each(itrDel, maRanges.end(), ScDeleteObjectByPtr<ScRange>());
+ maRanges.erase(itrDel, maRanges.end());
+
+ std::vector<ScRange> aNewRanges;
+
+ for(iterator itr = maRanges.begin(); itr != maRanges.end(); ++itr)
+ {
+ // we have two basic cases here:
+ // 1. Delete area and pRange intersect
+ // 2. Delete area and pRange are not intersecting
+ // checking for 2 and if true skip this range
+ if(!(*itr)->Intersects(aRange))
+ continue;
+
+ // We get between 1 and 4 ranges from the difference of the first with the second
+
+ // X either Col or Row and Y then the opposite
+ // r = deleteRange, p = entry from ScRangeList
+
+ // getting exactly one range is the simple case
+ // r.aStart.X() <= p.aStart.X() && r.aEnd.X() >= p.aEnd.X()
+ // && ( r.aStart.Y() <= p.aStart.Y() || r.aEnd.Y() >= r.aEnd.Y() )
+ if(handleOneRange( aRange, *itr ))
+ std::cout << "handled 1 Range case" << std::endl;
+
+ // getting two ranges
+ // r.aStart.X()
+ else if(handleTwoRanges( aRange, *itr, aNewRanges ))
+ std::cout << "handled 2 Ranges " << std::endl;
+
+ // getting 3 ranges
+ // r.aStart.X() > p.aStart.X() && r.aEnd.X() >= p.aEnd.X()
+ // && r.aStart.Y() > p.aStart.Y() && r.aEnd.Y() < p.aEnd.Y()
+ // or
+ // r.aStart.X() <= p.aStart.X() && r.aEnd.X() < p.aEnd.X()
+ // && r.aStart.Y() > p.aStart.Y() && r.aEnd.Y() < p.aEnd.Y()
+ else if(handleThreeRanges( aRange, *itr, aNewRanges ))
+ std::cout << "handled 3 Ranges" << std::endl;
+
+ // getting 4 ranges
+ // r.aStart.X() > p.aStart.X() && r.aEnd().X() < p.aEnd.X()
+ // && r.aStart.Y() > p.aStart.Y() && r.aEnd().Y() < p.aEnd.Y()
+ else if(handleFourRanges( aRange, *itr, aNewRanges ))
+ std::cout << "handle 4 Ranges" << std::endl;
+ }
+ for(vector<ScRange>::iterator itr = aNewRanges.begin(); itr != aNewRanges.end(); ++itr)
+ Join( *itr, false);
+}
+
const ScRange* ScRangeList::Find( const ScAddress& rAdr ) const
{
vector<ScRange*>::const_iterator itr = find_if(
commit b20e04a76ac251f782226dcf71983666d8dbe0dd
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Thu Aug 30 02:05:20 2012 +0200
also handle the cond format code for xlsb the new way, fdo#53424
Change-Id: I8d54e5fee29952635c3d4c2d5a12203668e2ff28
diff --git a/sc/source/filter/oox/condformatbuffer.cxx b/sc/source/filter/oox/condformatbuffer.cxx
index 702dffb..105dc06 100644
--- a/sc/source/filter/oox/condformatbuffer.cxx
+++ b/sc/source/filter/oox/condformatbuffer.cxx
@@ -880,6 +880,7 @@ void CondFormat::importCondFormatting( SequenceInputStream& rStrm )
rStrm.skip( 8 );
rStrm >> aRanges;
getAddressConverter().convertToCellRangeList( maModel.maRanges, aRanges, getSheetIndex(), true );
+ mpFormat = new ScConditionalFormat(0, &getScDocument());
}
void CondFormat::importCfRule( SequenceInputStream& rStrm )
More information about the Libreoffice-commits
mailing list