summaryrefslogtreecommitdiff
path: root/sc/source/ui/docshell/autostyl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/docshell/autostyl.cxx')
-rw-r--r--sc/source/ui/docshell/autostyl.cxx66
1 files changed, 49 insertions, 17 deletions
diff --git a/sc/source/ui/docshell/autostyl.cxx b/sc/source/ui/docshell/autostyl.cxx
index bfb7c8f3c9a1..ef272c90cd57 100644
--- a/sc/source/ui/docshell/autostyl.cxx
+++ b/sc/source/ui/docshell/autostyl.cxx
@@ -64,6 +64,34 @@ inline sal_uLong TimeNow() // Sekunden
return (sal_uLong) time(0);
}
+namespace {
+
+class FindByRange : public ::std::unary_function<ScAutoStyleData, bool>
+{
+ ScRange maRange;
+public:
+ FindByRange(const ScRange& r) : maRange(r) {}
+ bool operator() (const ScAutoStyleData& rData) const { return rData.aRange == maRange; }
+};
+
+class FindByTimeout : public ::std::unary_function<ScAutoStyleData, bool>
+{
+ sal_uLong mnTimeout;
+public:
+ FindByTimeout(sal_uLong n) : mnTimeout(n) {}
+ bool operator() (const ScAutoStyleData& rData) const { return rData.nTimeout >= mnTimeout; }
+};
+
+struct FindNonZeroTimeout : public ::std::unary_function<ScAutoStyleData, bool>
+{
+ bool operator() (const ScAutoStyleData& rData) const
+ {
+ return rData.nTimeout != 0;
+ }
+};
+
+}
+
ScAutoStyleList::ScAutoStyleList(ScDocShell* pShell) :
pDocSh( pShell )
{
@@ -108,8 +136,12 @@ void ScAutoStyleList::AddEntry( sal_uLong nTimeout, const ScRange& rRange, const
aTimer.Stop();
sal_uLong nNow = TimeNow();
- aEntries.erase(std::remove_if(aEntries.begin(),aEntries.end(),
- boost::bind(&ScAutoStyleData::aRange,_1) == rRange));
+ // Remove the first item with the same range.
+ ::boost::ptr_vector<ScAutoStyleData>::iterator itr =
+ ::std::find_if(aEntries.begin(), aEntries.end(), FindByRange(rRange));
+
+ if (itr != aEntries.end())
+ aEntries.erase(itr);
// Timeouts von allen Eintraegen anpassen
@@ -120,8 +152,8 @@ void ScAutoStyleList::AddEntry( sal_uLong nTimeout, const ScRange& rRange, const
}
// Einfuege-Position suchen
- boost::ptr_vector<ScAutoStyleData>::iterator iter = std::find_if(aEntries.begin(),aEntries.end(),
- boost::bind(&ScAutoStyleData::nTimeout,_1) >= nTimeout);
+ boost::ptr_vector<ScAutoStyleData>::iterator iter =
+ ::std::find_if(aEntries.begin(), aEntries.end(), FindByTimeout(nTimeout));
aEntries.insert(iter,new ScAutoStyleData(nTimeout,rRange,rStyle));
@@ -145,19 +177,19 @@ void ScAutoStyleList::AdjustEntries( sal_uLong nDiff ) // Millisekunden
void ScAutoStyleList::ExecuteEntries()
{
- boost::ptr_vector<ScAutoStyleData>::iterator iter;
- for (iter = aEntries.begin(); iter != aEntries.end();)
+ // Execute and remove all items with timeout == 0 from the begin position
+ // until the first item with non-zero timeout value.
+ ::boost::ptr_vector<ScAutoStyleData>::iterator itr = aEntries.begin(), itrEnd = aEntries.end();
+ for (; itr != itrEnd; ++itr)
{
- if (!iter->nTimeout)
- {
- pDocSh->DoAutoStyle(iter->aRange,iter->aStyle);
- iter = aEntries.erase(iter);
- }
- else
- {
- ++iter;
- }
+ if (itr->nTimeout)
+ break;
+
+ pDocSh->DoAutoStyle(itr->aRange, itr->aStyle);
}
+ // At this point itr should be on the first item with non-zero timeout, or
+ // the end position in case all items have timeout == 0.
+ aEntries.erase(aEntries.begin(), itr);
}
void ScAutoStyleList::ExecuteAllNow()
@@ -174,8 +206,8 @@ void ScAutoStyleList::ExecuteAllNow()
void ScAutoStyleList::StartTimer( sal_uLong nNow ) // Sekunden
{
// ersten Eintrag mit Timeout != 0 suchen
- boost::ptr_vector<ScAutoStyleData>::iterator iter = std::find_if(aEntries.begin(),aEntries.end(),
- boost::bind(&ScAutoStyleData::nTimeout,_1) != static_cast<unsigned>(0));
+ boost::ptr_vector<ScAutoStyleData>::iterator iter =
+ ::std::find_if(aEntries.begin(),aEntries.end(), FindNonZeroTimeout());
if (iter != aEntries.end())
{