summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Dhall <varun.dhall@studentpartner.com>2017-06-22 11:24:10 +0530
committerMichael Stahl <mstahl@redhat.com>2017-06-30 19:39:16 +0200
commit3c1fc723ff622d8a541fa26a3397ca4258332e4a (patch)
tree2f7d5b66c2dcad5db9910f7b683ac9509bf227aa
parenta429d4317d2d4f9d6a1a39d996ee9fa41096d741 (diff)
EditEngine: Changing export selection for copy/paste
Change-Id: I6f52f30eff76de5f0d641271ce3ea36ced572cc4 Reviewed-on: https://gerrit.libreoffice.org/39083 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com>
-rw-r--r--editeng/source/uno/unotext.cxx19
-rw-r--r--editeng/source/uno/unotext2.cxx149
-rw-r--r--include/editeng/unotext.hxx45
3 files changed, 118 insertions, 95 deletions
diff --git a/editeng/source/uno/unotext.cxx b/editeng/source/uno/unotext.cxx
index 058e56ad7d9f..dcfdd72eace9 100644
--- a/editeng/source/uno/unotext.cxx
+++ b/editeng/source/uno/unotext.cxx
@@ -1955,13 +1955,18 @@ void SAL_CALL SvxUnoTextBase::setString( const OUString& aString )
uno::Reference< container::XEnumeration > SAL_CALL SvxUnoTextBase::createEnumeration()
{
SolarMutexGuard aGuard;
-
- ESelection aSelection;
- ::GetSelection( aSelection, GetEditSource()->GetTextForwarder() );
- SetSelection( aSelection );
-
- uno::Reference< container::XEnumeration > xEnum( static_cast<container::XEnumeration*>(new SvxUnoTextContentEnumeration( *this )) );
- return xEnum;
+ if( maSelection.IsEqual(ESelection(0,0,0,0)) || maSelection.IsEqual(ESelection(EE_PARA_MAX_COUNT,0,0,0)) )
+ {
+ ESelection aSelection;
+ ::GetSelection( aSelection, GetEditSource()->GetTextForwarder() );
+ uno::Reference< container::XEnumeration > xEnum( static_cast<container::XEnumeration*>( new SvxUnoTextContentEnumeration( *this, aSelection ) ) );
+ return xEnum;
+ }
+ else
+ {
+ uno::Reference< container::XEnumeration > xEnum( static_cast<container::XEnumeration*>( new SvxUnoTextContentEnumeration( *this, maSelection ) ) );
+ return xEnum;
+ }
}
// XElementAccess ( container::XEnumerationAccess )
diff --git a/editeng/source/uno/unotext2.cxx b/editeng/source/uno/unotext2.cxx
index 5f012775bfde..6f16b855e751 100644
--- a/editeng/source/uno/unotext2.cxx
+++ b/editeng/source/uno/unotext2.cxx
@@ -39,13 +39,48 @@ using namespace ::com::sun::star;
// SvxUnoTextContentEnumeration
-SvxUnoTextContentEnumeration::SvxUnoTextContentEnumeration( const SvxUnoTextBase& _rText ) throw()
-: mrText( _rText )
+SvxUnoTextContentEnumeration::SvxUnoTextContentEnumeration( const SvxUnoTextBase& _rText, const ESelection& rSel ) throw()
+: mrText( _rText ),
+ maSelection( rSel )
{
mxParentText = const_cast<SvxUnoTextBase*>(&_rText);
if( mrText.GetEditSource() )
mpEditSource.reset( mrText.GetEditSource()->Clone() );
mnNextParagraph = 0;
+ for( sal_Int32 currentPara = 0; currentPara < mrText.GetEditSource()->GetTextForwarder()->GetParagraphCount(); currentPara++ )
+ {
+ if( currentPara>=maSelection.nStartPara && currentPara<=maSelection.nEndPara )
+ {
+ const SvxUnoTextRangeBaseList& rRanges( mpEditSource->getRanges() );
+ SvxUnoTextContent* pContent = nullptr;
+ sal_Int32 nStartPos = 0;
+ sal_Int32 nEndPos = mrText.GetEditSource()->GetTextForwarder()->GetTextLen( currentPara );
+ if( currentPara == maSelection.nStartPara )
+ nStartPos = nStartPos>maSelection.nStartPos ? nStartPos : maSelection.nStartPos;
+ if( currentPara == maSelection.nEndPara )
+ nEndPos = nEndPos<maSelection.nEndPos ? nEndPos : maSelection.nEndPos;
+ ESelection aCurrentParaSel = ESelection( currentPara, nStartPos, currentPara, nEndPos );
+ for( auto aIter = rRanges.begin(); (aIter != rRanges.end()) && (pContent == nullptr); ++aIter )
+ {
+ SvxUnoTextContent* pIterContent = dynamic_cast< SvxUnoTextContent* >( ( *aIter ) );
+ if( pIterContent && (pIterContent->mnParagraph == currentPara) )
+ {
+ ESelection aIterSel = pIterContent->GetSelection();
+ if( aIterSel.IsEqual( aCurrentParaSel ) )
+ {
+ pContent = pIterContent;
+ maContents.push_back( pContent );
+ }
+ }
+ }
+ if( pContent == nullptr )
+ {
+ pContent = new SvxUnoTextContent( mrText, currentPara );
+ pContent->SetSelection( aCurrentParaSel );
+ maContents.push_back( pContent );
+ }
+ }
+ }
}
SvxUnoTextContentEnumeration::~SvxUnoTextContentEnumeration() throw()
@@ -56,8 +91,8 @@ SvxUnoTextContentEnumeration::~SvxUnoTextContentEnumeration() throw()
sal_Bool SAL_CALL SvxUnoTextContentEnumeration::hasMoreElements()
{
SolarMutexGuard aGuard;
- if( mpEditSource && mpEditSource->GetTextForwarder() )
- return mnNextParagraph < mpEditSource->GetTextForwarder()->GetParagraphCount();
+ if( mpEditSource && !maContents.empty() )
+ return (unsigned)mnNextParagraph < maContents.size();
else
return false;
}
@@ -69,23 +104,8 @@ uno::Any SvxUnoTextContentEnumeration::nextElement()
if(!hasMoreElements())
throw container::NoSuchElementException();
- SvxUnoTextContent* pContent = nullptr;
-
- const SvxUnoTextRangeBaseList& rRanges( mpEditSource->getRanges() );
- SvxUnoTextRangeBaseList::const_iterator aIter;
- for( aIter = rRanges.begin(); (aIter != rRanges.end()) && (pContent == nullptr); ++aIter )
- {
- SvxUnoTextContent* pIterContent = dynamic_cast< SvxUnoTextContent* >( (*aIter ) );
- if( pIterContent && (pIterContent->mnParagraph == mnNextParagraph) )
- pContent = pIterContent;
- }
-
- if( pContent == nullptr )
- pContent = new SvxUnoTextContent( mrText, mnNextParagraph );
-
+ uno::Reference< text::XTextContent > xRef( maContents.at(mnNextParagraph).get() );
mnNextParagraph++;
-
- uno::Reference< text::XTextContent > xRef( pContent );
return uno::makeAny( xRef );
}
@@ -101,8 +121,6 @@ SvxUnoTextContent::SvxUnoTextContent( const SvxUnoTextBase& rText, sal_Int32 nPa
, mbDisposing( false )
{
mxParentText = const_cast<SvxUnoTextBase*>(&rText);
- if( GetEditSource() && GetEditSource()->GetTextForwarder() )
- SetSelection( ESelection( mnParagraph,0, mnParagraph, GetEditSource()->GetTextForwarder()->GetTextLen( mnParagraph ) ) );
}
SvxUnoTextContent::SvxUnoTextContent( const SvxUnoTextContent& rContent ) throw()
@@ -248,11 +266,11 @@ void SAL_CALL SvxUnoTextContent::removeEventListener( const uno::Reference< lang
// XEnumerationAccess
-uno::Reference< container::XEnumeration > SAL_CALL SvxUnoTextContent::createEnumeration( )
+uno::Reference< container::XEnumeration > SAL_CALL SvxUnoTextContent::createEnumeration()
{
SolarMutexGuard aGuard;
- return new SvxUnoTextRangeEnumeration( mrParentText, mnParagraph );
+ return new SvxUnoTextRangeEnumeration( mrParentText, mnParagraph, maSelection );
}
// XElementAccess ( container::XEnumerationAccess )
@@ -357,29 +375,54 @@ uno::Sequence< OUString > SAL_CALL SvxUnoTextContent::getSupportedServiceNames()
// class SvxUnoTextRangeEnumeration
-SvxUnoTextRangeEnumeration::SvxUnoTextRangeEnumeration( const SvxUnoTextBase& rText, sal_Int32 nPara ) throw()
+SvxUnoTextRangeEnumeration::SvxUnoTextRangeEnumeration( const SvxUnoTextBase& rText, sal_Int32 nPara, const ESelection& rSel ) throw()
: mxParentText( const_cast<SvxUnoTextBase*>(&rText) ),
mrParentText( rText ),
mnParagraph( nPara ),
- mnNextPortion( 0 )
+ mnNextPortion( 0 ),
+ mnSel( rSel )
{
- mpEditSource = rText.GetEditSource() ? rText.GetEditSource()->Clone() : nullptr;
+ mpEditSource.reset( rText.GetEditSource() ? rText.GetEditSource()->Clone() : nullptr );
- if( mpEditSource && mpEditSource->GetTextForwarder() )
+ if( mpEditSource && mpEditSource->GetTextForwarder() && (mnParagraph == mnSel.nStartPara && mnParagraph == mnSel.nEndPara) )
{
- mpPortions = new std::vector<sal_Int32>;
- mpEditSource->GetTextForwarder()->GetPortions( nPara, *mpPortions );
- }
- else
- {
- mpPortions = nullptr;
+ std::vector<sal_Int32> aPortions;
+ mpEditSource->GetTextForwarder()->GetPortions( nPara, aPortions );
+ for( size_t aPortionIndex = 0; aPortionIndex < aPortions.size(); aPortionIndex++ )
+ {
+ sal_uInt16 nStartPos = 0;
+ if ( aPortionIndex > 0 )
+ nStartPos = aPortions.at( aPortionIndex - 1 );
+ if( nStartPos > mnSel.nEndPos )
+ continue;
+ sal_uInt16 nEndPos = aPortions.at( aPortionIndex );
+ if( nEndPos < mnSel.nStartPos )
+ continue;
+
+ nStartPos = nStartPos>mnSel.nStartPos ? nStartPos : mnSel.nStartPos;
+ nEndPos = nEndPos<mnSel.nEndPos ? nEndPos : mnSel.nEndPos;
+ ESelection aSel( mnParagraph, nStartPos, mnParagraph, nEndPos );
+
+ const SvxUnoTextRangeBaseList& rRanges( mpEditSource->getRanges() );
+ SvxUnoTextRange* pRange = nullptr;
+ for( auto aIter = rRanges.begin(); (aIter != rRanges.end()) && (pRange == nullptr); ++aIter )
+ {
+ SvxUnoTextRange* pIterRange = dynamic_cast< SvxUnoTextRange* >( ( *aIter ) );
+ if( pIterRange && pIterRange->mbPortion && ( aSel.IsEqual( pIterRange->maSelection ) ) )
+ pRange = pIterRange;
+ }
+ if( pRange == nullptr )
+ {
+ pRange = new SvxUnoTextRange( mrParentText, true );
+ pRange->SetSelection( aSel );
+ }
+ maPortions.push_back( pRange );
+ }
}
}
SvxUnoTextRangeEnumeration::~SvxUnoTextRangeEnumeration() throw()
{
- delete mpEditSource;
- delete mpPortions;
}
// container::XEnumeration
@@ -388,46 +431,18 @@ sal_Bool SAL_CALL SvxUnoTextRangeEnumeration::hasMoreElements()
{
SolarMutexGuard aGuard;
- return mpPortions && mnNextPortion < mpPortions->size();
+ return !maPortions.empty() && mnNextPortion < maPortions.size();
}
uno::Any SAL_CALL SvxUnoTextRangeEnumeration::nextElement()
{
SolarMutexGuard aGuard;
- if( mpPortions == nullptr || mnNextPortion >= mpPortions->size() )
+ if( maPortions.empty() || mnNextPortion >= maPortions.size() )
throw container::NoSuchElementException();
- sal_uInt16 nStartPos = 0;
- if (mnNextPortion > 0)
- nStartPos = mpPortions->at(mnNextPortion-1);
- sal_uInt16 nEndPos = mpPortions->at(mnNextPortion);
- ESelection aSel( mnParagraph, nStartPos, mnParagraph, nEndPos );
-
- uno::Reference< text::XTextRange > xRange;
-
- const SvxUnoTextRangeBaseList& rRanges( mpEditSource->getRanges() );
-
- SvxUnoTextRange* pRange = nullptr;
-
- SvxUnoTextRangeBaseList::const_iterator aIter;
- for( aIter = rRanges.begin(); (aIter != rRanges.end()) && (pRange == nullptr); ++aIter )
- {
- SvxUnoTextRange* pIterRange = dynamic_cast< SvxUnoTextRange* >( (*aIter ) );
- if( pIterRange && pIterRange->mbPortion && (aSel.IsEqual( pIterRange->maSelection ) ) )
- pRange = pIterRange;
- }
-
- if( pRange == nullptr )
- {
- pRange = new SvxUnoTextRange( mrParentText, true );
- pRange->SetSelection(aSel);
- }
-
- xRange = pRange;
-
+ uno::Reference< text::XTextRange > xRange = ( maPortions.at(mnNextPortion) ).get();
mnNextPortion++;
-
return uno::makeAny( xRange );
}
diff --git a/include/editeng/unotext.hxx b/include/editeng/unotext.hxx
index 70be94f6965d..3cc7932d25b6 100644
--- a/include/editeng/unotext.hxx
+++ b/include/editeng/unotext.hxx
@@ -507,24 +507,6 @@ public:
};
-class SvxUnoTextContentEnumeration : public ::cppu::WeakAggImplHelper1< css::container::XEnumeration >
-{
-private:
- css::uno::Reference< css::text::XText > mxParentText;
- std::unique_ptr<SvxEditSource> mpEditSource;
- sal_Int32 mnNextParagraph;
- const SvxUnoTextBase& mrText;
-
-public:
- SvxUnoTextContentEnumeration( const SvxUnoTextBase& _rText ) throw();
- virtual ~SvxUnoTextContentEnumeration() throw() override;
-
- // css::container::XEnumeration
- virtual sal_Bool SAL_CALL hasMoreElements( ) override;
- virtual css::uno::Any SAL_CALL nextElement( ) override;
-};
-
-
class SvxUnoTextContent : public SvxUnoTextRangeBase,
public css::text::XTextContent,
public css::container::XEnumerationAccess,
@@ -599,18 +581,39 @@ public:
};
+class SvxUnoTextContentEnumeration : public ::cppu::WeakAggImplHelper1< css::container::XEnumeration >
+{
+private:
+ css::uno::Reference< css::text::XText > mxParentText;
+ std::unique_ptr<SvxEditSource> mpEditSource;
+ sal_Int32 mnNextParagraph;
+ const SvxUnoTextBase& mrText;
+ const ESelection maSelection;
+ std::vector< rtl::Reference<SvxUnoTextContent> > maContents;
+
+public:
+ SvxUnoTextContentEnumeration( const SvxUnoTextBase& _rText, const ESelection& rSel ) throw();
+ virtual ~SvxUnoTextContentEnumeration() throw() override;
+
+ // css::container::XEnumeration
+ virtual sal_Bool SAL_CALL hasMoreElements( ) override;
+ virtual css::uno::Any SAL_CALL nextElement( ) override;
+};
+
+
class SvxUnoTextRangeEnumeration : public ::cppu::WeakAggImplHelper1< css::container::XEnumeration >
{
private:
- SvxEditSource* mpEditSource;
+ std::unique_ptr<SvxEditSource> mpEditSource;
css::uno::Reference< css::text::XText > mxParentText;
const SvxUnoTextBase& mrParentText;
sal_Int32 mnParagraph;
- std::vector<sal_Int32>* mpPortions;
+ std::vector< rtl::Reference<SvxUnoTextRange> > maPortions;
sal_uInt16 mnNextPortion;
+ const ESelection mnSel;
public:
- SvxUnoTextRangeEnumeration( const SvxUnoTextBase& rText, sal_Int32 nPara ) throw();
+ SvxUnoTextRangeEnumeration( const SvxUnoTextBase& rText, sal_Int32 nPara, const ESelection& rSel ) throw();
virtual ~SvxUnoTextRangeEnumeration() throw() override;
// css::container::XEnumeration