[Libreoffice-commits] .: 3 commits - basctl/source tools/inc tools/source
Ivan Timofeev
ivantimofeev at kemper.freedesktop.org
Sat Oct 8 11:26:25 PDT 2011
basctl/source/basicide/basicrenderable.cxx | 30 +++++---
tools/inc/tools/multisel.hxx | 3
tools/source/memtools/multisel.cxx | 99 ++++++++++++++---------------
3 files changed, 71 insertions(+), 61 deletions(-)
New commits:
commit e0ffea7232fe4bd52424b321562baa809686fb09
Author: Ivan Timofeev <timofeev.i.s at gmail.com>
Date: Sat Oct 8 22:25:09 2011 +0400
migrate to StringRangeEnumerator in Basic
diff --git a/basctl/source/basicide/basicrenderable.cxx b/basctl/source/basicide/basicrenderable.cxx
index 1671238..b3e787d 100644
--- a/basctl/source/basicide/basicrenderable.cxx
+++ b/basctl/source/basicide/basicrenderable.cxx
@@ -121,10 +121,13 @@ sal_Int32 SAL_CALL BasicRenderable::getRendererCount (
if( nContent == 1 )
{
rtl::OUString aPageRange( getStringValue( "PageRange" ) );
- MultiSelection aSel( aPageRange );
- long nSelCount = aSel.GetSelectCount();
- if( nSelCount >= 0 && nSelCount < nCount )
- nCount = nSelCount;
+ if( aPageRange.getLength() )
+ {
+ StringRangeEnumerator aRangeEnum( aPageRange, 0, nCount-1 );
+ sal_Int32 nSelCount = aRangeEnum.size();
+ if( nSelCount >= 0 )
+ nCount = nSelCount;
+ }
}
}
else
@@ -177,12 +180,19 @@ void SAL_CALL BasicRenderable::render (
if( nContent == 1 )
{
rtl::OUString aPageRange( getStringValue( "PageRange" ) );
- MultiSelection aSel( aPageRange );
- long nSelect = aSel.FirstSelected();
- while( nSelect != long(SFX_ENDOFSELECTION) && nRenderer-- )
- nSelect = aSel.NextSelected();
- if( nSelect != long(SFX_ENDOFSELECTION) )
- mpWindow->printPage( sal_Int32(nSelect-1), pPrinter );
+ if( aPageRange.getLength() )
+ {
+ sal_Int32 nPageCount = mpWindow->countPages( pPrinter );
+ StringRangeEnumerator aRangeEnum( aPageRange, 0, nPageCount-1 );
+ StringRangeEnumerator::Iterator it = aRangeEnum.begin();
+ for( ; it != aRangeEnum.end() && nRenderer; --nRenderer )
+ ++it;
+
+ sal_Int32 nPage = ( it != aRangeEnum.end() ) ? *it : nRenderer;
+ mpWindow->printPage( nPage, pPrinter );
+ }
+ else
+ mpWindow->printPage( nRenderer, pPrinter );
}
else
mpWindow->printPage( nRenderer, pPrinter );
commit 9cbc1c3253f1c7ac7507ec89ed879d157c809bb6
Author: Ivan Timofeev <timofeev.i.s at gmail.com>
Date: Sat Oct 8 22:24:21 2011 +0400
no need to return size_t instead of sal_Int32
diff --git a/tools/inc/tools/multisel.hxx b/tools/inc/tools/multisel.hxx
index 733682f..6d3c3de 100644
--- a/tools/inc/tools/multisel.hxx
+++ b/tools/inc/tools/multisel.hxx
@@ -162,7 +162,7 @@ public:
sal_Int32 i_nLogicalOffset = -1
);
- size_t size() const { return size_t(mnCount); }
+ sal_Int32 size() const { return mnCount; }
Iterator begin( const std::set< sal_Int32 >* i_pPossibleValues = NULL ) const;
Iterator end( const std::set< sal_Int32 >* i_pPossibleValues = NULL ) const;
diff --git a/tools/source/memtools/multisel.cxx b/tools/source/memtools/multisel.cxx
index 395082e..bf504e5 100644
--- a/tools/source/memtools/multisel.cxx
+++ b/tools/source/memtools/multisel.cxx
@@ -1168,7 +1168,7 @@ bool StringRangeEnumerator::getRangesFromString( const OUString& i_rPageRange,
//Even if the input range wasn't completely valid, return what ranges could
//be extracted from the input.
- o_rPageVector.reserve( aEnum.size() );
+ o_rPageVector.reserve( static_cast< size_t >( aEnum.size() ) );
for( StringRangeEnumerator::Iterator it = aEnum.begin( i_pPossibleValues );
it != aEnum.end( i_pPossibleValues ); ++it )
{
commit 6dcfa9d2aefc161ce61ea9b007d8997be3f31af9
Author: Ivan Timofeev <timofeev.i.s at gmail.com>
Date: Sat Oct 8 22:20:42 2011 +0400
allow parsing of joined ranges
i.e. "1-4-2" means "1,2,3,4,3,2" now. This is for eliminating ambiguity,
it is doubtful whether users will find this useful.
diff --git a/tools/inc/tools/multisel.hxx b/tools/inc/tools/multisel.hxx
index bb74783..733682f 100644
--- a/tools/inc/tools/multisel.hxx
+++ b/tools/inc/tools/multisel.hxx
@@ -127,6 +127,7 @@ class TOOLS_DLLPUBLIC StringRangeEnumerator
sal_Int32 mnOffset;
bool insertRange( sal_Int32 nFirst, sal_Int32 nLast, bool bSequence, bool bMayAdjust );
+ bool insertJoinedRanges( const std::vector< sal_Int32 >& rNumbers, bool i_bStrict );
bool checkValue( sal_Int32, const std::set< sal_Int32 >* i_pPossibleValues = NULL ) const;
public:
class TOOLS_DLLPUBLIC Iterator
diff --git a/tools/source/memtools/multisel.cxx b/tools/source/memtools/multisel.cxx
index 9984b3a..395082e 100644
--- a/tools/source/memtools/multisel.cxx
+++ b/tools/source/memtools/multisel.cxx
@@ -972,6 +972,33 @@ bool StringRangeEnumerator::insertRange( sal_Int32 i_nFirst, sal_Int32 i_nLast,
return bSuccess;
}
+bool StringRangeEnumerator::insertJoinedRanges(
+ const std::vector< sal_Int32 >& rNumbers, bool i_bStrict )
+{
+ size_t nCount = rNumbers.size();
+ if( nCount == 0 )
+ return true;
+
+ if( nCount == 1 )
+ return insertRange( rNumbers[0], -1, false, ! i_bStrict );
+
+ for( size_t i = 0; i < nCount - 1; i++ )
+ {
+ sal_Int32 nFirst = rNumbers[i];
+ sal_Int32 nLast = rNumbers[i + 1];
+ if( i > 0 )
+ {
+ if ( nFirst > nLast ) nFirst--;
+ else if( nFirst < nLast ) nFirst++;
+ }
+
+ if ( ! insertRange( nFirst, nLast, nFirst != nLast, ! i_bStrict ) && i_bStrict)
+ return false;
+ }
+
+ return true;
+}
+
bool StringRangeEnumerator::setRange( const rtl::OUString& i_rNewRange, bool i_bStrict )
{
mnCount = 0;
@@ -989,75 +1016,47 @@ bool StringRangeEnumerator::setRange( const rtl::OUString& i_rNewRange, bool i_b
const sal_Unicode* pInput = i_rNewRange.getStr();
rtl::OUStringBuffer aNumberBuf( 16 );
- sal_Int32 nLastNumber = -1, nNumber = -1;
+ std::vector< sal_Int32 > aNumbers;
bool bSequence = false;
- bool bSuccess = true;
while( *pInput )
{
while( *pInput >= sal_Unicode('0') && *pInput <= sal_Unicode('9') )
aNumberBuf.append( *pInput++ );
if( aNumberBuf.getLength() )
{
- if( nNumber != -1 )
- {
- if( bSequence )
- {
- if( ! insertRange( nLastNumber, nNumber, true, ! i_bStrict ) && i_bStrict )
- {
- bSuccess = false;
- break;
- }
- nLastNumber = -1;
- bSequence = false;
- }
- else
- {
- if( ! insertRange( nNumber, nNumber, false, ! i_bStrict ) && i_bStrict )
- {
- bSuccess = false;
- break;
- }
- }
- }
- nNumber = aNumberBuf.makeStringAndClear().toInt32();
- nNumber += mnOffset;
+ if( bSequence && aNumbers.empty() )
+ aNumbers.push_back( mnMin );
+
+ sal_Int32 nNumber = aNumberBuf.makeStringAndClear().toInt32() + mnOffset;
+ aNumbers.push_back( nNumber );
+ bSequence = false;
}
- bool bInsertRange = false;
+
if( *pInput == sal_Unicode('-') )
- {
- nLastNumber = nNumber;
- nNumber = -1;
bSequence = true;
- }
- else if( *pInput == ' ' )
- {
- }
else if( *pInput == sal_Unicode(',') || *pInput == sal_Unicode(';') )
- bInsertRange = true;
- else if( *pInput )
{
+ if( bSequence && !aNumbers.empty() )
+ aNumbers.push_back( mnMax );
+ if( ! insertJoinedRanges( aNumbers, i_bStrict ) && i_bStrict )
+ return false;
- bSuccess = false;
- break; // parse error
- }
-
- if( bInsertRange )
- {
- if( ! insertRange( nLastNumber, nNumber, bSequence, ! i_bStrict ) && i_bStrict )
- {
- bSuccess = false;
- break;
- }
- nNumber = nLastNumber = -1;
+ aNumbers.clear();
bSequence = false;
}
+ else if( *pInput && *pInput != sal_Unicode(' ') )
+ return false; // parse error
+
if( *pInput )
pInput++;
}
// insert last entries
- insertRange( nLastNumber, nNumber, bSequence, ! i_bStrict );
+ if( bSequence && !aNumbers.empty() )
+ aNumbers.push_back( mnMax );
+ if( ! insertJoinedRanges( aNumbers, i_bStrict ) && i_bStrict )
+ return false;
- return bSuccess;
+ return true;
}
bool StringRangeEnumerator::hasValue( sal_Int32 i_nValue, const std::set< sal_Int32 >* i_pPossibleValues ) const
More information about the Libreoffice-commits
mailing list