[Libreoffice-commits] .: 2 commits - writerfilter/source
Cédric Bosdonnat
cbosdo at kemper.freedesktop.org
Mon Mar 5 08:28:29 PST 2012
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 106 +++++++++-------------
writerfilter/source/dmapper/DomainMapper_Impl.hxx | 18 ++-
2 files changed, 58 insertions(+), 66 deletions(-)
New commits:
commit d4fd86e3a48defbff29bfbabfbf0d2c5d95d39f5
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date: Mon Mar 5 17:25:41 2012 +0100
n#693238, n#747471: create TableManager for inside shapes
When a texbox is contained inside a table cell... we were running into
some troubles when creating the table: the reference to the paragraphs
inside the textbox were passed to the TableManager. This was leading to
missing references when converting to a table because the paragraph
references within the textbox were dropped.
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 9047784..066416e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1524,6 +1524,9 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
{
xProps->setPropertyValue( rPropNameSupplier.GetName( PROP_ANCHOR_TYPE ), bIsGraphic ? uno::makeAny( text::TextContentAnchorType_AS_CHARACTER ) : uno::makeAny( text::TextContentAnchorType_AT_PARAGRAPH ) );
}
+
+ appendTableManager( );
+ getTableManager().startLevel();
}
catch ( const uno::Exception& e )
{
@@ -1537,6 +1540,9 @@ void DomainMapper_Impl::PopShapeContext()
{
if ( m_aAnchoredStack.size() > 0 )
{
+ getTableManager().endLevel();
+ popTableManager();
+
// For OLE object replacement shape, the text append context was already removed
// or the OLE object couldn't be inserted.
if ( !m_aAnchoredStack.top().bToRemove )
commit 4a0e2d6dc8ba3208f38e3a814ed806384a86ee9a
Author: Cédric Bosdonnat <cedric.bosdonnat.ooo at free.fr>
Date: Mon Mar 5 10:50:27 2012 +0100
n#747471, n#693238: Textboxes import is a mess with OLE objects inside
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 8e5b9ea..9047784 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -191,8 +191,6 @@ DomainMapper_Impl::DomainMapper_Impl(
m_bIsFirstSection( true ),
m_bIsColumnBreakDeferred( false ),
m_bIsPageBreakDeferred( false ),
- m_bIsInShape( false ),
- m_bShapeContextAdded( false ),
m_pLastSectionContext( ),
m_nCurrentTabStopIndex( 0 ),
m_sCurrentParaStyleId(),
@@ -584,37 +582,6 @@ void DomainMapper_Impl::clearDeferredBreaks()
m_bIsPageBreakDeferred = false;
}
-bool lcl_removeShape( const uno::Reference< text::XTextDocument >& rDoc, const uno::Reference< drawing::XShape >& rShape, TextContentStack& rAnchoredStack,TextAppendStack& rTextAppendStack )
-{
- bool bRet = false;
- // probably unecessary but just double check that indeed the top of Anchored stack
- // does contain the shape we intend to remove
- uno::Reference< drawing::XShape > xAnchorShape(rAnchoredStack.top( ), uno::UNO_QUERY );
- if ( xAnchorShape == rShape )
- {
- // because we only want to process the embedded object and not the associated
- // shape we need to get rid of that shape from the Draw page and Anchored and
- // Append stacks so it wont be processed further
- try
- {
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(rDoc, uno::UNO_QUERY_THROW);
- uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
- if ( xDrawPage.is() )
- {
- xDrawPage->remove( rShape );
- }
- rAnchoredStack.pop();
- rTextAppendStack.pop();
- bRet = true;
- }
- catch( uno::Exception& )
- {
- }
- }
- return bRet;
-}
-
-
void lcl_MoveBorderPropertiesToFrame(uno::Sequence<beans::PropertyValue>& rFrameProperties,
uno::Reference<text::XTextRange> xStartTextRange,
@@ -1049,21 +1016,6 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr pPropertyMap )
xTextAppend->finishParagraph( aProperties );
getTableManager( ).handle(xTextRange);
- // Set the anchor of the objects to the created paragraph
- while ( m_aAnchoredStack.size( ) > 0 && !m_bIsInShape )
- {
- uno::Reference< text::XTextContent > xObj = m_aAnchoredStack.top( );
- try
- {
- xObj->attach( xTextRange );
- }
- catch ( uno::RuntimeException& )
- {
- // this is normal: the shape is already attached
- }
- m_aAnchoredStack.pop( );
- }
-
// Get the end of paragraph character inserted
uno::Reference< text::XTextCursor > xCur = xTextRange->getText( )->createTextCursor( );
xCur->gotoEnd( false );
@@ -1202,11 +1154,9 @@ void DomainMapper_Impl::appendOLE( const ::rtl::OUString& rStreamName, OLEHandle
// gives a better ( visually ) result
xOLEProperties->setPropertyValue(PropertyNameSupplier::GetPropertyNameSupplier().GetName( PROP_ANCHOR_TYPE ), uno::makeAny( text::TextContentAnchorType_AS_CHARACTER ) );
// remove ( if valid ) associated shape ( used for graphic replacement )
- if ( m_bShapeContextAdded )
- {
- if ( lcl_removeShape( m_xTextDocument, pOLEHandler->getShape(), m_aAnchoredStack, m_aTextAppendStack ) )
- m_bShapeContextAdded = false; // ensure PopShapeContext processing doesn't pop the append stack
- }
+ m_aAnchoredStack.top( ).bToRemove = true;
+ RemoveLastParagraph();
+ m_aTextAppendStack.pop();
//
appendTextContent( xOLE, uno::Sequence< beans::PropertyValue >() );
@@ -1543,12 +1493,10 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
if (m_aTextAppendStack.empty())
return;
uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
- m_bIsInShape = true;
try
{
// Add the shape to the text append stack
m_aTextAppendStack.push( uno::Reference< text::XTextAppend >( xShape, uno::UNO_QUERY_THROW ) );
- m_bShapeContextAdded = true;
// Add the shape to the anchored objects stack
uno::Reference< text::XTextContent > xTxtContent( xShape, uno::UNO_QUERY_THROW );
@@ -1587,13 +1535,45 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
void DomainMapper_Impl::PopShapeContext()
{
- if ( m_bShapeContextAdded )
+ if ( m_aAnchoredStack.size() > 0 )
{
- RemoveLastParagraph();
- m_aTextAppendStack.pop();
- m_bShapeContextAdded = false;
+ // For OLE object replacement shape, the text append context was already removed
+ // or the OLE object couldn't be inserted.
+ if ( !m_aAnchoredStack.top().bToRemove )
+ {
+ RemoveLastParagraph();
+ m_aTextAppendStack.pop();
+ }
+
+ uno::Reference< text::XTextContent > xObj = m_aAnchoredStack.top( ).xTextContent;
+ try
+ {
+ appendTextContent( xObj, uno::Sequence< beans::PropertyValue >() );
+ }
+ catch ( uno::RuntimeException& )
+ {
+ // this is normal: the shape is already attached
+ }
+
+ // Remove the shape if required (most likely replacement shape for OLE object)
+ if ( m_aAnchoredStack.top().bToRemove )
+ {
+ try
+ {
+ uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(m_xTextDocument, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
+ if ( xDrawPage.is() )
+ {
+ uno::Reference<drawing::XShape> xShape( xObj, uno::UNO_QUERY_THROW );
+ xDrawPage->remove( xShape );
+ }
+ }
+ catch( uno::Exception& )
+ {
+ }
+ }
+ m_aAnchoredStack.pop();
}
- m_bIsInShape = false;
}
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 924c8dd..333ba25 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -183,13 +183,22 @@ struct TextAppendContext
xTextAppend( xAppend ){}
};
+struct AnchoredContext
+{
+ ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > xTextContent;
+ bool bToRemove;
+
+ AnchoredContext( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >& xContent ) :
+ xTextContent( xContent ), bToRemove( false ) {}
+};
+
typedef boost::shared_ptr<FieldContext> FieldContextPtr;
typedef std::stack<ContextType> ContextStack;
typedef std::stack<PropertyMapPtr> PropertyStack;
typedef std::stack< TextAppendContext > TextAppendStack;
typedef std::stack<FieldContextPtr> FieldStack;
-typedef std::stack< com::sun::star::uno::Reference< com::sun::star::text::XTextContent > > TextContentStack;
+typedef std::stack< AnchoredContext > TextContentStack;
@@ -285,8 +294,7 @@ private:
TextAppendStack m_aTextAppendStack;
- TextContentStack
- m_aAnchoredStack;
+ TextContentStack m_aAnchoredStack;
FieldStack m_aFieldStack;
bool m_bFieldMode;
@@ -294,8 +302,6 @@ private:
bool m_bIsFirstSection;
bool m_bIsColumnBreakDeferred;
bool m_bIsPageBreakDeferred;
- bool m_bIsInShape;
- bool m_bShapeContextAdded;
LineNumberSettings m_aLineNumberSettings;
@@ -474,7 +480,7 @@ public:
bool IsStyleSheetImport()const { return m_bInStyleSheetImport;}
void SetAnyTableImport( bool bSet ) { m_bInAnyTableImport = bSet;}
bool IsAnyTableImport()const { return m_bInAnyTableImport;}
- bool IsInShape()const { return m_bIsInShape;}
+ bool IsInShape()const { return m_aAnchoredStack.size() > 0;}
void PushShapeContext( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
void PopShapeContext();
More information about the Libreoffice-commits
mailing list