285 lines
6.0 KiB
C++
285 lines
6.0 KiB
C++
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include "precompiled_sd.hxx"
|
|
|
|
#include "model/SlideSorterModel.hxx"
|
|
#include "model/SlsPageDescriptor.hxx"
|
|
|
|
using namespace ::sd::slidesorter;
|
|
using namespace ::sd::slidesorter::model;
|
|
|
|
namespace {
|
|
|
|
class PageEnumerationImpl
|
|
: public Enumeration<SharedPageDescriptor>
|
|
{
|
|
public:
|
|
inline PageEnumerationImpl (
|
|
const SlideSorterModel& rModel,
|
|
const PageEnumeration::PagePredicate& rPredicate);
|
|
virtual ~PageEnumerationImpl (void);
|
|
/** Create a copy of the called enumeration object.
|
|
*/
|
|
virtual inline ::std::auto_ptr<Enumeration<SharedPageDescriptor> > Clone (void);
|
|
|
|
virtual inline bool HasMoreElements (void) const;
|
|
virtual inline SharedPageDescriptor GetNextElement (void);
|
|
virtual inline void Rewind (void);
|
|
|
|
private:
|
|
const SlideSorterModel& mrModel;
|
|
const PageEnumeration::PagePredicate maPredicate;
|
|
int mnIndex;
|
|
|
|
/** This constructor sets the internal page index to the given value.
|
|
It does not call AdvanceToNextValidElement() to skip elements that
|
|
do not fullfill Predicate.
|
|
*/
|
|
inline PageEnumerationImpl (
|
|
const SlideSorterModel& rModel,
|
|
const PageEnumeration::PagePredicate& rPredicate,
|
|
int nIndex);
|
|
|
|
/** Skip all elements that do not fullfill Predicate starting with the
|
|
one pointed to by mnIndex.
|
|
*/
|
|
inline void AdvanceToNextValidElement (void);
|
|
|
|
// Default constructor not implemented.
|
|
PageEnumerationImpl (void);
|
|
// Assignment operator not implemented.
|
|
PageEnumerationImpl& operator= (const PageEnumerationImpl&);
|
|
};
|
|
|
|
} // end of anonymouse namespace
|
|
|
|
|
|
|
|
|
|
namespace sd { namespace slidesorter { namespace model {
|
|
|
|
|
|
PageEnumeration PageEnumeration::Create (
|
|
const SlideSorterModel& rModel,
|
|
const PagePredicate& rPredicate)
|
|
{
|
|
return PageEnumeration(::std::auto_ptr<Enumeration<SharedPageDescriptor> >(
|
|
new PageEnumerationImpl(rModel, rPredicate)));
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumeration::PageEnumeration (
|
|
::std::auto_ptr<Enumeration<SharedPageDescriptor> > pImpl)
|
|
: mpImpl(pImpl)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumeration::PageEnumeration (
|
|
PageEnumeration& rEnumeration,
|
|
bool bCloneImpl)
|
|
{
|
|
|
|
if( bCloneImpl )
|
|
{
|
|
mpImpl = rEnumeration.mpImpl->Clone();
|
|
}
|
|
else
|
|
{
|
|
mpImpl = rEnumeration.mpImpl;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumeration::PageEnumeration (const PageEnumeration& rEnumeration )
|
|
: sd::slidesorter::model::Enumeration<sd::slidesorter::model::SharedPageDescriptor>()
|
|
{
|
|
mpImpl = rEnumeration.mpImpl->Clone();
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumeration::~PageEnumeration (void)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumeration& PageEnumeration::operator= (
|
|
const PageEnumeration& rEnumeration)
|
|
{
|
|
mpImpl = rEnumeration.mpImpl->Clone();
|
|
return *this;
|
|
}
|
|
|
|
|
|
|
|
|
|
::std::auto_ptr<Enumeration<SharedPageDescriptor> > PageEnumeration::Clone (void)
|
|
{
|
|
return ::std::auto_ptr<Enumeration<SharedPageDescriptor> >(
|
|
new PageEnumeration (*this, true));
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PageEnumeration::HasMoreElements (void) const
|
|
{
|
|
return mpImpl->HasMoreElements();
|
|
}
|
|
|
|
|
|
|
|
SharedPageDescriptor PageEnumeration::GetNextElement (void)
|
|
{
|
|
return mpImpl->GetNextElement();
|
|
}
|
|
|
|
|
|
|
|
|
|
void PageEnumeration::Rewind (void)
|
|
{
|
|
return mpImpl->Rewind();
|
|
}
|
|
|
|
} } } // end of namespace ::sd::slidesorter::model
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
PageEnumerationImpl::PageEnumerationImpl (
|
|
const SlideSorterModel& rModel,
|
|
const PageEnumeration::PagePredicate& rPredicate)
|
|
: mrModel(rModel),
|
|
maPredicate(rPredicate),
|
|
mnIndex(0)
|
|
{
|
|
Rewind();
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumerationImpl::PageEnumerationImpl (
|
|
const SlideSorterModel& rModel,
|
|
const PageEnumeration::PagePredicate& rPredicate,
|
|
int nIndex)
|
|
: mrModel(rModel),
|
|
maPredicate(rPredicate),
|
|
mnIndex(nIndex)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
PageEnumerationImpl::~PageEnumerationImpl (void)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
::std::auto_ptr<Enumeration<SharedPageDescriptor> >
|
|
PageEnumerationImpl::Clone (void)
|
|
{
|
|
return ::std::auto_ptr<Enumeration<SharedPageDescriptor> >(
|
|
new PageEnumerationImpl(mrModel,maPredicate,mnIndex));
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PageEnumerationImpl::HasMoreElements (void) const
|
|
{
|
|
return (mnIndex < mrModel.GetPageCount());
|
|
}
|
|
|
|
|
|
|
|
|
|
SharedPageDescriptor PageEnumerationImpl::GetNextElement (void)
|
|
{
|
|
SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex));
|
|
|
|
// Go to the following valid element.
|
|
mnIndex += 1;
|
|
AdvanceToNextValidElement();
|
|
|
|
return pDescriptor;
|
|
}
|
|
|
|
|
|
|
|
|
|
void PageEnumerationImpl::Rewind (void)
|
|
{
|
|
// Go to first valid element.
|
|
mnIndex = 0;
|
|
AdvanceToNextValidElement();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void PageEnumerationImpl::AdvanceToNextValidElement (void)
|
|
{
|
|
while (mnIndex < mrModel.GetPageCount())
|
|
{
|
|
SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex));
|
|
|
|
// Test for the predicate being fullfilled.
|
|
if (pDescriptor.get()!=NULL && maPredicate(pDescriptor))
|
|
{
|
|
// This predicate is valid.
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// Advance to next predicate.
|
|
mnIndex += 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // end of anonymous namespace
|
|
|