summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unotext.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/unocore/unotext.cxx')
-rw-r--r--sw/source/core/unocore/unotext.cxx3493
1 files changed, 1875 insertions, 1618 deletions
diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx
index ee1055b276c9..4fb2a861be21 100644
--- a/sw/source/core/unocore/unotext.cxx
+++ b/sw/source/core/unocore/unotext.cxx
@@ -34,12 +34,22 @@
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#include <com/sun/star/text/ControlCharacter.hpp>
+#include <com/sun/star/text/TableColumnSeparator.hpp>
+
+#include <rtl/uuid.h>
-#include <cmdid.h>
#include <vos/mutex.hxx>
#include <vcl/svapp.hxx>
-#include <rtl/uuid.h>
-#include <unoobj.hxx>
+#include <comphelper/sequence.hxx>
+
+#include <cmdid.h>
+#include <unotextbodyhf.hxx>
+#include <unotext.hxx>
+#include <unotextrange.hxx>
+#include <unotextcursor.hxx>
+#include <unosection.hxx>
+#include <unobookmark.hxx>
+#include <unorefmark.hxx>
#include <unoport.hxx>
#include <unotbl.hxx>
#include <unoidx.hxx>
@@ -51,6 +61,7 @@
#include <unomap.hxx>
#include <unoprnms.hxx>
#include <undobj.hxx>
+#include <unoparagraph.hxx>
#include <unocrsrhelper.hxx>
#include <docsh.hxx>
#include <docary.hxx>
@@ -60,37 +71,125 @@
#include <section.hxx>
#include <IMark.hxx>
#include <fmtanchr.hxx>
+#include <fmtcntnt.hxx>
#include <crsskip.hxx>
#include <ndtxt.hxx>
-#include <com/sun/star/text/TableColumnSeparator.hpp>
+
#include <memory>
#include <stdlib.h>
#include <iostream>
+
using namespace ::com::sun::star;
using ::rtl::OUString;
+
const sal_Char cInvalidObject[] = "this object is invalid";
+
/******************************************************************
* SwXText
******************************************************************/
+
+class SwXText::Impl
+{
+
+public:
+ SwXText & m_rThis;
+ SfxItemPropertySet const& m_rPropSet;
+ const enum CursorType m_eType;
+ SwDoc * m_pDoc;
+ bool m_bIsValid;
+
+ Impl( SwXText & rThis,
+ SwDoc *const pDoc, const enum CursorType eType)
+ : m_rThis(rThis)
+ , m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT))
+ , m_eType(eType)
+ , m_pDoc(pDoc)
+ , m_bIsValid(0 != pDoc)
+ {
+ }
+
+ uno::Reference< text::XTextRange >
+ finishOrAppendParagraph(
+ const bool bFinish,
+ const uno::Sequence< beans::PropertyValue >&
+ rCharacterAndParagraphProperties)
+ throw (lang::IllegalArgumentException, uno::RuntimeException);
+
+ sal_Int16 ComparePositions(
+ const uno::Reference<text::XTextRange>& xPos1,
+ const uno::Reference<text::XTextRange>& xPos2)
+ throw (lang::IllegalArgumentException, uno::RuntimeException);
+
+ bool CheckForOwnMember(const SwPaM & rPaM)
+ throw (lang::IllegalArgumentException, uno::RuntimeException);
+
+ void ConvertCell(
+ const bool bFirstCell,
+ const uno::Sequence< uno::Reference< text::XTextRange > > & rCell,
+ ::std::vector<SwNodeRange> & rRowNodes,
+ ::std::auto_ptr< SwPaM > & rpFirstPaM,
+ SwPaM & rLastPaM,
+ bool & rbExcept);
+
+};
+
+/* -----------------------------15.03.2002 12:39------------------------------
+
+ ---------------------------------------------------------------------------*/
+SwXText::SwXText(SwDoc *const pDoc, const enum CursorType eType)
+ : m_pImpl( new SwXText::Impl(*this, pDoc, eType) )
+{
+}
+/*-- 09.12.98 12:43:55---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXText::~SwXText()
+{
+}
+
/*-- 09.12.98 12:44:07---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::PrepareForAttach( ::com::sun::star::uno::Reference<
- ::com::sun::star::text::XTextRange > &,
- const SwXTextRange* const, const SwPaM * const)
+const SwDoc * SwXText::GetDoc() const
{
+ return m_pImpl->m_pDoc;
+}
+ SwDoc * SwXText::GetDoc()
+{
+ return m_pImpl->m_pDoc;
}
-bool SwXText::CheckForOwnMemberMeta(const SwXTextRange* const,
- const SwPaM* const, bool)
- throw (::com::sun::star::lang::IllegalArgumentException,
- ::com::sun::star::uno::RuntimeException)
+bool SwXText::IsValid() const
{
- ASSERT(CURSOR_META != eCrsrType, "should not be called!");
+ return m_pImpl->m_bIsValid;
+}
+
+void SwXText::Invalidate()
+{
+ m_pImpl->m_bIsValid = false;
+}
+
+void SwXText::SetDoc(SwDoc *const pDoc)
+{
+ OSL_ENSURE(!m_pImpl->m_pDoc || !pDoc,
+ "SwXText::SetDoc: already have a doc?");
+ m_pImpl->m_pDoc = pDoc;
+ m_pImpl->m_bIsValid = (0 != pDoc);
+}
+
+void
+SwXText::PrepareForAttach(uno::Reference< text::XTextRange > &, const SwPaM &)
+{
+}
+
+bool SwXText::CheckForOwnMemberMeta(const SwPaM &, const bool)
+ throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+ ASSERT(CURSOR_META != m_pImpl->m_eType, "should not be called!");
return false;
}
@@ -99,7 +198,8 @@ const SwStartNode *SwXText::GetStartNode() const
return GetDoc()->GetNodes().GetEndOfContent().StartOfSectionNode();
}
-uno::Reference< text::XTextCursor > SwXText::createCursor() throw (uno::RuntimeException)
+uno::Reference< text::XTextCursor >
+SwXText::CreateCursor() throw (uno::RuntimeException)
{
uno::Reference< text::XTextCursor > xRet;
if(IsValid())
@@ -107,546 +207,457 @@ uno::Reference< text::XTextCursor > SwXText::createCursor() throw (uno::Runtim
SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
SwPosition aPos(rNode);
xRet = static_cast<text::XWordCursor*>(
- new SwXTextCursor(this, aPos, GetTextType(), GetDoc()));
+ new SwXTextCursor(*GetDoc(), this, m_pImpl->m_eType, aPos));
xRet->gotoStart(sal_False);
}
return xRet;
}
-/* -----------------------------15.03.2002 12:39------------------------------
- ---------------------------------------------------------------------------*/
-SwXText::SwXText(SwDoc* pDc, CursorType eType) :
- pDoc(pDc),
- bObjectValid(0 != pDc),
- eCrsrType(eType),
- m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT))
-{
-}
-/*-- 09.12.98 12:43:55---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-SwXText::~SwXText()
-{
-}
/*-- 09.12.98 12:43:02---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Any SAL_CALL SwXText::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
-{
- const uno::Type& rXTextType = ::getCppuType((uno::Reference< text::XText >*)0);
- const uno::Type& rXTextRangeCompareType = ::getCppuType((uno::Reference< text::XTextRangeCompare >*)0);
- const uno::Type& rXSimpleTextType = ::getCppuType((const uno::Reference< XSimpleText >*)0);
- const uno::Type& rXTextRangeType = ::getCppuType((uno::Reference< text::XTextRange >*)0);
- const uno::Type& rXTypeProviderType = ::getCppuType((uno::Reference< lang::XTypeProvider >*)0);
- const uno::Type& rXTextContentInsert = ::getCppuType((uno::Reference< text::XRelativeTextContentInsert >*)0);
- const uno::Type& rXTextContentRemove = ::getCppuType((uno::Reference< text::XRelativeTextContentRemove >*)0);
- const uno::Type& rXPropertySet = ::getCppuType((uno::Reference<beans::XPropertySet>*)0);
- const uno::Type& rXUnoTunnel = ::getCppuType((uno::Reference< lang::XUnoTunnel >*)0);
- const uno::Type& rXTextPortionAppend = ::getCppuType((uno::Reference< text::XTextPortionAppend >*)0);
- const uno::Type& rXParagraphAppend = ::getCppuType((uno::Reference< text::XParagraphAppend >*)0);
- const uno::Type& rXTextContentAppend = ::getCppuType((uno::Reference< text::XTextContentAppend >*)0);
- const uno::Type& rXTextConvert = ::getCppuType((uno::Reference< text::XTextConvert >*)0);
- const uno::Type& rXTextAppend = ::getCppuType((uno::Reference< text::XTextAppend >*)0);
- const uno::Type& rXTextAppendAndConvert = ::getCppuType((uno::Reference< text::XTextAppendAndConvert >*)0);
-
+uno::Any SAL_CALL
+SwXText::queryInterface(const uno::Type& rType) throw (uno::RuntimeException)
+{
uno::Any aRet;
- if(rType == rXTextType)
+ if (rType == text::XText::static_type())
{
- uno::Reference< text::XText > xRet = this;
- aRet.setValue(&xRet, rXTextType);
+ aRet <<= uno::Reference< text::XText >(this);
}
- else if(rType == rXSimpleTextType)
+ else if (rType == text::XSimpleText::static_type())
{
- uno::Reference< XSimpleText > xRet = this;
- aRet.setValue(&xRet, rXSimpleTextType);
+ aRet <<= uno::Reference< text::XSimpleText >(this);
}
- else if(rType == rXTextRangeType)
+ else if (rType == text::XTextRange::static_type())
{
- uno::Reference< text::XTextRange > xRet = this;
- aRet.setValue(&xRet, rXTextRangeType);
+ aRet <<= uno::Reference< text::XTextRange>(this);
}
- else if(rType == rXTextRangeCompareType)
+ else if (rType == text::XTextRangeCompare::static_type())
{
- uno::Reference< text::XTextRangeCompare > xRet = this;
- aRet.setValue(&xRet, rXTextRangeCompareType);
+ aRet <<= uno::Reference< text::XTextRangeCompare >(this);
}
- else if(rType == rXTypeProviderType)
+ else if (rType == lang::XTypeProvider::static_type())
{
- uno::Reference< lang::XTypeProvider > xRet = this;
- aRet.setValue(&xRet, rXTypeProviderType);
+ aRet <<= uno::Reference< lang::XTypeProvider >(this);
}
- else if(rType == rXTextContentInsert)
+ else if (rType == text::XRelativeTextContentInsert::static_type())
{
- uno::Reference< text::XRelativeTextContentInsert > xRet = this;
- aRet.setValue(&xRet, rXTextContentInsert);
+ aRet <<= uno::Reference< text::XRelativeTextContentInsert >(this);
}
- else if(rType == rXTextContentRemove)
+ else if (rType == text::XRelativeTextContentRemove::static_type())
{
- uno::Reference< text::XRelativeTextContentRemove > xRet = this;
- aRet.setValue(&xRet, rXTextContentRemove);
+ aRet <<= uno::Reference< text::XRelativeTextContentRemove >(this);
}
- else if(rType == rXPropertySet)
+ else if (rType == beans::XPropertySet::static_type())
{
- uno::Reference< beans::XPropertySet > xRet = this;
- aRet.setValue(&xRet, rXPropertySet);
+ aRet <<= uno::Reference< beans::XPropertySet >(this);
}
- else if(rType == rXUnoTunnel )
+ else if (rType == lang::XUnoTunnel::static_type())
{
- uno::Reference< lang::XUnoTunnel > xRet = this;
- aRet.setValue(&xRet, rXUnoTunnel);
+ aRet <<= uno::Reference< lang::XUnoTunnel >(this);
}
- else if(rType == rXTextAppendAndConvert )
+ else if (rType == text::XTextAppendAndConvert::static_type())
{
- uno::Reference< XTextAppendAndConvert > xRet = this;
- aRet.setValue(&xRet, rXTextAppendAndConvert);
+ aRet <<= uno::Reference< text::XTextAppendAndConvert >(this);
}
- else if(rType == rXTextAppend )
+ else if (rType == text::XTextAppend::static_type())
{
- uno::Reference< XTextAppend > xRet = this;
- aRet.setValue(&xRet, rXTextAppend);
+ aRet <<= uno::Reference< text::XTextAppend >(this);
}
- else if(rType == rXTextPortionAppend )
+ else if (rType == text::XTextPortionAppend::static_type())
{
- uno::Reference< XTextPortionAppend > xRet = this;
- aRet.setValue(&xRet, rXTextPortionAppend);
+ aRet <<= uno::Reference< text::XTextPortionAppend >(this);
}
- else if(rType == rXParagraphAppend )
+ else if (rType == text::XParagraphAppend::static_type())
{
- uno::Reference< XParagraphAppend > xRet = this;
- aRet.setValue(&xRet, rXParagraphAppend );
+ aRet <<= uno::Reference< text::XParagraphAppend >(this);
}
- else if(rType == rXTextConvert )
+ else if (rType == text::XTextConvert::static_type() )
{
- uno::Reference< XTextConvert > xRet = this;
- aRet.setValue(&xRet, rXParagraphAppend );
+ aRet <<= uno::Reference< text::XTextConvert >(this);
}
- else if(rType == rXTextContentAppend )
+ else if (rType == text::XTextContentAppend::static_type())
{
- uno::Reference< XTextContentAppend > xRet = this;
- aRet.setValue(&xRet, rXTextContentAppend );
+ aRet <<= uno::Reference< text::XTextContentAppend >(this);
}
return aRet;
}
/* -----------------------------15.03.00 17:42--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< uno::Type > SAL_CALL SwXText::getTypes() throw(uno::RuntimeException)
+uno::Sequence< uno::Type > SAL_CALL
+SwXText::getTypes() throw (uno::RuntimeException)
{
uno::Sequence< uno::Type > aRet(12);
uno::Type* pTypes = aRet.getArray();
- pTypes[0] = ::getCppuType((uno::Reference< text::XText >*)0);
- pTypes[1] = ::getCppuType((uno::Reference< text::XTextRangeCompare >*)0);
- pTypes[2] = ::getCppuType((uno::Reference< text::XRelativeTextContentInsert >*)0);
- pTypes[3] = ::getCppuType((uno::Reference< text::XRelativeTextContentRemove >*)0);
- pTypes[4] = ::getCppuType((uno::Reference< lang::XUnoTunnel >*)0);
- pTypes[5] = ::getCppuType((uno::Reference< beans::XPropertySet >*)0);
- pTypes[6] = ::getCppuType((uno::Reference< text::XTextPortionAppend >*)0);
- pTypes[7] = ::getCppuType((uno::Reference< text::XParagraphAppend >*)0);
- pTypes[8] = ::getCppuType((uno::Reference< text::XTextContentAppend >*)0);
- pTypes[9] = ::getCppuType((uno::Reference< text::XTextConvert >*)0);
- pTypes[10] = ::getCppuType((uno::Reference< text::XTextAppend >*)0);
- pTypes[11] = ::getCppuType((uno::Reference< text::XTextAppendAndConvert >*)0);
+ pTypes[0] = text::XText::static_type();
+ pTypes[1] = text::XTextRangeCompare::static_type();
+ pTypes[2] = text::XRelativeTextContentInsert::static_type();
+ pTypes[3] = text::XRelativeTextContentRemove::static_type();
+ pTypes[4] = lang::XUnoTunnel::static_type();
+ pTypes[5] = beans::XPropertySet::static_type();
+ pTypes[6] = text::XTextPortionAppend::static_type();
+ pTypes[7] = text::XParagraphAppend::static_type();
+ pTypes[8] = text::XTextContentAppend::static_type();
+ pTypes[9] = text::XTextConvert::static_type();
+ pTypes[10] = text::XTextAppend::static_type();
+ pTypes[11] = text::XTextAppendAndConvert::static_type();
return aRet;
}
// belongs the range in the text ? insert it then.
-void SwXText::insertString(const uno::Reference< text::XTextRange >& xTextRange,
- const OUString& aString,
- sal_Bool bAbsorb)
- throw( uno::RuntimeException )
+void SAL_CALL
+SwXText::insertString(const uno::Reference< text::XTextRange >& xTextRange,
+ const OUString& rString, sal_Bool bAbsorb)
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(GetDoc() && xTextRange.is())
+
+ if (!xTextRange.is())
{
- uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
- SwXTextRange* pRange = 0;
- OTextCursorHelper* pCursor = 0;
- if(xRangeTunnel.is())
+ throw uno::RuntimeException();
+ }
+ if (!GetDoc())
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Reference<lang::XUnoTunnel> xRangeTunnel(xTextRange,
+ uno::UNO_QUERY);
+ SwXTextRange *const pRange =
+ ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
+ OTextCursorHelper *const pCursor =
+ ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
+ if ((!pRange || pRange ->GetDoc() != GetDoc()) &&
+ (!pCursor || pCursor->GetDoc() != GetDoc()))
+ {
+ throw uno::RuntimeException();
+ }
+
+ const SwStartNode *const pOwnStartNode = GetStartNode();
+ SwPaM aPam(GetDoc()->GetNodes());
+ const SwPaM * pPam(0);
+ if (pCursor)
+ {
+ pPam = pCursor->GetPaM();
+ }
+ else // pRange
+ {
+ if (pRange->GetPositions(aPam))
{
- pRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
+ pPam = &aPam;
}
+ }
+ if (!pPam)
+ {
+ throw uno::RuntimeException();
+ }
- if( (pRange && pRange->GetDoc() == GetDoc()) ||
- (pCursor && pCursor->GetDoc() == GetDoc()) )
+ const SwStartNode* pTmp(pPam->GetNode()->StartOfSectionNode());
+ while (pTmp && pTmp->IsSectionNode())
+ {
+ pTmp = pTmp->StartOfSectionNode();
+ }
+ if (!pOwnStartNode || (pOwnStartNode != pTmp))
+ {
+ throw uno::RuntimeException();
+ }
+
+ bool bForceExpandHints( false );
+ if (CURSOR_META == m_pImpl->m_eType)
+ {
+ try
{
- const SwStartNode* pOwnStartNode = GetStartNode();
- if(pCursor)
- {
- const SwStartNode* pTmp = pCursor->GetPaM()->GetNode()->StartOfSectionNode();
- while(pTmp && pTmp->IsSectionNode())
- {
- pTmp = pTmp->StartOfSectionNode();
- }
- if( !pOwnStartNode || pOwnStartNode != pTmp)
- {
- throw uno::RuntimeException();
- }
- }
- else //dann pRange
- {
- ::sw::mark::IMark const * const pBkmk = pRange->GetBookmark();
- const SwStartNode* pTmp = pBkmk->GetMarkPos().nNode.GetNode().StartOfSectionNode();
- while(pTmp && pTmp->IsSectionNode())
- pTmp = pTmp->StartOfSectionNode();
- if(!pOwnStartNode || pOwnStartNode != pTmp)
- throw uno::RuntimeException();
- }
- bool bForceExpandHints( false );
- if (CURSOR_META == eCrsrType)
+ bForceExpandHints = CheckForOwnMemberMeta(*pPam, bAbsorb);
+ }
+ catch (lang::IllegalArgumentException & iae)
+ {
+ // stupid method not allowed to throw iae
+ throw uno::RuntimeException(iae.Message, 0);
+ }
+ }
+ if (bAbsorb)
+ {
+ //!! scan for CR characters and inserting the paragraph breaks
+ //!! has to be done in the called function.
+ //!! Implemented in SwXTextRange::DeleteAndInsert
+ if (pCursor)
+ {
+ SwXTextCursor * const pTextCursor(
+ dynamic_cast<SwXTextCursor*>(pCursor) );
+ if (pTextCursor)
{
- try
- {
- bForceExpandHints = CheckForOwnMemberMeta(
- pRange, (pCursor) ? pCursor->GetPaM() : 0, bAbsorb);
- }
- catch (lang::IllegalArgumentException & iae)
- {
- // stupid method not allowed to throw iae
- throw uno::RuntimeException(iae.Message, 0);
- }
- }
- if(bAbsorb)
- {
- //!! scan for CR characters and inserting the paragraph breaks
- //!! has to be done in the called function.
- //!! Implemented in SwXTextRange::DeleteAndInsert
- if (pCursor)
- {
- SwXTextCursor * const pTextCursor( dynamic_cast<SwXTextCursor*>(pCursor) );
- if (pTextCursor)
- {
- pTextCursor->DeleteAndInsert(aString, bForceExpandHints);
- }
- else
- {
- xTextRange->setString(aString);
- }
- }
- else
- {
- pRange->DeleteAndInsert(aString, bForceExpandHints);
- }
+ pTextCursor->DeleteAndInsert(rString, bForceExpandHints);
}
else
{
- //hier wird ein PaM angelegt, der vor dem Parameter-PaM liegt, damit der
- //Text davor eingefuegt wird
- UnoActionContext aContext(GetDoc());
- const SwPosition* pPos = pCursor
- ? pCursor->GetPaM()->Start()
- : &pRange->GetBookmark()->GetMarkStart();
- SwPaM aInsertPam(*pPos);
- const sal_Bool bGroupUndo = GetDoc()->DoesGroupUndo();
- GetDoc()->DoGroupUndo(sal_False);
-
- SwUnoCursorHelper::DocInsertStringSplitCR(
- *GetDoc(), aInsertPam, aString, bForceExpandHints );
- GetDoc()->DoGroupUndo(bGroupUndo);
+ xTextRange->setString(rString);
}
}
else
- throw uno::RuntimeException();
+ {
+ pRange->DeleteAndInsert(rString, bForceExpandHints);
+ }
}
else
- throw uno::RuntimeException();
+ {
+ // create a PaM positioned before the parameter PaM,
+ // so the text is inserted before
+ UnoActionContext aContext(GetDoc());
+ SwPaM aInsertPam(*pPam->Start());
+ const sal_Bool bGroupUndo = GetDoc()->DoesGroupUndo();
+ GetDoc()->DoGroupUndo(sal_False);
+
+ SwUnoCursorHelper::DocInsertStringSplitCR(
+ *GetDoc(), aInsertPam, rString, bForceExpandHints );
+ GetDoc()->DoGroupUndo(bGroupUndo);
+ }
}
/*-- 09.12.98 12:43:16---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::insertControlCharacter(const uno::Reference< text::XTextRange > & xTextRange,
- sal_Int16 nControlCharacter, sal_Bool bAbsorb)
- throw( lang::IllegalArgumentException, uno::RuntimeException )
+void SAL_CALL
+SwXText::insertControlCharacter(
+ const uno::Reference< text::XTextRange > & xTextRange,
+ sal_Int16 nControlCharacter, sal_Bool bAbsorb)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if (!xTextRange.is())
+ {
throw lang::IllegalArgumentException();
- if (GetDoc())
+ }
+ if (!GetDoc())
{
- SwUnoInternalPaM aPam(*GetDoc());
- if(SwXTextRange::XTextRangeToSwPaM(aPam, xTextRange))
+ throw uno::RuntimeException();
+ }
+
+ SwUnoInternalPaM aPam(*GetDoc());
+ if (!::sw::XTextRangeToSwPaM(aPam, xTextRange))
+ {
+ throw uno::RuntimeException();
+ }
+ const bool bForceExpandHints(CheckForOwnMemberMeta(aPam, bAbsorb));
+
+ const enum IDocumentContentOperations::InsertFlags nInsertFlags =
+ (bForceExpandHints)
+ ? static_cast<IDocumentContentOperations::InsertFlags>(
+ IDocumentContentOperations::INS_FORCEHINTEXPAND |
+ IDocumentContentOperations::INS_EMPTYEXPAND)
+ : IDocumentContentOperations::INS_EMPTYEXPAND;
+
+ SwPaM aTmp(*aPam.Start());
+ if (bAbsorb && aPam.HasMark())
+ {
+ m_pImpl->m_pDoc->DeleteAndJoin(aPam);
+ }
+
+ sal_Unicode cIns = 0;
+ switch (nControlCharacter)
+ {
+ case text::ControlCharacter::PARAGRAPH_BREAK :
+ // a table cell now becomes an ordinary text cell!
+ m_pImpl->m_pDoc->ClearBoxNumAttrs( aTmp.GetPoint()->nNode );
+ m_pImpl->m_pDoc->SplitNode( *aTmp.GetPoint(), sal_False );
+ break;
+ case text::ControlCharacter::APPEND_PARAGRAPH:
{
- const bool bForceExpandHints(
- CheckForOwnMemberMeta( 0, &aPam, bAbsorb) );
-
- const enum IDocumentContentOperations::InsertFlags nInsertFlags =
- (bForceExpandHints)
- ? static_cast<IDocumentContentOperations::InsertFlags>(
- IDocumentContentOperations::INS_FORCEHINTEXPAND |
- IDocumentContentOperations::INS_EMPTYEXPAND)
- : IDocumentContentOperations::INS_EMPTYEXPAND;
-
- //Steuerzeichen einfuegen
- SwPaM aTmp(*aPam.Start());
- if(bAbsorb && aPam.HasMark())
+ m_pImpl->m_pDoc->ClearBoxNumAttrs( aTmp.GetPoint()->nNode );
+ m_pImpl->m_pDoc->AppendTxtNode( *aTmp.GetPoint() );
+
+ const uno::Reference<lang::XUnoTunnel> xRangeTunnel(
+ xTextRange, uno::UNO_QUERY);
+ SwXTextRange *const pRange =
+ ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
+ OTextCursorHelper *const pCursor =
+ ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(
+ xRangeTunnel);
+ if (pRange)
{
- pDoc->DeleteAndJoin(aPam);
+ pRange->SetPositions(aTmp);
}
-
- sal_Unicode cIns = 0;
- switch( nControlCharacter )
+ else if (pCursor)
{
- case text::ControlCharacter::PARAGRAPH_BREAK :
- // eine Tabellen Zelle wird jetzt zu einer normalen Textzelle!
- pDoc->ClearBoxNumAttrs( aTmp.GetPoint()->nNode );
- pDoc->SplitNode( *aTmp.GetPoint(), sal_False );
- break;
- case text::ControlCharacter::APPEND_PARAGRAPH:
- {
- pDoc->ClearBoxNumAttrs( aTmp.GetPoint()->nNode );
- pDoc->AppendTxtNode( *aTmp.GetPoint() );
-
- uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
- SwXTextRange* pRange = 0;
- OTextCursorHelper* pCursor = 0;
- if(xRangeTunnel.is())
- {
- pRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
- }
- if(pRange)
- {
- pRange->_CreateNewBookmark(aTmp);
- }
- else if(pCursor)
- {
- SwPaM* pCrsr = pCursor->GetPaM();
- *pCrsr->GetPoint() = *aTmp.GetPoint();
- pCrsr->DeleteMark();
- }
- }
- break;
- case text::ControlCharacter::LINE_BREAK: cIns = 10; break;
- case text::ControlCharacter::SOFT_HYPHEN: cIns = CHAR_SOFTHYPHEN; break;
- case text::ControlCharacter::HARD_HYPHEN: cIns = CHAR_HARDHYPHEN; break;
- case text::ControlCharacter::HARD_SPACE: cIns = CHAR_HARDBLANK; break;
+ SwPaM *const pCrsr = pCursor->GetPaM();
+ *pCrsr->GetPoint() = *aTmp.GetPoint();
+ pCrsr->DeleteMark();
}
- if( cIns )
+ }
+ break;
+ case text::ControlCharacter::LINE_BREAK: cIns = 10; break;
+ case text::ControlCharacter::SOFT_HYPHEN: cIns = CHAR_SOFTHYPHEN; break;
+ case text::ControlCharacter::HARD_HYPHEN: cIns = CHAR_HARDHYPHEN; break;
+ case text::ControlCharacter::HARD_SPACE: cIns = CHAR_HARDBLANK; break;
+ }
+ if (cIns)
+ {
+ m_pImpl->m_pDoc->InsertString( aTmp, cIns, nInsertFlags );
+ }
+
+ if (bAbsorb)
+ {
+ const uno::Reference<lang::XUnoTunnel> xRangeTunnel(
+ xTextRange, uno::UNO_QUERY);
+ SwXTextRange *const pRange =
+ ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
+ OTextCursorHelper *const pCursor =
+ ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
+
+ SwCursor aCrsr(*aTmp.GetPoint(),0,false);
+ SwUnoCursorHelper::SelectPam(aCrsr, true);
+ aCrsr.Left(1, CRSR_SKIP_CHARS, FALSE, FALSE);
+ //hier muss der uebergebene PaM umgesetzt werden:
+ if (pRange)
+ {
+ pRange->SetPositions(aCrsr);
+ }
+ else
+ {
+ SwPaM *const pUnoCrsr = pCursor->GetPaM();
+ *pUnoCrsr->GetPoint() = *aCrsr.GetPoint();
+ if (aCrsr.HasMark())
{
- pDoc->InsertString( aTmp, cIns, nInsertFlags );
+ pUnoCrsr->SetMark();
+ *pUnoCrsr->GetMark() = *aCrsr.GetMark();
}
-
- if(bAbsorb)
+ else
{
- uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
- SwXTextRange* pRange = 0;
- OTextCursorHelper* pCursor = 0;
- if(xRangeTunnel.is())
- {
- pRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
- }
-
- SwCursor aCrsr(*aTmp.GetPoint(),0,false);
- SwXTextCursor::SelectPam(aCrsr, sal_True);
- aCrsr.Left(1, CRSR_SKIP_CHARS, FALSE, FALSE);
- //hier muss der uebergebene PaM umgesetzt werden:
- if(pRange)
- pRange->_CreateNewBookmark(aCrsr);
- else
- {
- SwPaM* pUnoCrsr = pCursor->GetPaM();
- *pUnoCrsr->GetPoint() = *aCrsr.GetPoint();
- if(aCrsr.HasMark())
- {
- pUnoCrsr->SetMark();
- *pUnoCrsr->GetMark() = *aCrsr.GetMark();
- }
- else
- pUnoCrsr->DeleteMark();
- }
+ pUnoCrsr->DeleteMark();
}
}
}
- else
- throw uno::RuntimeException();
}
+
/*-- 09.12.98 12:43:17---------------------------------------------------
-----------------------------------------------------------------------*/
-
-void SwXText::insertTextContent(const uno::Reference< text::XTextRange > & xRange,
- const uno::Reference< text::XTextContent > & xContent, sal_Bool bAbsorb)
- throw( lang::IllegalArgumentException, uno::RuntimeException )
+void SAL_CALL
+SwXText::insertTextContent(
+ const uno::Reference< text::XTextRange > & xRange,
+ const uno::Reference< text::XTextContent > & xContent,
+ sal_Bool bAbsorb)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- // erstmal testen, ob der Range an der richtigen Stelle ist und dann
- // am Sw-Content attachToRange aufrufen
+
+ if (!xRange.is())
+ {
+ lang::IllegalArgumentException aIllegal;
+ aIllegal.Message = C2U("first parameter invalid;");
+ throw aIllegal;
+ }
+ if (!xContent.is())
+ {
+ lang::IllegalArgumentException aIllegal;
+ aIllegal.Message += C2U("second parameter invalid");
+ throw aIllegal;
+ }
if(!GetDoc())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
- if(xRange.is() && xContent.is())
- {
- SwUnoInternalPaM aPam(*GetDoc());
- if(SwXTextRange::XTextRangeToSwPaM(aPam, xRange))
- {
- uno::Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY);
- SwXTextRange* pRange = 0;
- OTextCursorHelper* pCursor = 0;
- SwXTextPortion* pPortion = 0;
- SwXText* pText = 0;
- if(xRangeTunnel.is())
- {
- pRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
- pPortion = reinterpret_cast< SwXTextPortion * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextPortion::getUnoTunnelId()) ));
- pText = reinterpret_cast< SwXText * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXText::getUnoTunnelId()) ));
- }
+ SwUnoInternalPaM aPam(*GetDoc());
+ if (!::sw::XTextRangeToSwPaM(aPam, xRange))
+ {
+ lang::IllegalArgumentException aIllegal;
+ aIllegal.Message = C2U("first parameter invalid");
+ throw aIllegal;
+ }
+ // first test if the range is at the right position, then call
+ // xContent->attach
+ const SwStartNode* pOwnStartNode = GetStartNode();
+ SwStartNodeType eSearchNodeType = SwNormalStartNode;
+ switch (m_pImpl->m_eType)
+ {
+ case CURSOR_FRAME: eSearchNodeType = SwFlyStartNode; break;
+ case CURSOR_TBLTEXT: eSearchNodeType = SwTableBoxStartNode; break;
+ case CURSOR_FOOTNOTE: eSearchNodeType = SwFootnoteStartNode; break;
+ case CURSOR_HEADER: eSearchNodeType = SwHeaderStartNode; break;
+ case CURSOR_FOOTER: eSearchNodeType = SwFooterStartNode; break;
+ //case CURSOR_INVALID:
+ //case CURSOR_BODY:
+ default:
+ break;
+ }
- uno::Reference< text::XTextCursor > xOwnCursor = createCursor();
- uno::Reference<lang::XUnoTunnel> xOwnTunnel( xOwnCursor, uno::UNO_QUERY);
-// OTextCursorHelper* pOwnCursor = reinterpret_cast< OTextCursorHelper * >(
-// sal::static_int_cast< sal_IntPtr >( xOwnTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
-
- const SwStartNode* pOwnStartNode = GetStartNode();
- SwStartNodeType eSearchNodeType = SwNormalStartNode;
- switch(eCrsrType)
- {
- case CURSOR_FRAME: eSearchNodeType = SwFlyStartNode; break;
- case CURSOR_TBLTEXT: eSearchNodeType = SwTableBoxStartNode; break;
- case CURSOR_FOOTNOTE: eSearchNodeType = SwFootnoteStartNode; break;
- case CURSOR_HEADER: eSearchNodeType = SwHeaderStartNode; break;
- case CURSOR_FOOTER: eSearchNodeType = SwFooterStartNode; break;
- //case CURSOR_INVALID:
- //case CURSOR_BODY:
- default:
- ;
- }
+ const SwStartNode* pTmp =
+ aPam.GetNode()->FindSttNodeByType(eSearchNodeType);
- const SwNode* pSrcNode = 0;
- if(pCursor && pCursor->GetPaM())
- {
- pSrcNode = pCursor->GetPaM()->GetNode();
- }
- else if (pRange && pRange->GetBookmark())
- {
- ::sw::mark::IMark const * const pBkmk = pRange->GetBookmark();
- pSrcNode = &pBkmk->GetMarkPos().nNode.GetNode();
- }
- else if (pPortion && pPortion->GetCursor())
- {
- pSrcNode = pPortion->GetCursor()->GetNode();
- }
- else if (pText)
- {
- uno::Reference<text::XTextCursor> xTextCursor = pText->createCursor();
- xTextCursor->gotoEnd(sal_True);
- uno::Reference<lang::XUnoTunnel> xCrsrTunnel( xTextCursor, uno::UNO_QUERY );
- pCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
- pSrcNode = pCursor->GetPaM()->GetNode();
- }
- else
- throw lang::IllegalArgumentException();
+ // ignore SectionNodes
+ while (pTmp && pTmp->IsSectionNode())
+ {
+ pTmp = pTmp->StartOfSectionNode();
+ }
+ // if the document starts with a section
+ while (pOwnStartNode->IsSectionNode())
+ {
+ pOwnStartNode = pOwnStartNode->StartOfSectionNode();
+ }
+ // this checks if (this) and xRange are in the same text::XText interface
+ if (pOwnStartNode != pTmp)
+ {
+ uno::RuntimeException aRunException;
+ aRunException.Message = C2U("text interface and cursor not related");
+ throw aRunException;
+ }
- const SwStartNode* pTmp = pSrcNode->FindSttNodeByType(eSearchNodeType);
+ const bool bForceExpandHints(CheckForOwnMemberMeta(aPam, bAbsorb));
- //SectionNodes ueberspringen
- while(pTmp && pTmp->IsSectionNode())
- {
- pTmp = pTmp->StartOfSectionNode();
- }
- //if the document starts with a section
- while(pOwnStartNode->IsSectionNode())
- {
- pOwnStartNode = pOwnStartNode->StartOfSectionNode();
- }
- //this checks if (this) and xRange are in the same text::XText interface
- if(pOwnStartNode != pTmp)
- {
- uno::RuntimeException aRunException;
- aRunException.Message = C2U("text interface and cursor not related");
- throw aRunException;
- }
+ // special treatment for Contents that do not replace the range, but
+ // instead are "overlaid"
+ const uno::Reference<lang::XUnoTunnel> xContentTunnel(xContent,
+ uno::UNO_QUERY);
+ if (!xContentTunnel.is())
+ {
+ lang::IllegalArgumentException aArgException;
+ aArgException.Message =
+ C2U("text content does not support lang::XUnoTunnel");
+ throw aArgException;
+ }
+ SwXDocumentIndexMark *const pDocumentIndexMark =
+ ::sw::UnoTunnelGetImplementation<SwXDocumentIndexMark>(xContentTunnel);
+ SwXTextSection *const pSection =
+ ::sw::UnoTunnelGetImplementation<SwXTextSection>(xContentTunnel);
+ SwXBookmark *const pBookmark =
+ ::sw::UnoTunnelGetImplementation<SwXBookmark>(xContentTunnel);
+ SwXReferenceMark *const pReferenceMark =
+ ::sw::UnoTunnelGetImplementation<SwXReferenceMark>(xContentTunnel);
+ SwXMeta *const pMeta =
+ ::sw::UnoTunnelGetImplementation<SwXMeta>(xContentTunnel);
- const bool bForceExpandHints( CheckForOwnMemberMeta(
- pRange, (pCursor) ? pCursor->GetPaM() : 0, bAbsorb) );
+ const bool bAttribute = pBookmark || pDocumentIndexMark
+ || pSection || pReferenceMark || pMeta;
- // Sonderbehandlung fuer Contents, die den Range nicht ersetzen, sonder darueber gelegt werden
- // Bookmarks, IndexEntry
- uno::Reference<lang::XUnoTunnel> xContentTunnel( xContent, uno::UNO_QUERY);
- if(!xContentTunnel.is())
- {
- lang::IllegalArgumentException aArgException;
- aArgException.Message = C2U("text content doesn't support lang::XUnoTunnel");
- throw aArgException;
- }
- SwXDocumentIndexMark* pDocumentIndexMark = reinterpret_cast< SwXDocumentIndexMark * >(
- sal::static_int_cast< sal_IntPtr >( xContentTunnel->getSomething( SwXDocumentIndexMark::getUnoTunnelId()) ));
- SwXTextSection* pSection = reinterpret_cast< SwXTextSection * >(
- sal::static_int_cast< sal_IntPtr >( xContentTunnel->getSomething( SwXTextSection::getUnoTunnelId()) ));
- SwXBookmark* pBookmark = reinterpret_cast< SwXBookmark * >(
- sal::static_int_cast< sal_IntPtr >( xContentTunnel->getSomething( SwXBookmark::getUnoTunnelId()) ));
- SwXReferenceMark* pReferenceMark = reinterpret_cast< SwXReferenceMark * >(
- sal::static_int_cast< sal_IntPtr >( xContentTunnel->getSomething( SwXReferenceMark::getUnoTunnelId()) ));
- SwXMeta *const pMeta = reinterpret_cast< SwXMeta* >(
- sal::static_int_cast< sal_IntPtr >(
- xContentTunnel->getSomething( SwXMeta::getUnoTunnelId())));
-
- const bool bAttribute = pBookmark || pDocumentIndexMark
- || pSection || pReferenceMark || pMeta;
-
- if(bAbsorb && !bAttribute)
- {
- xRange->setString(aEmptyStr);
- }
- //hier wird tatsaechlich eingefuegt
- uno::Reference< text::XTextRange > xTempRange;
- if(bAttribute && bAbsorb)
- xTempRange = xRange;
- else
- xTempRange = xRange->getStart();
- if (bForceExpandHints)
- {
- // if necessary, replace xTempRange with a new SwXTextCursor
- PrepareForAttach(xTempRange, pRange,
- (pCursor) ? pCursor->GetPaM() : 0);
- }
- xContent->attach(xTempRange);
- }
- else
- {
- lang::IllegalArgumentException aIllegal;
- aIllegal.Message = C2U("first parameter invalid");
- throw aIllegal;
- }
+ if (bAbsorb && !bAttribute)
+ {
+ xRange->setString(aEmptyStr);
}
- else
+ uno::Reference< text::XTextRange > xTempRange =
+ (bAttribute && bAbsorb) ? xRange : xRange->getStart();
+ if (bForceExpandHints)
{
- lang::IllegalArgumentException aIllegal;
- if(!xRange.is())
- aIllegal.Message = C2U("first parameter invalid;");
- if(!xContent.is())
- aIllegal.Message += C2U("second parameter invalid");
- throw aIllegal;
+ // if necessary, replace xTempRange with a new SwXTextCursor
+ PrepareForAttach(xTempRange, aPam);
}
-
+ xContent->attach(xTempRange);
}
+
/* -----------------------------10.07.00 15:40--------------------------------
---------------------------------------------------------------------------*/
-void SwXText::insertTextContentBefore(
+void SAL_CALL
+SwXText::insertTextContentBefore(
const uno::Reference< text::XTextContent>& xNewContent,
const uno::Reference< text::XTextContent>& xSuccessor)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!GetDoc())
{
uno::RuntimeException aRuntime;
@@ -654,101 +665,123 @@ void SwXText::insertTextContentBefore(
throw aRuntime;
}
- SwXParagraph* pPara = SwXParagraph::GetImplementation(xNewContent);
- if(!pPara || !pPara->IsDescriptor() || !xSuccessor.is())
+ const uno::Reference<lang::XUnoTunnel> xParaTunnel(xNewContent,
+ uno::UNO_QUERY);
+ SwXParagraph *const pPara =
+ ::sw::UnoTunnelGetImplementation<SwXParagraph>(xParaTunnel);
+ if (!pPara || !pPara->IsDescriptor() || !xSuccessor.is())
+ {
throw lang::IllegalArgumentException();
+ }
sal_Bool bRet = sal_False;
- SwXTextSection* pXSection = SwXTextSection::GetImplementation( xSuccessor );
- SwXTextTable* pXTable = SwXTextTable::GetImplementation(xSuccessor );
- SwFrmFmt* pTableFmt = pXTable ? pXTable->GetFrmFmt() : 0;
- SwUnoCrsr* pUnoCrsr = 0;
+ const uno::Reference<lang::XUnoTunnel> xSuccTunnel(xSuccessor,
+ uno::UNO_QUERY);
+ SwXTextSection *const pXSection =
+ ::sw::UnoTunnelGetImplementation<SwXTextSection>(xSuccTunnel);
+ SwXTextTable *const pXTable =
+ ::sw::UnoTunnelGetImplementation<SwXTextTable>(xSuccTunnel);
+ SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
+ SwTxtNode * pTxtNode = 0;
if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
{
- SwTable* pTable = SwTable::FindTable( pTableFmt );
- SwTableNode* pTblNode = pTable->GetTableNode();
+ SwTable *const pTable = SwTable::FindTable( pTableFmt );
+ SwTableNode *const pTblNode = pTable->GetTableNode();
- SwNodeIndex aTblIdx( *pTblNode, -1 );
+ const SwNodeIndex aTblIdx( *pTblNode, -1 );
SwPosition aBefore(aTblIdx);
bRet = GetDoc()->AppendTxtNode( aBefore );
- pUnoCrsr = GetDoc()->CreateUnoCrsr( aBefore, FALSE);
+ pTxtNode = aBefore.nNode.GetNode().GetTxtNode();
}
- else if(pXSection &&
- pXSection->GetFmt() &&
+ else if (pXSection && pXSection->GetFmt() &&
pXSection->GetFmt()->GetDoc() == GetDoc())
{
- SwSectionFmt* pSectFmt = pXSection->GetFmt();
- SwSectionNode* pSectNode = pSectFmt->GetSectionNode();
+ SwSectionFmt *const pSectFmt = pXSection->GetFmt();
+ SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
- SwNodeIndex aSectIdx( *pSectNode, -1 );
+ const SwNodeIndex aSectIdx( *pSectNode, -1 );
SwPosition aBefore(aSectIdx);
bRet = GetDoc()->AppendTxtNode( aBefore );
- pUnoCrsr = GetDoc()->CreateUnoCrsr( aBefore, FALSE);
+ pTxtNode = aBefore.nNode.GetNode().GetTxtNode();
}
- if(!bRet)
- throw lang::IllegalArgumentException();
- else
+ if (!bRet || !pTxtNode)
{
- pPara->attachToText(this, pUnoCrsr);
+ throw lang::IllegalArgumentException();
}
-
+ pPara->attachToText(*this, *pTxtNode);
}
+
/* -----------------------------10.07.00 15:40--------------------------------
---------------------------------------------------------------------------*/
-void SwXText::insertTextContentAfter(
+void SAL_CALL
+SwXText::insertTextContentAfter(
const uno::Reference< text::XTextContent>& xNewContent,
const uno::Reference< text::XTextContent>& xPredecessor)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!GetDoc())
+ {
throw uno::RuntimeException();
- SwXParagraph* pPara = SwXParagraph::GetImplementation(xNewContent);
+ }
+
+ const uno::Reference<lang::XUnoTunnel> xParaTunnel(xNewContent,
+ uno::UNO_QUERY);
+ SwXParagraph *const pPara =
+ ::sw::UnoTunnelGetImplementation<SwXParagraph>(xParaTunnel);
if(!pPara || !pPara->IsDescriptor() || !xPredecessor.is())
+ {
throw lang::IllegalArgumentException();
+ }
- SwUnoCrsr* pUnoCrsr = 0;
- SwXTextSection* pXSection = SwXTextSection::GetImplementation( xPredecessor );
- SwXTextTable* pXTable = SwXTextTable::GetImplementation(xPredecessor );
- SwFrmFmt* pTableFmt = pXTable ? pXTable->GetFrmFmt() : 0;
+ const uno::Reference<lang::XUnoTunnel> xPredTunnel(xPredecessor,
+ uno::UNO_QUERY);
+ SwXTextSection *const pXSection =
+ ::sw::UnoTunnelGetImplementation<SwXTextSection>(xPredTunnel);
+ SwXTextTable *const pXTable =
+ ::sw::UnoTunnelGetImplementation<SwXTextTable>(xPredTunnel);
+ SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
sal_Bool bRet = sal_False;
+ SwTxtNode * pTxtNode = 0;
if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
{
- SwTable* pTable = SwTable::FindTable( pTableFmt );
- SwTableNode* pTblNode = pTable->GetTableNode();
+ SwTable *const pTable = SwTable::FindTable( pTableFmt );
+ SwTableNode *const pTblNode = pTable->GetTableNode();
- SwEndNode* pTableEnd = pTblNode->EndOfSectionNode();
+ SwEndNode *const pTableEnd = pTblNode->EndOfSectionNode();
SwPosition aTableEnd(*pTableEnd);
bRet = GetDoc()->AppendTxtNode( aTableEnd );
- pUnoCrsr = GetDoc()->CreateUnoCrsr( aTableEnd, FALSE);
+ pTxtNode = aTableEnd.nNode.GetNode().GetTxtNode();
}
- else if(pXSection &&
- pXSection->GetFmt() &&
+ else if (pXSection && pXSection->GetFmt() &&
pXSection->GetFmt()->GetDoc() == GetDoc())
{
- SwSectionFmt* pSectFmt = pXSection->GetFmt();
- SwSectionNode* pSectNode = pSectFmt->GetSectionNode();
- SwEndNode* pEnd = pSectNode->EndOfSectionNode();
+ SwSectionFmt *const pSectFmt = pXSection->GetFmt();
+ SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
+ SwEndNode *const pEnd = pSectNode->EndOfSectionNode();
SwPosition aEnd(*pEnd);
bRet = GetDoc()->AppendTxtNode( aEnd );
- pUnoCrsr = GetDoc()->CreateUnoCrsr( aEnd, FALSE);
+ pTxtNode = aEnd.nNode.GetNode().GetTxtNode();
}
- if(!bRet)
- throw lang::IllegalArgumentException();
- else
+ if (!bRet || !pTxtNode)
{
- pPara->attachToText(this, pUnoCrsr);
+ throw lang::IllegalArgumentException();
}
+ pPara->attachToText(*this, *pTxtNode);
}
+
/* -----------------------------10.07.00 15:40--------------------------------
---------------------------------------------------------------------------*/
-void SwXText::removeTextContentBefore(
+void SAL_CALL
+SwXText::removeTextContentBefore(
const uno::Reference< text::XTextContent>& xSuccessor)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!GetDoc())
{
uno::RuntimeException aRuntime;
@@ -757,29 +790,32 @@ void SwXText::removeTextContentBefore(
}
sal_Bool bRet = sal_False;
- SwXTextSection* pXSection = SwXTextSection::GetImplementation( xSuccessor );
- SwXTextTable* pXTable = SwXTextTable::GetImplementation( xSuccessor );
- SwFrmFmt* pTableFmt = pXTable ? pXTable->GetFrmFmt() : 0;
+ const uno::Reference<lang::XUnoTunnel> xSuccTunnel(xSuccessor,
+ uno::UNO_QUERY);
+ SwXTextSection *const pXSection =
+ ::sw::UnoTunnelGetImplementation<SwXTextSection>(xSuccTunnel);
+ SwXTextTable *const pXTable =
+ ::sw::UnoTunnelGetImplementation<SwXTextTable>(xSuccTunnel);
+ SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
{
- SwTable* pTable = SwTable::FindTable( pTableFmt );
- SwTableNode* pTblNode = pTable->GetTableNode();
+ SwTable *const pTable = SwTable::FindTable( pTableFmt );
+ SwTableNode *const pTblNode = pTable->GetTableNode();
- SwNodeIndex aTblIdx( *pTblNode, -1 );
+ const SwNodeIndex aTblIdx( *pTblNode, -1 );
if(aTblIdx.GetNode().IsTxtNode())
{
SwPaM aBefore(aTblIdx);
bRet = GetDoc()->DelFullPara( aBefore );
}
}
- else if(pXSection &&
- pXSection->GetFmt() &&
+ else if (pXSection && pXSection->GetFmt() &&
pXSection->GetFmt()->GetDoc() == GetDoc())
{
- SwSectionFmt* pSectFmt = pXSection->GetFmt();
- SwSectionNode* pSectNode = pSectFmt->GetSectionNode();
+ SwSectionFmt *const pSectFmt = pXSection->GetFmt();
+ SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
- SwNodeIndex aSectIdx( *pSectNode, -1 );
+ const SwNodeIndex aSectIdx( *pSectNode, -1 );
if(aSectIdx.GetNode().IsTxtNode())
{
SwPaM aBefore(aSectIdx);
@@ -787,15 +823,21 @@ void SwXText::removeTextContentBefore(
}
}
if(!bRet)
+ {
throw lang::IllegalArgumentException();
+ }
}
+
/* -----------------------------10.07.00 15:40--------------------------------
---------------------------------------------------------------------------*/
-void SwXText::removeTextContentAfter(const uno::Reference< text::XTextContent>& xPredecessor)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+void SAL_CALL
+SwXText::removeTextContentAfter(
+ const uno::Reference< text::XTextContent>& xPredecessor)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!GetDoc())
{
uno::RuntimeException aRuntime;
@@ -804,30 +846,33 @@ void SwXText::removeTextContentAfter(const uno::Reference< text::XTextContent>&
}
sal_Bool bRet = sal_False;
- SwXTextSection* pXSection = SwXTextSection::GetImplementation( xPredecessor );
- SwXTextTable* pXTable = SwXTextTable::GetImplementation(xPredecessor );
- SwFrmFmt* pTableFmt = pXTable ? pXTable->GetFrmFmt() : 0;
+ const uno::Reference<lang::XUnoTunnel> xPredTunnel(xPredecessor,
+ uno::UNO_QUERY);
+ SwXTextSection *const pXSection =
+ ::sw::UnoTunnelGetImplementation<SwXTextSection>(xPredTunnel);
+ SwXTextTable *const pXTable =
+ ::sw::UnoTunnelGetImplementation<SwXTextTable>(xPredTunnel);
+ SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
{
- SwTable* pTable = SwTable::FindTable( pTableFmt );
- SwTableNode* pTblNode = pTable->GetTableNode();
- SwEndNode* pTableEnd = pTblNode->EndOfSectionNode();
+ SwTable *const pTable = SwTable::FindTable( pTableFmt );
+ SwTableNode *const pTblNode = pTable->GetTableNode();
+ SwEndNode *const pTableEnd = pTblNode->EndOfSectionNode();
- SwNodeIndex aTblIdx( *pTableEnd, 1 );
+ const SwNodeIndex aTblIdx( *pTableEnd, 1 );
if(aTblIdx.GetNode().IsTxtNode())
{
SwPaM aPaM(aTblIdx);
bRet = GetDoc()->DelFullPara( aPaM );
}
}
- else if(pXSection &&
- pXSection->GetFmt() &&
+ else if (pXSection && pXSection->GetFmt() &&
pXSection->GetFmt()->GetDoc() == GetDoc())
{
- SwSectionFmt* pSectFmt = pXSection->GetFmt();
- SwSectionNode* pSectNode = pSectFmt->GetSectionNode();
- SwEndNode* pEnd = pSectNode->EndOfSectionNode();
- SwNodeIndex aSectIdx( *pEnd, 1 );
+ SwSectionFmt *const pSectFmt = pXSection->GetFmt();
+ SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
+ SwEndNode *const pEnd = pSectNode->EndOfSectionNode();
+ const SwNodeIndex aSectIdx( *pEnd, 1 );
if(aSectIdx.GetNode().IsTxtNode())
{
SwPaM aAfter(aSectIdx);
@@ -835,42 +880,50 @@ void SwXText::removeTextContentAfter(const uno::Reference< text::XTextContent>&
}
}
if(!bRet)
+ {
throw lang::IllegalArgumentException();
+ }
}
+
/*-- 09.12.98 12:43:19---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::removeTextContent(const uno::Reference< text::XTextContent > & xContent)
- throw( container::NoSuchElementException, uno::RuntimeException )
+void SAL_CALL
+SwXText::removeTextContent(
+ const uno::Reference< text::XTextContent > & xContent)
+throw (container::NoSuchElementException, uno::RuntimeException)
{
- vos::OGuard aGuard(Application::GetSolarMutex());
+ // forward: need no solar mutex here
if(!xContent.is())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U("first parameter invalid");
throw aRuntime;
}
- else
- xContent->dispose();
+ xContent->dispose();
}
+
/*-- 09.12.98 12:43:22---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XText > SwXText::getText(void)
- throw( uno::RuntimeException )
+uno::Reference< text::XText > SAL_CALL
+SwXText::getText() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XText > xRet = (SwXText*)this;
- return xRet;
+ const uno::Reference< text::XText > xRet(this);
+ return xRet;
}
+
/*-- 09.12.98 12:43:24---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::getStart(void) throw( uno::RuntimeException )
+uno::Reference< text::XTextRange > SAL_CALL
+SwXText::getStart() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRef = createCursor();
+
+ const uno::Reference< text::XTextCursor > xRef = CreateCursor();
if(!xRef.is())
{
uno::RuntimeException aRuntime;
@@ -878,16 +931,18 @@ uno::Reference< text::XTextRange > SwXText::getStart(void) throw( uno::RuntimeE
throw aRuntime;
}
xRef->gotoStart(sal_False);
- uno::Reference< text::XTextRange > xRet(xRef, uno::UNO_QUERY);
+ const uno::Reference< text::XTextRange > xRet(xRef, uno::UNO_QUERY);
return xRet;
}
/*-- 09.12.98 12:43:27---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::getEnd(void) throw( uno::RuntimeException )
+uno::Reference< text::XTextRange > SAL_CALL
+SwXText::getEnd() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRef = createCursor();
+
+ const uno::Reference< text::XTextCursor > xRef = CreateCursor();
if(!xRef.is())
{
uno::RuntimeException aRuntime;
@@ -895,42 +950,52 @@ uno::Reference< text::XTextRange > SwXText::getEnd(void) throw( uno::RuntimeExc
throw aRuntime;
}
xRef->gotoEnd(sal_False);
- uno::Reference< text::XTextRange > xRet(xRef, uno::UNO_QUERY);
+ const uno::Reference< text::XTextRange > xRet(xRef, uno::UNO_QUERY);
return xRet;
}
+
/*-- 09.12.98 12:43:29---------------------------------------------------
-----------------------------------------------------------------------*/
-OUString SwXText::getString(void) throw( uno::RuntimeException )
+OUString SAL_CALL SwXText::getString() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRet = createCursor();
+
+ const uno::Reference< text::XTextCursor > xRet = CreateCursor();
if(!xRet.is())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
- else
- {
- xRet->gotoEnd(sal_True);
- }
+ xRet->gotoEnd(sal_True);
return xRet->getString();
}
/*-- 09.12.98 12:43:30---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::setString(const OUString& aString) throw( uno::RuntimeException )
+void SAL_CALL
+SwXText::setString(const OUString& rString) throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
+ if (!GetDoc())
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U(cInvalidObject);
+ throw aRuntime;
+ }
+
const SwStartNode* pStartNode = GetStartNode();
- if(!pStartNode)
+ if (!pStartNode)
+ {
throw uno::RuntimeException();
+ }
GetDoc()->StartUndo(UNDO_START, NULL);
//insert an empty paragraph at the start and at the end to ensure that
//all tables and sections can be removed by the selecting text::XTextCursor
- if (CURSOR_META != eCrsrType)
+ if (CURSOR_META != m_pImpl->m_eType)
{
SwPosition aStartPos(*pStartNode);
const SwEndNode* pEnd = pStartNode->EndOfSectionNode();
@@ -962,7 +1027,7 @@ void SwXText::setString(const OUString& aString) throw( uno::RuntimeException )
}
}
- uno::Reference< text::XTextCursor > xRet = createCursor();
+ const uno::Reference< text::XTextCursor > xRet = CreateCursor();
if(!xRet.is())
{
GetDoc()->EndUndo(UNDO_END, NULL);
@@ -970,36 +1035,28 @@ void SwXText::setString(const OUString& aString) throw( uno::RuntimeException )
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
- else
- {
- xRet->gotoEnd(sal_True);
- }
- xRet->setString(aString);
+ xRet->gotoEnd(sal_True);
+ xRet->setString(rString);
GetDoc()->EndUndo(UNDO_END, NULL);
}
//FIXME why is CheckForOwnMember duplicated in some insert methods?
// Description: Checks if pRange/pCursor are member of the same text interface.
// Only one of the pointers has to be set!
-sal_Bool SwXText::CheckForOwnMember(
- const SwXTextRange* pRange,
- const OTextCursorHelper* pCursor)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+bool SwXText::Impl::CheckForOwnMember(
+ const SwPaM & rPaM)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- DBG_ASSERT((!pRange || !pCursor) && (pRange || pCursor), "only one pointer will be checked" );
- uno::Reference<text::XTextCursor> xOwnCursor = createCursor();
+ const uno::Reference<text::XTextCursor> xOwnCursor(m_rThis.CreateCursor());
- uno::Reference<lang::XUnoTunnel> xTunnel( xOwnCursor, uno::UNO_QUERY);
- OTextCursorHelper* pOwnCursor = 0;
- if(xTunnel.is())
- {
- pOwnCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(OTextCursorHelper::getUnoTunnelId()) ));
- }
+ const uno::Reference<lang::XUnoTunnel> xTunnel(xOwnCursor, uno::UNO_QUERY);
+ OTextCursorHelper *const pOwnCursor =
+ ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xTunnel);
DBG_ASSERT(pOwnCursor, "OTextCursorHelper::getUnoTunnelId() ??? ");
- const SwStartNode* pOwnStartNode = pOwnCursor->GetPaM()->GetNode()->StartOfSectionNode();
+ const SwStartNode* pOwnStartNode =
+ pOwnCursor->GetPaM()->GetNode()->StartOfSectionNode();
SwStartNodeType eSearchNodeType = SwNormalStartNode;
- switch(eCrsrType)
+ switch (m_eType)
{
case CURSOR_FRAME: eSearchNodeType = SwFlyStartNode; break;
case CURSOR_TBLTEXT: eSearchNodeType = SwTableBoxStartNode; break;
@@ -1012,105 +1069,62 @@ sal_Bool SwXText::CheckForOwnMember(
;
}
- const SwNode* pSrcNode;
- if(pCursor)
- pSrcNode = pCursor->GetPaM()->GetNode();
- else //dann pRange
- {
- ::sw::mark::IMark const * const pBkmk = pRange->GetBookmark();
- pSrcNode = &pBkmk->GetMarkPos().nNode.GetNode();
- }
+ SwNode const*const pSrcNode(rPaM.GetNode());
+ if (!pSrcNode) { return false; }
const SwStartNode* pTmp = pSrcNode->FindSttNodeByType(eSearchNodeType);
//SectionNodes ueberspringen
while(pTmp && pTmp->IsSectionNode())
+ {
pTmp = pTmp->StartOfSectionNode();
+ }
//if the document starts with a section
while(pOwnStartNode->IsSectionNode())
+ {
pOwnStartNode = pOwnStartNode->StartOfSectionNode();
+ }
//this checks if (this) and xRange are in the same text::XText interface
- return(pOwnStartNode == pTmp);
+ return (pOwnStartNode == pTmp);
}
-sal_Int16 SwXText::ComparePositions(
+sal_Int16
+SwXText::Impl::ComparePositions(
const uno::Reference<text::XTextRange>& xPos1,
const uno::Reference<text::XTextRange>& xPos2)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- sal_Int16 nCompare = 0;
- SwUnoInternalPaM aPam1(*GetDoc());
- SwUnoInternalPaM aPam2(*GetDoc());
+ SwUnoInternalPaM aPam1(*m_pDoc);
+ SwUnoInternalPaM aPam2(*m_pDoc);
- BOOL bExcept = FALSE;
- if(SwXTextRange::XTextRangeToSwPaM(aPam1, xPos1) &&
- SwXTextRange::XTextRangeToSwPaM(aPam2, xPos2))
+ if (!::sw::XTextRangeToSwPaM(aPam1, xPos1) ||
+ !::sw::XTextRangeToSwPaM(aPam2, xPos2))
{
- uno::Reference<lang::XUnoTunnel> xRangeTunnel1( xPos1, uno::UNO_QUERY);
- SwXTextRange* pRange1 = 0;
- OTextCursorHelper* pCursor1 = 0;
- if(xRangeTunnel1.is())
- {
- pRange1 = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel1->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor1 = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel1->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
- }
- uno::Reference<lang::XUnoTunnel> xRangeTunnel2( xPos2, uno::UNO_QUERY);
- SwXTextRange* pRange2 = 0;
- OTextCursorHelper* pCursor2 = 0;
- if(xRangeTunnel2.is())
- {
- pRange2 = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel2->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor2 = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel2->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
- }
-
- if((pRange1||pCursor1) && (pRange2||pCursor2))
- {
- if(CheckForOwnMember(pRange1, pCursor1)
- && CheckForOwnMember( pRange2, pCursor2))
- {
- const SwPosition *pStart1 = 0;
- const SwPosition *pStart2 = 0;
-
- if(pRange1)
- pStart1 = pRange1->GetBookmark() ? &(pRange1->GetBookmark()->GetMarkStart()) : 0;
- else
- pStart1 = pCursor1->GetPaM() ? pCursor1->GetPaM()->Start() : 0;
-
- if(pRange2)
- pStart2 = pRange2->GetBookmark() ? &(pRange2->GetBookmark()->GetMarkStart()) : 0;
- else
- pStart2 = pCursor2->GetPaM() ? pCursor2->GetPaM()->Start() : 0;
+ throw lang::IllegalArgumentException();
+ }
+ if (!CheckForOwnMember(aPam1) || !CheckForOwnMember(aPam2))
+ {
+ throw lang::IllegalArgumentException();
+ }
- if(pStart1 && pStart2)
- {
- if(*pStart1 < *pStart2)
- nCompare = 1;
- else if(*pStart1 > *pStart2)
- nCompare = -1;
- else
- {
- DBG_ASSERT(*pStart1 == *pStart2, "SwPositions should be equal here");
- nCompare = 0;
- }
- }
- else
- bExcept = TRUE;
- }
- else
- bExcept = TRUE;
- }
- else
- bExcept = TRUE;
+ sal_Int16 nCompare = 0;
+ SwPosition const*const pStart1 = aPam1.Start();
+ SwPosition const*const pStart2 = aPam2.Start();
+ if (*pStart1 < *pStart2)
+ {
+ nCompare = 1;
+ }
+ else if (*pStart1 > *pStart2)
+ {
+ nCompare = -1;
}
else
- bExcept = TRUE;
- if(bExcept)
- throw lang::IllegalArgumentException();
+ {
+ DBG_ASSERT(*pStart1 == *pStart2,
+ "SwPositions should be equal here");
+ nCompare = 0;
+ }
return nCompare;
}
@@ -1118,50 +1132,64 @@ sal_Int16 SwXText::ComparePositions(
/*-- 28.03.00 10:37:22---------------------------------------------------
-----------------------------------------------------------------------*/
-sal_Int16 SwXText::compareRegionStarts(
- const uno::Reference<text::XTextRange>& xR1,
- const uno::Reference<text::XTextRange>& xR2)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+sal_Int16 SAL_CALL
+SwXText::compareRegionStarts(
+ const uno::Reference<text::XTextRange>& xRange1,
+ const uno::Reference<text::XTextRange>& xRange2)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(!xR1.is() || !xR2.is())
+
+ if (!xRange1.is() || !xRange2.is())
+ {
throw lang::IllegalArgumentException();
- uno::Reference<text::XTextRange> xStart1 = xR1->getStart();
- uno::Reference<text::XTextRange> xStart2 = xR2->getStart();
+ }
+ const uno::Reference<text::XTextRange> xStart1 = xRange1->getStart();
+ const uno::Reference<text::XTextRange> xStart2 = xRange2->getStart();
- return ComparePositions(xStart1, xStart2);
+ return m_pImpl->ComparePositions(xStart1, xStart2);
}
/*-- 28.03.00 10:37:25---------------------------------------------------
-----------------------------------------------------------------------*/
-sal_Int16 SwXText::compareRegionEnds(
- const uno::Reference<text::XTextRange>& xR1,
- const uno::Reference<text::XTextRange>& xR2)
- throw(lang::IllegalArgumentException, uno::RuntimeException)
+sal_Int16 SAL_CALL
+SwXText::compareRegionEnds(
+ const uno::Reference<text::XTextRange>& xRange1,
+ const uno::Reference<text::XTextRange>& xRange2)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(!xR1.is() || !xR2.is())
+
+ if (!xRange1.is() || !xRange2.is())
+ {
throw lang::IllegalArgumentException();
- uno::Reference<text::XTextRange> xEnd1 = xR1->getEnd();
- uno::Reference<text::XTextRange> xEnd2 = xR2->getEnd();
+ }
+ uno::Reference<text::XTextRange> xEnd1 = xRange1->getEnd();
+ uno::Reference<text::XTextRange> xEnd2 = xRange2->getEnd();
- return ComparePositions(xEnd1, xEnd2);
+ return m_pImpl->ComparePositions(xEnd1, xEnd2);
}
/*-- 15.03.2002 12:30:40---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< beans::XPropertySetInfo > SwXText::getPropertySetInfo( )
- throw(uno::RuntimeException)
+uno::Reference< beans::XPropertySetInfo > SAL_CALL
+SwXText::getPropertySetInfo() throw(uno::RuntimeException)
{
- static uno::Reference< beans::XPropertySetInfo > xInfo = m_pPropSet->getPropertySetInfo();
+ vos::OGuard g(Application::GetSolarMutex());
+
+ static uno::Reference< beans::XPropertySetInfo > xInfo =
+ m_pImpl->m_rPropSet.getPropertySetInfo();
return xInfo;
}
+
/*-- 15.03.2002 12:30:42---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::setPropertyValue( const ::rtl::OUString& /*aPropertyName*/, const uno::Any& /*aValue*/ )
- throw(beans::UnknownPropertyException, beans::PropertyVetoException,
+void SAL_CALL
+SwXText::setPropertyValue(const ::rtl::OUString& /*aPropertyName*/,
+ const uno::Any& /*aValue*/)
+throw (beans::UnknownPropertyException, beans::PropertyVetoException,
lang::IllegalArgumentException, lang::WrappedTargetException,
uno::RuntimeException)
{
@@ -1170,100 +1198,113 @@ void SwXText::setPropertyValue( const ::rtl::OUString& /*aPropertyName*/, const
/*-- 15.03.2002 12:30:42---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Any SwXText::getPropertyValue(
- const ::rtl::OUString& rPropertyName )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException,
- uno::RuntimeException)
+uno::Any SAL_CALL
+SwXText::getPropertyValue(
+ const ::rtl::OUString& rPropertyName)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!IsValid())
+ {
throw uno::RuntimeException();
- const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ }
+
+ SfxItemPropertySimpleEntry const*const pEntry =
+ m_pImpl->m_rPropSet.getPropertyMap()->getByName(rPropertyName);
+ if (!pEntry)
+ {
+ beans::UnknownPropertyException aExcept;
+ aExcept.Message = C2U("Unknown property: ");
+ aExcept.Message += rPropertyName;
+ throw aExcept;
+ }
+
uno::Any aRet;
- if(pEntry)
+ switch (pEntry->nWID)
{
- switch(pEntry->nWID)
- {
// no code necessary - the redline is always located at the end node
// case FN_UNO_REDLINE_NODE_START:
// break;
- case FN_UNO_REDLINE_NODE_END:
+ case FN_UNO_REDLINE_NODE_END:
+ {
+ const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl();
+ const USHORT nRedTblCount = rRedTbl.Count();
+ if (nRedTblCount > 0)
{
- const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl();
- USHORT nRedTblCount = rRedTbl.Count();
- if ( nRedTblCount > 0 )
+ SwStartNode const*const pStartNode = GetStartNode();
+ const ULONG nOwnIndex = pStartNode->EndOfSectionIndex();
+ for (USHORT nRed = 0; nRed < nRedTblCount; nRed++)
{
- const SwStartNode* pStartNode = GetStartNode();
- ULONG nOwnIndex = pStartNode->EndOfSectionIndex();
- for(USHORT nRed = 0; nRed < nRedTblCount; nRed++)
+ SwRedline const*const pRedline = rRedTbl[nRed];
+ SwPosition const*const pRedStart = pRedline->Start();
+ const SwNodeIndex nRedNode = pRedStart->nNode;
+ if (nOwnIndex == nRedNode.GetIndex())
{
- const SwRedline* pRedline = rRedTbl[nRed];
- const SwPosition* pRedStart = pRedline->Start();
- const SwNodeIndex nRedNode = pRedStart->nNode;
- if(nOwnIndex == nRedNode.GetIndex())
- {
- aRet <<= SwXRedlinePortion::CreateRedlineProperties(*pRedline, TRUE);
- break;
- }
+ aRet <<= SwXRedlinePortion::CreateRedlineProperties(
+ *pRedline, TRUE);
+ break;
}
}
}
- break;
}
- }
- else
- {
- beans::UnknownPropertyException aExcept;
- aExcept.Message = C2U("Unknown property: ");
- aExcept.Message += rPropertyName;
- throw aExcept;
+ break;
}
return aRet;
-
}
+
/*-- 15.03.2002 12:30:42---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::addPropertyChangeListener(
- const ::rtl::OUString& /*aPropertyName*/,
- const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException,
- uno::RuntimeException)
+void SAL_CALL
+SwXText::addPropertyChangeListener(
+ const ::rtl::OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
- throw uno::RuntimeException();
+ OSL_ENSURE(false,
+ "SwXText::addPropertyChangeListener(): not implemented");
}
/*-- 15.03.2002 12:30:43---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::removePropertyChangeListener(
- const ::rtl::OUString& /*aPropertyName*/,
- const uno::Reference< beans::XPropertyChangeListener >& /*aListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException,
- uno::RuntimeException)
+void SAL_CALL
+SwXText::removePropertyChangeListener(
+ const ::rtl::OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
- throw uno::RuntimeException();
+ OSL_ENSURE(false,
+ "SwXText::removePropertyChangeListener(): not implemented");
}
/*-- 15.03.2002 12:30:43---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::addVetoableChangeListener(
- const ::rtl::OUString& /*PropertyName*/,
- const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException,
- uno::RuntimeException)
+void SAL_CALL
+SwXText::addVetoableChangeListener(
+ const ::rtl::OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
- throw uno::RuntimeException();
+ OSL_ENSURE(false,
+ "SwXText::addVetoableChangeListener(): not implemented");
}
/*-- 15.03.2002 12:30:43---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXText::removeVetoableChangeListener(
- const ::rtl::OUString& /*rPropertyName*/,
- const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException,
+void SAL_CALL
+SwXText::removeVetoableChangeListener(
+ const ::rtl::OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
uno::RuntimeException)
{
- throw uno::RuntimeException();
+ OSL_ENSURE(false,
+ "SwXText::removeVetoableChangeListener(): not implemented");
}
/* -----------------------------08.01.01 09:07--------------------------------
@@ -1277,493 +1318,527 @@ const uno::Sequence< sal_Int8 > & SwXText::getUnoTunnelId()
/* -----------------------------08.01.01 09:07--------------------------------
---------------------------------------------------------------------------*/
-sal_Int64 SwXText::getSomething( const uno::Sequence< sal_Int8 >& rId )
- throw(uno::RuntimeException)
+sal_Int64 SAL_CALL
+SwXText::getSomething(const uno::Sequence< sal_Int8 >& rId)
+throw (uno::RuntimeException)
{
- if( rId.getLength() == 16
- && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
- rId.getConstArray(), 16 ) )
- {
- return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
- }
- return 0;
+ return ::sw::UnoTunnelImpl<SwXText>(rId, this);
}
+
/*-- 23.06.2006 08:56:30---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::appendParagraph(
- const uno::Sequence< beans::PropertyValue > & rProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
+uno::Reference< text::XTextRange > SAL_CALL
+SwXText::appendParagraph(
+ const uno::Sequence< beans::PropertyValue > & rProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- return finishOrAppendParagraph(false, rProperties);
+ vos::OGuard g(Application::GetSolarMutex());
+
+ return m_pImpl->finishOrAppendParagraph(false, rProperties);
}
/*-- 23.06.2006 08:56:22---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::finishParagraph(
- const uno::Sequence< beans::PropertyValue > & rProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
+uno::Reference< text::XTextRange > SAL_CALL
+SwXText::finishParagraph(
+ const uno::Sequence< beans::PropertyValue > & rProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- return finishOrAppendParagraph(true, rProperties);
+ vos::OGuard g(Application::GetSolarMutex());
+
+ return m_pImpl->finishOrAppendParagraph(true, rProperties);
}
/*-- 08.05.2006 13:26:26---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::finishOrAppendParagraph(
- bool bFinish,
- const uno::Sequence< beans::PropertyValue > & rProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
-
+uno::Reference< text::XTextRange >
+SwXText::Impl::finishOrAppendParagraph(
+ const bool bFinish,
+ const uno::Sequence< beans::PropertyValue > & rProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- vos::OGuard aGuard(Application::GetSolarMutex());
- if(!IsValid())
+ if (!m_bIsValid)
+ {
throw uno::RuntimeException();
- uno::Reference< text::XTextRange > xRet;
+ }
- const SwStartNode* pStartNode = GetStartNode();
+ const SwStartNode* pStartNode = m_rThis.GetStartNode();
if(!pStartNode)
+ {
throw uno::RuntimeException();
+ }
+
+ uno::Reference< text::XTextRange > xRet;
+ bool bIllegalException = false;
+ bool bRuntimeException = false;
+ ::rtl::OUString sMessage;
+ m_pDoc->StartUndo(UNDO_START , NULL);
+ // find end node, go backward - don't skip tables because the new
+ // paragraph has to be the last node
+ //aPam.Move( fnMoveBackward, fnGoNode );
+ SwPosition aInsertPosition(
+ SwNodeIndex( *pStartNode->EndOfSectionNode(), -1 ) );
+ SwPaM aPam(aInsertPosition);
+ m_pDoc->AppendTxtNode( *aPam.GetPoint() );
+ // remove attributes from the previous paragraph
+ m_pDoc->ResetAttrs(aPam);
+ // in case of finishParagraph the PaM needs to be moved to the
+ // previous paragraph
+ if (bFinish)
{
- bool bIllegalException = false;
- bool bRuntimeException = false;
- ::rtl::OUString sMessage;
- pDoc->StartUndo(UNDO_START , NULL);
- //find end node, go backward - don't skip tables because the new paragraph has to be the last node
- //aPam.Move( fnMoveBackward, fnGoNode );
- SwPosition aInsertPosition( SwNodeIndex( *pStartNode->EndOfSectionNode(), -1 ) );
- SwPaM aPam(aInsertPosition);
- pDoc->AppendTxtNode( *aPam.GetPoint() );
- //remove attributes from the previous paragraph
- pDoc->ResetAttrs(aPam);
- //in case of finishParagraph the PaM needs to be moved to the previous paragraph
- if(bFinish)
- aPam.Move( fnMoveBackward, fnGoNode );
- if(rProperties.getLength())
- {
- // now set the properties
- const SfxItemPropertySet* pParaPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH);
- const SfxItemPropertyMap* pParagraphMap = pParaPropSet->getPropertyMap();
+ aPam.Move( fnMoveBackward, fnGoNode );
+ }
+ if (rProperties.getLength())
+ {
+ // now set the properties
+ SfxItemPropertySet const*const pParaPropSet =
+ aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH);
+ SfxItemPropertyMap const*const pParagraphMap =
+ pParaPropSet->getPropertyMap();
- const beans::PropertyValue* pValues = rProperties.getConstArray();
+ const beans::PropertyValue* pValues = rProperties.getConstArray();
- for( sal_Int32 nProp = 0; nProp < rProperties.getLength(); ++nProp)
+ for (sal_Int32 nProp = 0; nProp < rProperties.getLength(); ++nProp)
+ {
+ if (!pParagraphMap->getByName(pValues[nProp].Name))
{
- if(pParagraphMap->getByName( pValues[nProp].Name ))
- {
- try
- {
- SwXTextCursor::SetPropertyValue(
- aPam,
- *pParaPropSet,
- pValues[nProp].Name,
- pValues[nProp].Value);
- }
- catch( lang::IllegalArgumentException& rIllegal )
- {
- sMessage = rIllegal.Message;
- bIllegalException = true;
- }
- catch( uno::RuntimeException& rRuntime )
- {
- sMessage = rRuntime.Message;
- bRuntimeException = true;
- }
- }
- else
- bIllegalException = true;
- if( bIllegalException || bRuntimeException )
- {
- break;
- }
+ bIllegalException = true;
+ break;
}
- }
- pDoc->EndUndo(UNDO_END, NULL);
- if( bIllegalException || bRuntimeException )
- {
- SwUndoIter aUndoIter( &aPam, UNDO_EMPTY );
- pDoc->Undo(aUndoIter);
- if(bIllegalException)
+ try
+ {
+ SwUnoCursorHelper::SetPropertyValue(aPam, *pParaPropSet,
+ pValues[nProp].Name, pValues[nProp].Value);
+ }
+ catch (lang::IllegalArgumentException& rIllegal)
{
- lang::IllegalArgumentException aEx;
- aEx.Message = sMessage;
- throw aEx;
+ sMessage = rIllegal.Message;
+ bIllegalException = true;
+ break;
}
- else //if(bRuntimeException)
+ catch (uno::RuntimeException& rRuntime)
{
- uno::RuntimeException aEx;
- aEx.Message = sMessage;
- throw aEx;
+ sMessage = rRuntime.Message;
+ bRuntimeException = true;
+ break;
}
}
- SwTxtNode * pTxtNode( aPam.Start()->nNode.GetNode().GetTxtNode() );
- OSL_ENSURE(pTxtNode, "no SwTxtNode?");
- xRet = new SwXParagraph(this, pTxtNode);
+ }
+ m_pDoc->EndUndo(UNDO_END, NULL);
+ if (bIllegalException || bRuntimeException)
+ {
+ SwUndoIter aUndoIter( &aPam, UNDO_EMPTY );
+ m_pDoc->Undo(aUndoIter);
+ if (bIllegalException)
+ {
+ lang::IllegalArgumentException aEx;
+ aEx.Message = sMessage;
+ throw aEx;
+ }
+ else // if(bRuntimeException)
+ {
+ uno::RuntimeException aEx;
+ aEx.Message = sMessage;
+ throw aEx;
+ }
+ }
+ SwTxtNode *const pTxtNode( aPam.Start()->nNode.GetNode().GetTxtNode() );
+ OSL_ENSURE(pTxtNode, "no SwTxtNode?");
+ if (pTxtNode)
+ {
+ xRet.set(SwXParagraph::CreateXParagraph(*m_pDoc, *pTxtNode, &m_rThis),
+ uno::UNO_QUERY);
}
return xRet;
}
+
/*-- 08.05.2006 13:28:26---------------------------------------------------
Append text portions at the end of the last paragraph of the text
interface. Support of import filters.
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::appendTextPortion(
+uno::Reference< text::XTextRange > SAL_CALL
+SwXText::appendTextPortion(
const ::rtl::OUString& rText,
- const uno::Sequence< beans::PropertyValue > & rCharacterAndParagraphProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
+ const uno::Sequence< beans::PropertyValue > &
+ rCharacterAndParagraphProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!IsValid())
+ {
throw uno::RuntimeException();
- uno::Reference< text::XTextRange > xRet;
- uno::Reference< text::XTextCursor > xTextCursor = createCursor();
+ }
+ uno::Reference< text::XTextRange > xRet;
+ const uno::Reference< text::XTextCursor > xTextCursor = CreateCursor();
xTextCursor->gotoEnd(sal_False);
- uno::Reference< lang::XUnoTunnel > xRangeTunnel( xTextCursor, uno::UNO_QUERY_THROW );
- SwXTextCursor* pTextCursor = reinterpret_cast< SwXTextCursor * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextCursor::getUnoTunnelId())));
- {
- bool bIllegalException = false;
- bool bRuntimeException = false;
- ::rtl::OUString sMessage;
- pDoc->StartUndo(UNDO_INSERT, NULL);
+ const uno::Reference< lang::XUnoTunnel > xRangeTunnel(
+ xTextCursor, uno::UNO_QUERY_THROW );
+ SwXTextCursor *const pTextCursor =
+ ::sw::UnoTunnelGetImplementation<SwXTextCursor>(xRangeTunnel);
-// SwPaM aPam(*pStartNode->EndOfSectionNode());
- //aPam.Move( fnMoveBackward, fnGoNode );
- SwUnoCrsr* pCursor = pTextCursor->GetCrsr();
- pCursor->MovePara( fnParaCurr, fnParaEnd );
- pDoc->DontExpandFmt( *pCursor->Start() );
-
- if(rText.getLength())
- {
- xub_StrLen nContentPos = pCursor->GetPoint()->nContent.GetIndex();
- SwUnoCursorHelper::DocInsertStringSplitCR( *pDoc, *pCursor, rText,
- false );
- SwXTextCursor::SelectPam(*pCursor, sal_True);
- pCursor->GetPoint()->nContent = nContentPos;
- }
+ bool bIllegalException = false;
+ bool bRuntimeException = false;
+ ::rtl::OUString sMessage;
+ m_pImpl->m_pDoc->StartUndo(UNDO_INSERT, NULL);
- if(rCharacterAndParagraphProperties.getLength())
+// SwPaM aPam(*pStartNode->EndOfSectionNode());
+ //aPam.Move( fnMoveBackward, fnGoNode );
+ SwUnoCrsr *const pCursor = pTextCursor->GetCursor();
+ pCursor->MovePara( fnParaCurr, fnParaEnd );
+ m_pImpl->m_pDoc->DontExpandFmt( *pCursor->Start() );
+
+ if (rText.getLength())
+ {
+ const xub_StrLen nContentPos = pCursor->GetPoint()->nContent.GetIndex();
+ SwUnoCursorHelper::DocInsertStringSplitCR(
+ *m_pImpl->m_pDoc, *pCursor, rText, false);
+ SwUnoCursorHelper::SelectPam(*pCursor, true);
+ pCursor->GetPoint()->nContent = nContentPos;
+ }
+
+ if (rCharacterAndParagraphProperties.getLength())
+ {
+ SfxItemPropertyMap const*const pCursorMap =
+ aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR)
+ ->getPropertyMap();
+ beans::PropertyValue const*const pValues =
+ rCharacterAndParagraphProperties.getConstArray();
+ SfxItemPropertySet const*const pCursorPropSet =
+ aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR);
+ const sal_Int32 nLen(rCharacterAndParagraphProperties.getLength());
+ for (sal_Int32 nProp = 0; nProp < nLen; ++nProp)
{
- const SfxItemPropertyMap* pCursorMap = aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR)->getPropertyMap();
- const beans::PropertyValue* pValues = rCharacterAndParagraphProperties.getConstArray();
- const SfxItemPropertySet* pCursorPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR);
- for( sal_Int32 nProp = 0; nProp < rCharacterAndParagraphProperties.getLength(); ++nProp)
+ if (!pCursorMap->getByName( pValues[nProp].Name ))
{
- if( pCursorMap->getByName( pValues[nProp].Name ) )
- {
- try
- {
- SwXTextCursor::SetPropertyValue(
- *pCursor,
- *pCursorPropSet,
- pValues[nProp].Name,
- pValues[nProp].Value,
- nsSetAttrMode::SETATTR_NOFORMATATTR);
- }
- catch( lang::IllegalArgumentException& rIllegal )
- {
- sMessage = rIllegal.Message;
- bIllegalException = true;
- }
- catch( uno::RuntimeException& rRuntime )
- {
- sMessage = rRuntime.Message;
- bRuntimeException = true;
- }
- }
- else
- bIllegalException = true;
- if( bIllegalException || bRuntimeException )
- {
- break;
- }
+ bIllegalException = true;
+ break;
}
- }
- pDoc->EndUndo(UNDO_INSERT, NULL);
- if( bIllegalException || bRuntimeException )
- {
- SwUndoIter aUndoIter( pCursor, UNDO_EMPTY );
- pDoc->Undo(aUndoIter);
- delete pCursor;
- pCursor = 0;
- if(bIllegalException)
+ try
+ {
+ SwUnoCursorHelper::SetPropertyValue(
+ *pCursor, *pCursorPropSet,
+ pValues[nProp].Name, pValues[nProp].Value,
+ nsSetAttrMode::SETATTR_NOFORMATATTR);
+ }
+ catch( lang::IllegalArgumentException& rIllegal )
{
- lang::IllegalArgumentException aEx;
- aEx.Message = sMessage;
- throw aEx;
+ sMessage = rIllegal.Message;
+ bIllegalException = true;
+ break;
}
- else //if(bRuntimeException)
+ catch( uno::RuntimeException& rRuntime )
{
- uno::RuntimeException aEx;
- aEx.Message = sMessage;
- throw aEx;
+ sMessage = rRuntime.Message;
+ bRuntimeException = true;
+ break;
}
}
- xRet = new SwXTextRange(*pCursor, this);
- delete pCursor;
}
- return xRet;
+ m_pImpl->m_pDoc->EndUndo(UNDO_INSERT, NULL);
+ if (bIllegalException || bRuntimeException)
+ {
+ SwUndoIter aUndoIter( pCursor, UNDO_EMPTY );
+ m_pImpl->m_pDoc->Undo(aUndoIter);
+ if (bIllegalException)
+ {
+ lang::IllegalArgumentException aEx;
+ aEx.Message = sMessage;
+ throw aEx;
+ }
+ else //if(bRuntimeException)
+ {
+ uno::RuntimeException aEx;
+ aEx.Message = sMessage;
+ throw aEx;
+ }
+ }
+ xRet = new SwXTextRange(*pCursor, this);
+ return xRet;
}
+
/*-- 11.05.2006 15:46:26---------------------------------------------------
enable appending text contents like graphic objects, shapes and so on
to support import filters
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXText::appendTextContent(
+uno::Reference< text::XTextRange > SAL_CALL
+SwXText::appendTextContent(
const uno::Reference< text::XTextContent >& xTextContent,
- const uno::Sequence< beans::PropertyValue >& rCharacterAndParagraphProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
+ const uno::Sequence< beans::PropertyValue >&
+ rCharacterAndParagraphProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(!IsValid())
+
+ if (!IsValid())
+ {
throw uno::RuntimeException();
- const SwStartNode* pStartNode = GetStartNode();
+ }
+ SwStartNode const*const pStartNode = GetStartNode();
if(!pStartNode)
+ {
throw uno::RuntimeException();
+ }
+
uno::Reference< text::XTextRange > xRet;
+ m_pImpl->m_pDoc->StartUndo(UNDO_INSERT, NULL);
+ // find end node, go backward - don't skip tables because the
+ // new paragraph has to be the last node
+ SwPaM aPam(*pStartNode->EndOfSectionNode());
+ aPam.Move( fnMoveBackward, fnGoNode );
+ // set cursor to the end of the last text node
+ SwCursor aCursor( *aPam.Start(), 0, false );
+ xRet = new SwXTextRange(aCursor, this);
+ aCursor.MovePara( fnParaCurr, fnParaEnd );
+ m_pImpl->m_pDoc->DontExpandFmt( *aCursor.Start() );
+ // now attach the text content here
+ insertTextContent( xRet, xTextContent, false );
+ // now apply the properties to the anchor
+ if (rCharacterAndParagraphProperties.getLength())
{
- pDoc->StartUndo(UNDO_INSERT, NULL);
- //find end node, go backward - don't skip tables because the new paragraph has to be the last node
- SwPaM aPam(*pStartNode->EndOfSectionNode());
- aPam.Move( fnMoveBackward, fnGoNode );
- //set cursor to the end of the last text node
- SwCursor* pCursor = new SwCursor( *aPam.Start(),0,false );
- xRet = new SwXTextRange(*pCursor, this);
- pCursor->MovePara( fnParaCurr, fnParaEnd );
- pDoc->DontExpandFmt( *pCursor->Start() );
- //now attach the text content here
- insertTextContent( xRet, xTextContent, false );
- //now apply the properties to the anchor
- if( rCharacterAndParagraphProperties.getLength())
+ try
{
- try
+ const sal_Int32 nLen(rCharacterAndParagraphProperties.getLength());
+ const uno::Reference< beans::XPropertySet > xAnchor(
+ xTextContent->getAnchor(), uno::UNO_QUERY);
+ if (xAnchor.is())
{
- uno::Reference< beans::XPropertySet > xAnchor( xTextContent->getAnchor(), uno::UNO_QUERY);
- if( xAnchor.is() )
+ for (sal_Int32 nElement = 0; nElement < nLen; ++nElement)
{
- for( sal_Int32 nElement = 0; nElement < rCharacterAndParagraphProperties.getLength(); ++nElement )
- {
- xAnchor->setPropertyValue( rCharacterAndParagraphProperties[nElement].Name, rCharacterAndParagraphProperties[nElement].Value );
- }
+ xAnchor->setPropertyValue(
+ rCharacterAndParagraphProperties[nElement].Name,
+ rCharacterAndParagraphProperties[nElement].Value);
}
-
- }
- catch(const uno::Exception&)
- {
- throw uno::RuntimeException();
}
}
- delete pCursor;
- pDoc->EndUndo(UNDO_INSERT, NULL);
+ catch (const uno::Exception&)
+ {
+ throw uno::RuntimeException();
+ }
}
+ m_pImpl->m_pDoc->EndUndo(UNDO_INSERT, NULL);
return xRet;
}
// move previously appended paragraphs into a text frames
// to support import filters
-uno::Reference< text::XTextContent > SwXText::convertToTextFrame(
+uno::Reference< text::XTextContent > SAL_CALL
+SwXText::convertToTextFrame(
const uno::Reference< text::XTextRange >& xStart,
const uno::Reference< text::XTextRange >& xEnd,
- const uno::Sequence< beans::PropertyValue >& rFrameProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
+ const uno::Sequence< beans::PropertyValue >& rFrameProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
if(!IsValid())
+ {
throw uno::RuntimeException();
+ }
uno::Reference< text::XTextContent > xRet;
SwUnoInternalPaM aStartPam(*GetDoc());
- std::auto_ptr < SwUnoInternalPaM > pEndPam( new SwUnoInternalPaM(*GetDoc()));
- if(SwXTextRange::XTextRangeToSwPaM(aStartPam, xStart) &&
- SwXTextRange::XTextRangeToSwPaM(*pEndPam, xEnd) )
- {
- uno::Reference<lang::XUnoTunnel> xStartRangeTunnel( xStart, uno::UNO_QUERY);
- SwXTextRange* pStartRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xStartRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- uno::Reference<lang::XUnoTunnel> xEndRangeTunnel( xEnd, uno::UNO_QUERY);
- SwXTextRange* pEndRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xEndRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- //bookmarks have to be removed before the referenced text node is deleted in DelFullPara
- if(pStartRange)
- {
- ::sw::mark::IMark const * const pStartBookmark = pStartRange->GetBookmark();
- if(pStartBookmark)
- pDoc->getIDocumentMarkAccess()->deleteMark(pStartBookmark);
- }
- if(pEndRange)
- {
- ::sw::mark::IMark const * const pEndBookmark = pEndRange->GetBookmark();
- if(pEndBookmark)
- pDoc->getIDocumentMarkAccess()->deleteMark(pEndBookmark);
- }
+ std::auto_ptr< SwUnoInternalPaM > pEndPam(new SwUnoInternalPaM(*GetDoc()));
+ if (!::sw::XTextRangeToSwPaM(aStartPam, xStart) ||
+ !::sw::XTextRangeToSwPaM(*pEndPam, xEnd))
+ {
+ throw lang::IllegalArgumentException();
+ }
- pDoc->StartUndo( UNDO_START, NULL );
- bool bIllegalException = false;
- bool bRuntimeException = false;
- ::rtl::OUString sMessage;
- SwStartNode* pStartStartNode = aStartPam.GetNode()->StartOfSectionNode();
- while(pStartStartNode && pStartStartNode->IsSectionNode())
+ const uno::Reference<lang::XUnoTunnel> xStartRangeTunnel(xStart,
+ uno::UNO_QUERY);
+ SwXTextRange *const pStartRange =
+ ::sw::UnoTunnelGetImplementation<SwXTextRange>(xStartRangeTunnel);
+ const uno::Reference<lang::XUnoTunnel> xEndRangeTunnel(xEnd,
+ uno::UNO_QUERY);
+ SwXTextRange *const pEndRange =
+ ::sw::UnoTunnelGetImplementation<SwXTextRange>(xEndRangeTunnel);
+ // bookmarks have to be removed before the referenced text node
+ // is deleted in DelFullPara
+ if (pStartRange)
+ {
+ pStartRange->Invalidate();
+ }
+ if (pEndRange)
+ {
+ pEndRange->Invalidate();
+ }
+
+ m_pImpl->m_pDoc->StartUndo( UNDO_START, NULL );
+ bool bIllegalException = false;
+ bool bRuntimeException = false;
+ ::rtl::OUString sMessage;
+ SwStartNode* pStartStartNode = aStartPam.GetNode()->StartOfSectionNode();
+ while (pStartStartNode && pStartStartNode->IsSectionNode())
+ {
+ pStartStartNode = pStartStartNode->StartOfSectionNode();
+ }
+ SwStartNode* pEndStartNode = pEndPam->GetNode()->StartOfSectionNode();
+ while (pEndStartNode && pEndStartNode->IsSectionNode())
+ {
+ pEndStartNode = pEndStartNode->StartOfSectionNode();
+ }
+ bool bParaAfterInserted = false;
+ bool bParaBeforeInserted = false;
+ if (pStartStartNode != pEndStartNode || pStartStartNode != GetStartNode())
+ {
+ // todo: if the start/end is in a table then insert a paragraph
+ // before/after, move the start/end nodes, then convert and
+ // remove the addtional paragraphs in the end
+ if (pStartStartNode->GetStartNodeType() == SwTableBoxStartNode)
{
- pStartStartNode = pStartStartNode->StartOfSectionNode();
+ SwTableNode *const pSartTableNode(pStartStartNode->FindTableNode());
+ const SwNodeIndex aTblIdx( *pSartTableNode, -1 );
+ SwPosition aBefore(aTblIdx);
+ bParaBeforeInserted = GetDoc()->AppendTxtNode( aBefore );
+ aStartPam.DeleteMark();
+ *aStartPam.GetPoint() = aBefore;
+ pStartStartNode = aStartPam.GetNode()->StartOfSectionNode();
}
- SwStartNode* pEndStartNode = pEndPam->GetNode()->StartOfSectionNode();
- while(pEndStartNode && pEndStartNode->IsSectionNode())
+ if (pEndStartNode->GetStartNodeType() == SwTableBoxStartNode)
{
- pEndStartNode = pEndStartNode->StartOfSectionNode();
+ SwTableNode *const pEndTableNode = pEndStartNode->FindTableNode();
+ SwEndNode *const pTableEnd = pEndTableNode->EndOfSectionNode();
+ SwPosition aTableEnd(*pTableEnd);
+ bParaAfterInserted = GetDoc()->AppendTxtNode( aTableEnd );
+ pEndPam->DeleteMark();
+ *pEndPam->GetPoint() = aTableEnd;
+ pEndStartNode = pEndPam->GetNode()->StartOfSectionNode();
}
- bool bParaAfterInserted = false;
- bool bParaBeforeInserted = false;
- if(pStartStartNode != pEndStartNode || pStartStartNode != GetStartNode())
+ // now we should have the positions in the same hierarchy
+ if ((pStartStartNode != pEndStartNode) ||
+ (pStartStartNode != GetStartNode()))
{
- //todo: if the start/end is in a table then insert a paragraph before/after, move
- //the start/end nodes, then convert and remove the addtional paragraphs in the end
- if( pStartStartNode->GetStartNodeType() == SwTableBoxStartNode )
+ // if not - remove the additional paragraphs and throw
+ if (bParaBeforeInserted)
{
- SwTableNode* pSartTableNode = pStartStartNode->FindTableNode();
- SwNodeIndex aTblIdx( *pSartTableNode, -1 );
- SwPosition aBefore(aTblIdx);
- bParaBeforeInserted = GetDoc()->AppendTxtNode( aBefore );
- aStartPam.DeleteMark();
- *aStartPam.GetPoint() = aBefore;
- pStartStartNode = aStartPam.GetNode()->StartOfSectionNode();
+ SwCursor aDelete(*aStartPam.GetPoint(), 0, false);
+ aDelete.MovePara(fnParaCurr, fnParaStart);
+ aDelete.SetMark();
+ aDelete.MovePara(fnParaCurr, fnParaEnd);
+ GetDoc()->DelFullPara(aDelete);
}
- if( pEndStartNode->GetStartNodeType() == SwTableBoxStartNode )
+ if (bParaAfterInserted)
{
- SwTableNode* pEndTableNode = pEndStartNode->FindTableNode();
- SwEndNode* pTableEnd = pEndTableNode->EndOfSectionNode();
- SwPosition aTableEnd(*pTableEnd);
- bParaAfterInserted = GetDoc()->AppendTxtNode( aTableEnd );
- pEndPam->DeleteMark();
- *pEndPam->GetPoint() = aTableEnd;
- pEndStartNode = pEndPam->GetNode()->StartOfSectionNode();
- }
- //now we should have the positions in the same hierarchy
- if(pStartStartNode != pEndStartNode || pStartStartNode != GetStartNode())
- {
- //if not - remove the additional paragraphs and throw
- if( bParaBeforeInserted )
- {
- SwCursor aDelete(*aStartPam.GetPoint(), 0, false);
- aDelete.MovePara(fnParaCurr, fnParaStart);
- aDelete.SetMark();
- aDelete.MovePara(fnParaCurr, fnParaEnd);
- GetDoc()->DelFullPara(aDelete);
- }
- if( bParaAfterInserted )
- {
- SwCursor aDelete(*pEndPam->GetPoint(), 0, false);
- aDelete.MovePara(fnParaCurr, fnParaStart);
- aDelete.SetMark();
- aDelete.MovePara(fnParaCurr, fnParaEnd);
- GetDoc()->DelFullPara(aDelete);
- }
- throw lang::IllegalArgumentException();
+ SwCursor aDelete(*pEndPam->GetPoint(), 0, false);
+ aDelete.MovePara(fnParaCurr, fnParaStart);
+ aDelete.SetMark();
+ aDelete.MovePara(fnParaCurr, fnParaEnd);
+ GetDoc()->DelFullPara(aDelete);
}
+ throw lang::IllegalArgumentException();
}
+ }
- //make a selection from aStartPam to a EndPam
- SwSelBoxes aBoxes;
- SfxItemSet aFrameItemSet(pDoc->GetAttrPool(),
- RES_FRMATR_BEGIN, RES_FRMATR_END-1,
- 0 );
+ // make a selection from aStartPam to a EndPam
+ SwSelBoxes aBoxes;
+ SfxItemSet aFrameItemSet(m_pImpl->m_pDoc->GetAttrPool(),
+ RES_FRMATR_BEGIN, RES_FRMATR_END-1,
+ 0 );
- aStartPam.SetMark();
- *aStartPam.End() = *pEndPam->End();
- pEndPam.reset(0);
+ aStartPam.SetMark();
+ *aStartPam.End() = *pEndPam->End();
+ pEndPam.reset(0);
- SwXTextFrame* pNewFrame;
- uno::Reference< text::XTextFrame > xNewFrame = pNewFrame = new SwXTextFrame( pDoc );
- pNewFrame->SetSelection( aStartPam );
- try
+ SwXTextFrame *const pNewFrame = new SwXTextFrame(m_pImpl->m_pDoc);
+ const uno::Reference< text::XTextFrame > xNewFrame = pNewFrame;
+ pNewFrame->SetSelection( aStartPam );
+ try
+ {
+ const beans::PropertyValue* pValues = rFrameProperties.getConstArray();
+ for (sal_Int32 nProp = 0; nProp < rFrameProperties.getLength(); ++nProp)
{
- const beans::PropertyValue* pValues = rFrameProperties.getConstArray();
- for(sal_Int32 nProp = 0; nProp < rFrameProperties.getLength(); ++nProp)
- pNewFrame->SwXFrame::setPropertyValue(pValues[nProp].Name, pValues[nProp].Value);
-
- {//has to be in a block to remove the SwIndexes before DelFullPara is called
- uno::Reference< text::XTextRange> xInsertTextRange = new SwXTextRange(aStartPam, this);
- pNewFrame->attach( xInsertTextRange );
- pNewFrame->setName(pDoc->GetUniqueFrameName());
- }
+ pNewFrame->SwXFrame::setPropertyValue(
+ pValues[nProp].Name, pValues[nProp].Value);
+ }
- if( !aStartPam.GetTxt().Len() )
- {
+ { // has to be in a block to remove the SwIndexes before
+ // DelFullPara is called
+ const uno::Reference< text::XTextRange> xInsertTextRange =
+ new SwXTextRange(aStartPam, this);
+ pNewFrame->attach( xInsertTextRange );
+ pNewFrame->setName(m_pImpl->m_pDoc->GetUniqueFrameName());
+ }
- bool bMoved = false;
- {//has to be in a block to remove the SwIndexes before DelFullPara is called
- SwPaM aMovePam( *aStartPam.GetNode() );
- if( aMovePam.Move( fnMoveForward, fnGoCntnt ) )
- {
- //move the anchor to the next paragraph
- SwFmtAnchor aNewAnchor( pNewFrame->GetFrmFmt()->GetAnchor() );
- aNewAnchor.SetAnchor( aMovePam.Start() );
- pDoc->SetAttr( aNewAnchor, *pNewFrame->GetFrmFmt() );
- }
- bMoved = true;
- }
- if(bMoved)
+ if (!aStartPam.GetTxt().Len())
+ {
+ bool bMoved = false;
+ { // has to be in a block to remove the SwIndexes before
+ // DelFullPara is called
+ SwPaM aMovePam( *aStartPam.GetNode() );
+ if (aMovePam.Move( fnMoveForward, fnGoCntnt ))
{
- aStartPam.DeleteMark();
-// SwPaM aDelPam( *aStartPam.GetNode() );
- pDoc->DelFullPara(aStartPam/*aDelPam*/);
+ // move the anchor to the next paragraph
+ SwFmtAnchor aNewAnchor(pNewFrame->GetFrmFmt()->GetAnchor());
+ aNewAnchor.SetAnchor( aMovePam.Start() );
+ m_pImpl->m_pDoc->SetAttr(
+ aNewAnchor, *pNewFrame->GetFrmFmt() );
}
+ bMoved = true;
+ }
+ if (bMoved)
+ {
+ aStartPam.DeleteMark();
+// SwPaM aDelPam( *aStartPam.GetNode() );
+ m_pImpl->m_pDoc->DelFullPara(aStartPam/*aDelPam*/);
}
}
- catch( lang::IllegalArgumentException& rIllegal )
+ }
+ catch (lang::IllegalArgumentException& rIllegal)
+ {
+ sMessage = rIllegal.Message;
+ bIllegalException = true;
+ }
+ catch (uno::RuntimeException& rRuntime)
+ {
+ sMessage = rRuntime.Message;
+ bRuntimeException = true;
+ }
+ xRet = pNewFrame;
+ if (bParaBeforeInserted || bParaAfterInserted)
+ {
+ const uno::Reference<text::XTextCursor> xFrameTextCursor =
+ pNewFrame->createTextCursor();
+ const uno::Reference<XUnoTunnel> xTunnel(xFrameTextCursor,
+ uno::UNO_QUERY);
+ SwXTextCursor *const pFrameCursor =
+ ::sw::UnoTunnelGetImplementation<SwXTextCursor>(xTunnel);
+ if (bParaBeforeInserted)
{
- sMessage = rIllegal.Message;
- bIllegalException = true;
+ // todo: remove paragraph before frame
+ m_pImpl->m_pDoc->DelFullPara(*pFrameCursor->GetPaM());
}
- catch( uno::RuntimeException& rRuntime )
+ if (bParaAfterInserted)
{
- sMessage = rRuntime.Message;
- bRuntimeException = true;
+ xFrameTextCursor->gotoEnd(sal_False);
+ m_pImpl->m_pDoc->DelFullPara(*pFrameCursor->GetPaM());
}
- xRet = pNewFrame;
- uno::Reference<text::XTextCursor> xFrameTextCursor;
- if( bParaBeforeInserted )
+ }
+
+ m_pImpl->m_pDoc->EndUndo(UNDO_END, NULL);
+ if (bIllegalException || bRuntimeException)
+ {
+ SwUndoIter aUndoIter( &aStartPam, UNDO_EMPTY );
+ m_pImpl->m_pDoc->Undo(aUndoIter);
+ if (bIllegalException)
{
- //todo: remove paragraph before frame
- xFrameTextCursor = pNewFrame->createTextCursor();
- uno::Reference<XUnoTunnel> xTunnel(xFrameTextCursor, uno::UNO_QUERY);
- SwXTextCursor* pFrameCursor = reinterpret_cast< SwXTextCursor* >(
- sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(SwXTextCursor::getUnoTunnelId()) ));
- pDoc->DelFullPara(*pFrameCursor->GetPaM());
+ lang::IllegalArgumentException aEx;
+ aEx.Message = sMessage;
+ throw aEx;
}
- if( bParaAfterInserted )
+ else //if(bRuntimeException)
{
- //todo: remove paragraph after frame
- if( xFrameTextCursor.is() )
- xFrameTextCursor = pNewFrame->createTextCursor();
- xFrameTextCursor->gotoEnd( false );
- uno::Reference<XUnoTunnel> xTunnel(xFrameTextCursor, uno::UNO_QUERY);
- SwXTextCursor* pFrameCursor = reinterpret_cast< SwXTextCursor* >(
- sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(SwXTextCursor::getUnoTunnelId()) ));
- pDoc->DelFullPara(*pFrameCursor->GetPaM());
- }
-
- pDoc->EndUndo(UNDO_END, NULL);
- if( bIllegalException || bRuntimeException )
- {
- SwUndoIter aUndoIter( &aStartPam, UNDO_EMPTY );
- pDoc->Undo(aUndoIter);
- if(bIllegalException)
- {
- lang::IllegalArgumentException aEx;
- aEx.Message = sMessage;
- throw aEx;
- }
- else //if(bRuntimeException)
- {
- uno::RuntimeException aEx;
- aEx.Message = sMessage;
- throw aEx;
- }
+ uno::RuntimeException aEx;
+ aEx.Message = sMessage;
+ throw aEx;
}
}
- else
- throw lang::IllegalArgumentException();
return xRet;
}
+
/*-- 11.05.2006 15:46:26---------------------------------------------------
Move previously imported paragraphs into a new text table.
@@ -1774,155 +1849,407 @@ struct VerticallyMergedCell
sal_Int32 nLeftPosition;
bool bOpen;
- VerticallyMergedCell( uno::Reference< beans::XPropertySet >& rxCell, sal_Int32 nLeft ) :
- nLeftPosition( nLeft ),
- bOpen( true )
- {
- aCells.push_back( rxCell );
- }
+ VerticallyMergedCell(uno::Reference< beans::XPropertySet > const& rxCell,
+ const sal_Int32 nLeft)
+ : nLeftPosition( nLeft )
+ , bOpen( true )
+ {
+ aCells.push_back( rxCell );
+ }
};
#define COL_POS_FUZZY 2
-bool lcl_SimilarPosition( sal_Int32 nPos1, sal_Int32 nPos2 )
+static bool lcl_SimilarPosition( const sal_Int32 nPos1, const sal_Int32 nPos2 )
{
return abs( nPos1 - nPos2 ) < COL_POS_FUZZY;
}
-uno::Reference< text::XTextTable > SwXText::convertToTable(
- const uno::Sequence< uno::Sequence< uno::Sequence< uno::Reference< text::XTextRange > > > >& rTableRanges,
- const uno::Sequence< uno::Sequence< uno::Sequence< beans::PropertyValue > > >& rCellProperties,
- const uno::Sequence< uno::Sequence< beans::PropertyValue > >& rRowProperties,
- const uno::Sequence< beans::PropertyValue >& rTableProperties )
- throw (lang::IllegalArgumentException, uno::RuntimeException)
+void SwXText::Impl::ConvertCell(
+ const bool bFirstCell,
+ const uno::Sequence< uno::Reference< text::XTextRange > > & rCell,
+ ::std::vector<SwNodeRange> & rRowNodes,
+ ::std::auto_ptr< SwPaM > & rpFirstPaM,
+ SwPaM & rLastPaM,
+ bool & rbExcept)
{
- vos::OGuard aGuard(Application::GetSolarMutex());
- if(!IsValid())
- throw uno::RuntimeException();
+ if (rCell.getLength() != 2)
+ {
+ throw lang::IllegalArgumentException();
+ }
+ const uno::Reference<text::XTextRange> xStartRange = rCell[0];
+ const uno::Reference<text::XTextRange> xEndRange = rCell[1];
+ SwUnoInternalPaM aStartCellPam(*m_pDoc);
+ SwUnoInternalPaM aEndCellPam(*m_pDoc);
- //at first collect the text ranges as SwPaMs
- const uno::Sequence< uno::Sequence< uno::Reference< text::XTextRange > > >* pTableRanges = rTableRanges.getConstArray();
- std::auto_ptr < SwPaM > pFirstPaM;
- std::vector< std::vector<SwNodeRange> > aTableNodes;
- bool bExcept = false;
- SwPaM aLastPaM(pDoc->GetNodes());
- for( sal_Int32 nRow = 0; !bExcept && (nRow < rTableRanges.getLength()); ++nRow)
+ // !!! TODO - PaMs in tables and sections do not work here -
+ // the same applies to PaMs in frames !!!
+
+ if (!::sw::XTextRangeToSwPaM(aStartCellPam, xStartRange) ||
+ !::sw::XTextRangeToSwPaM(aEndCellPam, xEndRange))
{
- std::vector<SwNodeRange> aRowNodes;
- const uno::Sequence< uno::Sequence< uno::Reference< text::XTextRange > > >& rRow = pTableRanges[nRow];
- const uno::Sequence< uno::Reference< text::XTextRange > >* pRow = pTableRanges[nRow].getConstArray();
+ throw lang::IllegalArgumentException();
+ }
+ /** check the nodes between start and end
+ it is allowed to have pairs of StartNode/EndNodes
+ */
+ if (aStartCellPam.Start()->nNode < aEndCellPam.End()->nNode)
+ {
+ // increment on each StartNode and decrement on each EndNode
+ // we must reach zero at the end and must not go below zero
+ long nOpenNodeBlock = 0;
+ SwNodeIndex aCellIndex = aStartCellPam.Start()->nNode;
+ while (aCellIndex < aEndCellPam.End()->nNode.GetIndex())
+ {
+ if (aCellIndex.GetNode().IsStartNode())
+ {
+ ++nOpenNodeBlock;
+ }
+ else if (aCellIndex.GetNode().IsEndNode())
+ {
+ --nOpenNodeBlock;
+ }
+ if (nOpenNodeBlock < 0)
+ {
+ rbExcept = true;
+ break;
+ }
+ ++aCellIndex;
+ }
+ if (nOpenNodeBlock != 0)
+ {
+ rbExcept = true;
+ return;
+ }
+ }
- for( sal_Int32 nCell = 0; nCell < rRow.getLength(); ++nCell)
+ /** The vector<vector> NodeRanges has to contain consecutive nodes.
+ In rTableRanges the ranges don't need to be full paragraphs but
+ they have to follow each other. To process the ranges they
+ have to be aligned on paragraph borders by inserting paragraph
+ breaks. Non-consecutive ranges must initiate an exception.
+ */
+ if (bFirstCell)
+ {
+ // align the beginning - if necessary
+ if (aStartCellPam.Start()->nContent.GetIndex())
{
- if( pRow[nCell].getLength() != 2 )
- throw lang::IllegalArgumentException();
- const uno::Reference< text::XTextRange > xStartRange = pRow[nCell][0];
- const uno::Reference< text::XTextRange > xEndRange = pRow[nCell][1];
- SwUnoInternalPaM aStartCellPam(*pDoc);
- SwUnoInternalPaM aEndCellPam(*pDoc);
-
- // !!! TODO - PaMs in tables and sections do not work here - the same applies to PaMs in frames !!!
-
- if(!SwXTextRange::XTextRangeToSwPaM(aStartCellPam, xStartRange) ||
- !SwXTextRange::XTextRangeToSwPaM(aEndCellPam, xEndRange) )
- throw lang::IllegalArgumentException();
- /** check the nodes between start and end
- it is allowed to have pairs of StartNode/EndNodes
- */
- if(aStartCellPam.Start()->nNode < aEndCellPam.End()->nNode)
+ m_pDoc->SplitNode(*aStartCellPam.Start(), sal_False);
+ }
+ }
+ else
+ {
+ // check the predecessor
+ const ULONG nLastNodeIndex = rLastPaM.End()->nNode.GetIndex();
+ const ULONG nStartCellNodeIndex =
+ aStartCellPam.Start()->nNode.GetIndex();
+ const ULONG nLastNodeEndIndex = rLastPaM.End()->nNode.GetIndex();
+ if (nLastNodeIndex == nStartCellNodeIndex)
+ {
+ // same node as predecessor then equal nContent?
+ if (rLastPaM.End()->nContent != aStartCellPam.Start()->nContent)
{
- // increment on each StartNode and decrement on each EndNode
- // we must reach zero at the end and must not go below zero
- long nOpenNodeBlock = 0;
- SwNodeIndex aCellIndex = aStartCellPam.Start()->nNode;
- while( aCellIndex < aEndCellPam.End()->nNode.GetIndex())
- {
- if( aCellIndex.GetNode().IsStartNode() )
- ++nOpenNodeBlock;
- else if(aCellIndex.GetNode().IsEndNode() )
- --nOpenNodeBlock;
- if( nOpenNodeBlock < 0 )
- {
- bExcept = true;
- break;
- }
- ++aCellIndex;
- }
- if( nOpenNodeBlock != 0)
- {
- bExcept = true;
- break;
- }
+ rbExcept = true;
}
+ else
+ {
+ m_pDoc->SplitNode(*aStartCellPam.Start(), sal_False);
+ }
+ }
+ else if (nStartCellNodeIndex == (nLastNodeEndIndex + 1))
+ {
+ // next paragraph - now the content index of the new should be 0
+ // and of the old one should be equal to the text length
+ // but if it isn't we don't care - the cell is being inserted on
+ // the node border anyway
+ }
+ else
+ {
+ rbExcept = true;
+ }
+ }
+ // now check if there's a need to insert another paragraph break
+ if (aEndCellPam.End()->nContent.GetIndex() <
+ aEndCellPam.End()->nNode.GetNode().GetTxtNode()->Len())
+ {
+ m_pDoc->SplitNode(*aEndCellPam.End(), sal_False);
+ // take care that the new start/endcell is moved to the right position
+ // aStartCellPam has to point to the start of the new (previous) node
+ // aEndCellPam has to point to the end of the new (previous) node
+ aStartCellPam.DeleteMark();
+ aStartCellPam.Move(fnMoveBackward, fnGoNode);
+ aStartCellPam.GetPoint()->nContent = 0;
+ aEndCellPam.DeleteMark();
+ aEndCellPam.Move(fnMoveBackward, fnGoNode);
+ aEndCellPam.GetPoint()->nContent =
+ aEndCellPam.GetNode()->GetTxtNode()->Len();
+ }
+
+ *rLastPaM.GetPoint() = *aEndCellPam.Start();
+ if (aStartCellPam.HasMark())
+ {
+ rLastPaM.SetMark();
+ *rLastPaM.GetMark() = *aEndCellPam.End();
+ }
+ else
+ {
+ rLastPaM.DeleteMark();
+ }
+
+ SwNodeRange aCellRange(aStartCellPam.Start()->nNode,
+ aEndCellPam.End()->nNode);
+ rRowNodes.push_back(aCellRange);
+ if (bFirstCell)
+ {
+ rpFirstPaM.reset(new SwPaM(*aStartCellPam.Start()));
+ }
+}
+
+typedef uno::Sequence< text::TableColumnSeparator > TableColumnSeparators;
- /** The vector<vector> NodeRanges has to contain consecutive nodes.
- In rTableRanges the ranges don't need to be full paragraphs but they have to follow
- each other. To process the ranges they have to be aligned on paragraph borders
- by inserting paragraph breaks. Non-consecutive ranges must initiate an
- exception.
+static void
+lcl_ApplyRowProperties(
+ uno::Sequence<beans::PropertyValue> const& rRowProperties,
+ uno::Any const& rRow,
+ TableColumnSeparators & rRowSeparators)
+{
+ uno::Reference< beans::XPropertySet > xRow;
+ rRow >>= xRow;
+ const beans::PropertyValue* pProperties = rRowProperties.getConstArray();
+ for (sal_Int32 nProperty = 0; nProperty < rRowProperties.getLength();
+ ++nProperty)
+ {
+ if (pProperties[ nProperty ].Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("TableColumnSeparators")))
+ {
+ // add the separators to access the cell's positions
+ // for vertical merging later
+ TableColumnSeparators aSeparators;
+ pProperties[ nProperty ].Value >>= aSeparators;
+ rRowSeparators = aSeparators;
+ }
+ xRow->setPropertyValue(
+ pProperties[ nProperty ].Name, pProperties[ nProperty ].Value);
+ }
+}
- */
- if(!nRow && !nCell)
+#ifdef DEBUG
+//-->debug cell properties of all rows
+static void
+lcl_DebugCellProperties(
+ const uno::Sequence< uno::Sequence< uno::Sequence<
+ beans::PropertyValue > > >& rCellProperties)
+{
+ ::rtl::OUString sNames;
+ for (sal_Int32 nDebugRow = 0; nDebugRow < rCellProperties.getLength();
+ ++nDebugRow)
+ {
+ const uno::Sequence< beans::PropertyValues > aDebugCurrentRow =
+ rCellProperties[nDebugRow];
+ sal_Int32 nDebugCells = aDebugCurrentRow.getLength();
+ (void) nDebugCells;
+ for (sal_Int32 nDebugCell = 0; nDebugCell < nDebugCells;
+ ++nDebugCell)
+ {
+ const uno::Sequence< beans::PropertyValue >&
+ rDebugCellProperties = aDebugCurrentRow[nDebugCell];
+ const sal_Int32 nDebugCellProperties =
+ rDebugCellProperties.getLength();
+ for (sal_Int32 nDebugProperty = 0;
+ nDebugProperty < nDebugCellProperties; ++nDebugProperty)
{
- //align the beginning - if necessary
- if(aStartCellPam.Start()->nContent.GetIndex())
- pDoc->SplitNode(*aStartCellPam.Start(), sal_False);
+ const ::rtl::OUString sName =
+ rDebugCellProperties[nDebugProperty].Name;
+ sNames += sName;
+ sNames += ::rtl::OUString('-');
}
- else
+ sNames += ::rtl::OUString('+');
+ }
+ sNames += ::rtl::OUString('|');
+ }
+ (void)sNames;
+}
+//--<
+#endif
+
+
+static void
+lcl_ApplyCellProperties(
+ const sal_Int32 nCell,
+ TableColumnSeparators const& rRowSeparators,
+ const uno::Sequence< beans::PropertyValue >& rCellProperties,
+ uno::Reference< uno::XInterface > xCell,
+ ::std::vector<VerticallyMergedCell> & rMergedCells)
+{
+ const sal_Int32 nCellProperties = rCellProperties.getLength();
+ const uno::Reference< beans::XPropertySet > xCellPS(xCell, uno::UNO_QUERY);
+ for (sal_Int32 nProperty = 0; nProperty < nCellProperties; ++nProperty)
+ {
+ const OUString & rName = rCellProperties[nProperty].Name;
+ const uno::Any & rValue = rCellProperties[nProperty].Value;
+ if (rName.equalsAscii("VerticalMerge"))
+ {
+ // determine left border position
+ // add the cell to a queue of merged cells
+ sal_Bool bMerge = sal_False;
+ rValue >>= bMerge;
+ sal_Int32 nLeftPos = -1;
+ if (!nCell)
+ {
+ nLeftPos = 0;
+ }
+ else if (rRowSeparators.getLength() >= nCell)
{
- //check the predecessor
- ULONG nLastNodeIndex = aLastPaM.End()->nNode.GetIndex();
- ULONG nStartCellNodeIndex = aStartCellPam.Start()->nNode.GetIndex();
- ULONG nLastNodeEndIndex = aLastPaM.End()->nNode.GetIndex();
- if( nLastNodeIndex == nStartCellNodeIndex)
+ const text::TableColumnSeparator* pSeparators =
+ rRowSeparators.getConstArray();
+ nLeftPos = pSeparators[nCell - 1].Position;
+ }
+ if (bMerge)
+ {
+ // 'close' all the cell with the same left position
+ // if separate vertical merges in the same column exist
+ if (rMergedCells.size())
{
- //- same node as predecessor then equal nContent?
- if(aLastPaM.End()->nContent != aStartCellPam.Start()->nContent)
- bExcept = true;
- else
+ std::vector<VerticallyMergedCell>::iterator aMergedIter =
+ rMergedCells.begin();
+ while (aMergedIter != rMergedCells.end())
{
- pDoc->SplitNode(*aStartCellPam.Start(), sal_False);
+ if (lcl_SimilarPosition(aMergedIter->nLeftPosition,
+ nLeftPos))
+ {
+ aMergedIter->bOpen = false;
+ }
+ ++aMergedIter;
}
}
- else if(nStartCellNodeIndex == ( nLastNodeEndIndex + 1))
- {
- //next paragraph - now the content index of the new should be 0
- //and of the old one should be equal to the text length
- //but if it isn't we don't care - the cell is being inserted on the
- //node border anyway
- }
- else
+ // add the new group of merged cells
+ rMergedCells.push_back(VerticallyMergedCell(xCellPS, nLeftPos));
+ }
+ else
+ {
+ // find the cell that
+ DBG_ASSERT(rMergedCells.size(),
+ "the first merged cell is missing");
+ if (rMergedCells.size())
{
- bExcept = true;
+ std::vector<VerticallyMergedCell>::iterator aMergedIter =
+ rMergedCells.begin();
+#if OSL_DEBUG_LEVEL > 1
+ bool bDbgFound = false;
+#endif
+ while (aMergedIter != rMergedCells.end())
+ {
+ if (aMergedIter->bOpen &&
+ lcl_SimilarPosition(aMergedIter->nLeftPosition,
+ nLeftPos))
+ {
+ aMergedIter->aCells.push_back( xCellPS );
+#if OSL_DEBUG_LEVEL > 1
+ bDbgFound = true;
+#endif
+ }
+ ++aMergedIter;
+ }
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ASSERT( bDbgFound,
+ "couldn't find first vertically merged cell" );
+#endif
}
}
- //now check if there's a need to insert another paragraph break
- if( aEndCellPam.End()->nContent.GetIndex() < aEndCellPam.End()->nNode.GetNode().GetTxtNode()->Len())
- {
- pDoc->SplitNode(*aEndCellPam.End(), sal_False);
- //take care that the new start/endcell is moved to the right position
- //aStartCellPam has to point to the start of the new (previous) node
- //aEndCellPam has to point the the end of the new (previous) node
- aStartCellPam.DeleteMark();
- aStartCellPam.Move(fnMoveBackward, fnGoNode);
- aStartCellPam.GetPoint()->nContent = 0;
- aEndCellPam.DeleteMark();
- aEndCellPam.Move(fnMoveBackward, fnGoNode);
- aEndCellPam.GetPoint()->nContent = aEndCellPam.GetNode()->GetTxtNode()->Len();
-
- }
-
- *aLastPaM.GetPoint() = *aEndCellPam.Start();
- if( aStartCellPam.HasMark() )
+ }
+ else
+ {
+ try
{
- aLastPaM.SetMark();
- *aLastPaM.GetMark() = *aEndCellPam.End();
+ xCellPS->setPropertyValue(rName, rValue);
}
- else
- aLastPaM.DeleteMark();
+ catch (uno::Exception const& e)
+ {
+ // Apply the paragraph and char properties to the cell's content
+ const uno::Reference< text::XText > xCellText(xCell,
+ uno::UNO_QUERY);
+ const uno::Reference< text::XTextCursor > xCellCurs =
+ xCellText->createTextCursor();
+ xCellCurs->gotoStart( sal_False );
+ xCellCurs->gotoEnd( sal_True );
+ const uno::Reference< beans::XPropertySet > xCellTextProps(
+ xCellCurs, uno::UNO_QUERY);
+ xCellTextProps->setPropertyValue(rName, rValue);
+ }
+ }
+ }
+}
+
+static void
+lcl_MergeCells(::std::vector<VerticallyMergedCell> & rMergedCells)
+{
+ if (rMergedCells.size())
+ {
+ std::vector<VerticallyMergedCell>::iterator aMergedIter =
+ rMergedCells.begin();
+ while (aMergedIter != rMergedCells.end())
+ {
+ sal_Int32 nCellCount =
+ static_cast<sal_Int32>(aMergedIter->aCells.size());
+ std::vector<uno::Reference< beans::XPropertySet > >::iterator
+ aCellIter = aMergedIter->aCells.begin();
+ bool bFirstCell = true;
+ // the first of the cells gets the number of cells set as RowSpan
+ // the others get the inverted number of remaining merged cells
+ // (3,-2,-1)
+ while (aCellIter != aMergedIter->aCells.end())
+ {
+ (*aCellIter)->setPropertyValue(
+ C2U(SW_PROP_NAME_STR(UNO_NAME_ROW_SPAN)),
+ uno::makeAny(nCellCount));
+ if (bFirstCell)
+ {
+ nCellCount *= -1;
+ bFirstCell = false;
+ }
+ ++nCellCount;
+ ++aCellIter;
+ }
+ ++aMergedIter;
+ }
+ }
+}
+
+uno::Reference< text::XTextTable > SAL_CALL
+SwXText::convertToTable(
+ const uno::Sequence< uno::Sequence< uno::Sequence<
+ uno::Reference< text::XTextRange > > > >& rTableRanges,
+ const uno::Sequence< uno::Sequence< uno::Sequence<
+ beans::PropertyValue > > >& rCellProperties,
+ const uno::Sequence< uno::Sequence< beans::PropertyValue > >&
+ rRowProperties,
+ const uno::Sequence< beans::PropertyValue >& rTableProperties)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ if(!IsValid())
+ {
+ throw uno::RuntimeException();
+ }
- SwNodeRange aCellRange( aStartCellPam.Start()->nNode, aEndCellPam.End()->nNode);
- aRowNodes.push_back(aCellRange);
- if( !nRow && !nCell )
- pFirstPaM.reset( new SwPaM(*aStartCellPam.Start()));
+ //at first collect the text ranges as SwPaMs
+ const uno::Sequence< uno::Sequence< uno::Reference< text::XTextRange > > >*
+ pTableRanges = rTableRanges.getConstArray();
+ std::auto_ptr < SwPaM > pFirstPaM;
+ std::vector< std::vector<SwNodeRange> > aTableNodes;
+ bool bExcept = false;
+ SwPaM aLastPaM(m_pImpl->m_pDoc->GetNodes());
+ for (sal_Int32 nRow = 0; !bExcept && (nRow < rTableRanges.getLength());
+ ++nRow)
+ {
+ std::vector<SwNodeRange> aRowNodes;
+ const uno::Sequence< uno::Reference< text::XTextRange > >* pRow =
+ pTableRanges[nRow].getConstArray();
+ const sal_Int32 nCells(pTableRanges[nRow].getLength());
+
+ for (sal_Int32 nCell = 0; nCell < nCells; ++nCell)
+ {
+ m_pImpl->ConvertCell((nCell == 0) && (nRow == 0), pRow[nCell],
+ aRowNodes, pFirstPaM, aLastPaM, bExcept);
}
aTableNodes.push_back(aRowNodes);
}
@@ -1930,220 +2257,84 @@ uno::Reference< text::XTextTable > SwXText::convertToTable(
if(bExcept)
{
SwUndoIter aUndoIter( &aLastPaM, UNDO_EMPTY );
- pDoc->Undo(aUndoIter);
+ m_pImpl->m_pDoc->Undo(aUndoIter);
throw lang::IllegalArgumentException();
}
- typedef uno::Sequence< text::TableColumnSeparator > TableColumnSeparators;
- std::vector< TableColumnSeparators > aRowSeparators(rRowProperties.getLength());
- std::vector<VerticallyMergedCell> aMergedCells;
+ std::vector< TableColumnSeparators >
+ aRowSeparators(rRowProperties.getLength());
+ std::vector<VerticallyMergedCell> aMergedCells;
- const SwTable* pTable = pDoc->TextToTable( aTableNodes );
- SwXTextTable* pTextTable = 0;
- uno::Reference< text::XTextTable > xRet = pTextTable = new SwXTextTable( *pTable->GetFrmFmt() );
- uno::Reference< beans::XPropertySet > xPrSet = pTextTable;
- // set properties to the table - catch lang::WrappedTargetException and lang::IndexOutOfBoundsException
+ SwTable const*const pTable = m_pImpl->m_pDoc->TextToTable( aTableNodes );
+ SwXTextTable *const pTextTable = new SwXTextTable( *pTable->GetFrmFmt() );
+ const uno::Reference< text::XTextTable > xRet = pTextTable;
+ const uno::Reference< beans::XPropertySet > xPrSet = pTextTable;
+ // set properties to the table
+ // catch lang::WrappedTargetException and lang::IndexOutOfBoundsException
try
{
//apply table properties
- const beans::PropertyValue* pTableProperties = rTableProperties.getConstArray();
- sal_Int32 nProperty = 0;
- for( ; nProperty < rTableProperties.getLength(); ++nProperty)
+ const beans::PropertyValue* pTableProperties =
+ rTableProperties.getConstArray();
+ for (sal_Int32 nProperty = 0; nProperty < rTableProperties.getLength();
+ ++nProperty)
{
try
{
- xPrSet->setPropertyValue( pTableProperties[nProperty].Name, pTableProperties[nProperty].Value );
+ xPrSet->setPropertyValue( pTableProperties[nProperty].Name,
+ pTableProperties[nProperty].Value );
}
- catch ( const uno::Exception e )
+ catch ( uno::Exception const& e )
{
#if DEBUG
std::clog << "Exception when setting property: ";
- std::clog << rtl::OUStringToOString( pTableProperties[nProperty].Name, RTL_TEXTENCODING_UTF8 ).getStr( );
+ std::clog << rtl::OUStringToOString(
+ pTableProperties[nProperty].Name, RTL_TEXTENCODING_UTF8)
+ .getStr();
std::clog << ". Message: ";
- std::clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( );
+ std::clog << rtl::OUStringToOString( e.Message,
+ RTL_TEXTENCODING_UTF8 ).getStr();
std::clog << std::endl;
#endif
}
}
//apply row properties
- uno::Reference< table::XTableRows > xRows = xRet->getRows();
- const beans::PropertyValues* pRowProperties = rRowProperties.getConstArray();
- sal_Int32 nRow = 0;
- for( ; nRow < xRows->getCount(); ++nRow)
+ const uno::Reference< table::XTableRows > xRows = xRet->getRows();
+
+ const beans::PropertyValues* pRowProperties =
+ rRowProperties.getConstArray();
+ for (sal_Int32 nRow = 0; nRow < xRows->getCount(); ++nRow)
{
if( nRow >= rRowProperties.getLength())
{
break;
}
- uno::Reference< beans::XPropertySet > xRow;
- xRows->getByIndex( nRow ) >>= xRow;
- const beans::PropertyValue* pProperties = pRowProperties[nRow].getConstArray();
- for( nProperty = 0; nProperty < pRowProperties[nRow].getLength(); ++nProperty)
- {
- if( pProperties[ nProperty ].Name.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM ( "TableColumnSeparators" )))
- {
- //add the separators to access the cell's positions for vertical merging later
- TableColumnSeparators aSeparators;
- pProperties[ nProperty ].Value >>= aSeparators;
- aRowSeparators[nRow] = aSeparators;
- }
- xRow->setPropertyValue( pProperties[ nProperty ].Name, pProperties[ nProperty ].Value );
- }
+ lcl_ApplyRowProperties(pRowProperties[nRow],
+ xRows->getByIndex(nRow), aRowSeparators[nRow]);
}
#ifdef DEBUG
-//-->debug cell properties of all rows
- {
- ::rtl::OUString sNames;
- for( sal_Int32 nDebugRow = 0; nDebugRow < rCellProperties.getLength(); ++nDebugRow)
- {
- const uno::Sequence< beans::PropertyValues > aDebugCurrentRow = rCellProperties[nDebugRow];
- sal_Int32 nDebugCells = aDebugCurrentRow.getLength();
- (void) nDebugCells;
- for( sal_Int32 nDebugCell = 0; nDebugCell < nDebugCells; ++nDebugCell)
- {
- const uno::Sequence< beans::PropertyValue >& aDebugCellProperties = aDebugCurrentRow[nDebugCell];
- sal_Int32 nDebugCellProperties = aDebugCellProperties.getLength();
- for( sal_Int32 nDebugProperty = 0; nDebugProperty < nDebugCellProperties; ++nDebugProperty)
- {
- const ::rtl::OUString sName = aDebugCellProperties[nDebugProperty].Name;
- sNames += sName;
- sNames += ::rtl::OUString('-');
- }
- sNames += ::rtl::OUString('+');
- }
- sNames += ::rtl::OUString('|');
- }
- (void)sNames;
- }
-//--<
+ lcl_DebugCellProperties(rCellProperties);
#endif
-
//apply cell properties
- for( nRow = 0; nRow < rCellProperties.getLength(); ++nRow)
+ for (sal_Int32 nRow = 0; nRow < rCellProperties.getLength(); ++nRow)
{
- const uno::Sequence< beans::PropertyValues > aCurrentRow = rCellProperties[nRow];
+ const uno::Sequence< beans::PropertyValues > aCurrentRow =
+ rCellProperties[nRow];
sal_Int32 nCells = aCurrentRow.getLength();
- for( sal_Int32 nCell = 0; nCell < nCells; ++nCell)
- {
- const uno::Sequence< beans::PropertyValue >& aCellProperties = aCurrentRow[nCell];
- sal_Int32 nCellProperties = aCellProperties.getLength();
- uno::Reference< beans::XPropertySet > xCell( pTextTable->getCellByPosition(nCell, nRow), uno::UNO_QUERY );
- for( nProperty = 0; nProperty < nCellProperties; ++nProperty)
- {
- const OUString& rName = aCellProperties[nProperty].Name;
- if( rName.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM ( "VerticalMerge")))
- {
- //determine left border position
- //add the cell to a queue of merged cells
- //
- sal_Bool bMerge = sal_False;
- aCellProperties[nProperty].Value >>= bMerge;
- sal_Int32 nLeftPos = -1;
- if( !nCell )
- nLeftPos = 0;
- else if( aRowSeparators[nRow].getLength() >= nCell )
- {
- const text::TableColumnSeparator* pSeparators = aRowSeparators[nRow].getConstArray();
- nLeftPos = pSeparators[nCell - 1].Position;
- }
- if( bMerge )
- {
- // 'close' all the cell with the same left position
- // if separate vertical merges in the same column exist
- if( aMergedCells.size() )
- {
- std::vector<VerticallyMergedCell>::iterator aMergedIter = aMergedCells.begin();
- while( aMergedIter != aMergedCells.end())
- {
- if( lcl_SimilarPosition( aMergedIter->nLeftPosition, nLeftPos) )
- {
- aMergedIter->bOpen = false;
- }
- ++aMergedIter;
- }
- }
- //add the new group of merged cells
- aMergedCells.push_back(VerticallyMergedCell(xCell, nLeftPos ));
- }
- else
- {
- //find the cell that
- DBG_ASSERT(aMergedCells.size(), "the first merged cell is missing");
- if( aMergedCells.size() )
- {
- std::vector<VerticallyMergedCell>::iterator aMergedIter = aMergedCells.begin();
-#if OSL_DEBUG_LEVEL > 1
- bool bDbgFound = false;
-#endif
- while( aMergedIter != aMergedCells.end())
- {
- if( aMergedIter->bOpen &&
- lcl_SimilarPosition( aMergedIter->nLeftPosition, nLeftPos) )
- {
- aMergedIter->aCells.push_back( xCell );
-#if OSL_DEBUG_LEVEL > 1
- bDbgFound = true;
-#endif
- }
- ++aMergedIter;
- }
-#if OSL_DEBUG_LEVEL > 1
- DBG_ASSERT( bDbgFound, "couldn't find first vertically merged cell" );
-#endif
- }
- }
- }
- else
- {
- try
- {
- xCell->setPropertyValue(rName, aCellProperties[nProperty].Value);
- }
- catch ( const uno::Exception e )
- {
- // Apply the paragraph and char properties to the cell's content
- uno::Reference< text::XText > xCellText( xCell, uno::UNO_QUERY );
- uno::Reference< text::XTextCursor > xCellCurs = xCellText->createTextCursor( );
- xCellCurs->gotoStart( false );
- xCellCurs->gotoEnd( true );
-
- uno::Reference< beans::XPropertySet > xCellTextProps( xCellCurs, uno::UNO_QUERY );
- xCellTextProps->setPropertyValue( rName, aCellProperties[nProperty].Value );
- }
- }
- }
- }
- }
- //now that the cell properties are set the vertical merge values have to be applied
- if( aMergedCells.size() )
- {
- std::vector<VerticallyMergedCell>::iterator aMergedIter = aMergedCells.begin();
- while( aMergedIter != aMergedCells.end())
+ for (sal_Int32 nCell = 0; nCell < nCells; ++nCell)
{
- sal_Int32 nCellCount = (sal_Int32)aMergedIter->aCells.size();
- std::vector<uno::Reference< beans::XPropertySet > >::iterator aCellIter = aMergedIter->aCells.begin();
- bool bFirstCell = true;
- //the first of the cells get's the number of cells set as RowSpan
- //the others get the inverted number of remaining merged cells (3,-2,-1)
- while( aCellIter != aMergedIter->aCells.end() )
- {
- (*aCellIter)->setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_ROW_SPAN)), uno::makeAny( nCellCount ));
- if( bFirstCell )
- {
- nCellCount *= -1;
- bFirstCell = false;
- }
- ++nCellCount;
- ++aCellIter;
- }
- ++aMergedIter;
+ lcl_ApplyCellProperties(nCell,
+ aRowSeparators[nRow], aCurrentRow[nCell],
+ pTextTable->getCellByPosition(nCell, nRow),
+ aMergedCells);
}
}
+ // now that the cell properties are set the vertical merge values
+ // have to be applied
+ lcl_MergeCells(aMergedCells);
}
catch( const lang::WrappedTargetException& rWrapped )
{
@@ -2154,37 +2345,14 @@ uno::Reference< text::XTextTable > SwXText::convertToTable(
(void)rBounds;
}
-
- bool bIllegalException = false;
- bool bRuntimeException = false;
- ::rtl::OUString sMessage;
- pDoc->StartUndo(UNDO_START, NULL);
- pDoc->EndUndo(UNDO_START, NULL);
- if( bIllegalException || bRuntimeException )
- {
- SwUndoIter aUndoIter( pFirstPaM.get(), UNDO_EMPTY );
- pDoc->Undo(aUndoIter);
- if(bIllegalException)
- {
- lang::IllegalArgumentException aEx;
- aEx.Message = sMessage;
- throw aEx;
- }
- else //if(bRuntimeException)
- {
- uno::RuntimeException aEx;
- aEx.Message = sMessage;
- throw aEx;
- }
- }
return xRet;
}
/******************************************************************
* SwXBodyText
******************************************************************/
-SwXBodyText::SwXBodyText(SwDoc* _pDoc) :
- SwXText(_pDoc, CURSOR_BODY)
+SwXBodyText::SwXBodyText(SwDoc *const pDoc)
+ : SwXText(pDoc, CURSOR_BODY)
{
}
@@ -2198,82 +2366,81 @@ SwXBodyText::~SwXBodyText()
/* -----------------------------06.04.00 16:33--------------------------------
---------------------------------------------------------------------------*/
-OUString SwXBodyText::getImplementationName(void) throw( uno::RuntimeException )
+OUString SAL_CALL
+SwXBodyText::getImplementationName() throw (uno::RuntimeException)
{
return C2U("SwXBodyText");
}
/* -----------------------------06.04.00 16:33--------------------------------
---------------------------------------------------------------------------*/
-BOOL SwXBodyText::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+static char const*const g_ServicesBodyText[] =
{
- return C2U("com.sun.star.text.Text") == rServiceName;
+ "com.sun.star.text.Text",
+};
+static const size_t g_nServicesBodyText(
+ sizeof(g_ServicesBodyText)/sizeof(g_ServicesBodyText[0]));
+
+sal_Bool SAL_CALL SwXBodyText::supportsService(const OUString& rServiceName)
+throw (uno::RuntimeException)
+{
+ return ::sw::SupportsServiceImpl(
+ g_nServicesBodyText, g_ServicesBodyText, rServiceName);
}
-/* -----------------------------06.04.00 16:33--------------------------------
- ---------------------------------------------------------------------------*/
-uno::Sequence< OUString > SwXBodyText::getSupportedServiceNames(void) throw( uno::RuntimeException )
+uno::Sequence< OUString > SAL_CALL
+SwXBodyText::getSupportedServiceNames() throw (uno::RuntimeException)
{
- uno::Sequence< OUString > aRet(1);
- OUString* pArray = aRet.getArray();
- pArray[0] = C2U("com.sun.star.text.Text");
- return aRet;
+ return ::sw::GetSupportedServiceNamesImpl(
+ g_nServicesBodyText, g_ServicesBodyText);
}
+
/*-- 10.12.98 11:17:27---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Any SwXBodyText::queryAggregation(
- const uno::Type& rType )
- throw(uno::RuntimeException)
+uno::Any SAL_CALL
+SwXBodyText::queryAggregation(const uno::Type& rType)
+throw (uno::RuntimeException)
{
uno::Any aRet;
- const uno::Type& rXEnumerationAccessType = ::getCppuType((uno::Reference< container::XEnumerationAccess >*)0);
- const uno::Type& rXElementAccessType = ::getCppuType((uno::Reference< container::XElementAccess >*)0);
- const uno::Type& rXServiceInfoType = ::getCppuType((uno::Reference< lang::XServiceInfo >*)0);
-
- if(rType == rXEnumerationAccessType)
+ if (rType == container::XEnumerationAccess::static_type())
{
- uno::Reference<container::XEnumerationAccess> xRet = this;
- aRet.setValue(&xRet, rXEnumerationAccessType);
+ aRet <<= uno::Reference< container::XEnumerationAccess >(this);
}
- else if(rType == rXElementAccessType)
+ else if (rType == container::XElementAccess::static_type())
{
- uno::Reference<container::XElementAccess> xRet = this;
- aRet.setValue(&xRet, rXElementAccessType);
+ aRet <<= uno::Reference< container::XElementAccess >(this);
}
- else if(rType == rXServiceInfoType)
+ else if (rType == lang::XServiceInfo::static_type())
{
- uno::Reference<lang::XServiceInfo> xRet = this;
- aRet.setValue(&xRet, rXServiceInfoType);
+ aRet <<= uno::Reference< lang::XServiceInfo >(this);
}
else
{
aRet = SwXText::queryInterface( rType );
}
if(aRet.getValueType() == ::getCppuVoidType())
+ {
aRet = OWeakAggObject::queryAggregation( rType );
+ }
return aRet;
}
/*-- 10.12.98 11:17:28---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Sequence< uno::Type > SwXBodyText::getTypes( ) throw(uno::RuntimeException)
-{
- uno::Sequence< uno::Type > aTypes = SwXBodyTextBaseClass::getTypes();
- uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
- long nIndex = aTypes.getLength();
- aTypes.realloc(aTypes.getLength() + aTextTypes.getLength());
- uno::Type* pTypes = aTypes.getArray();
- const uno::Type* pTextTypes = aTextTypes.getConstArray();
- for(int i = 0; i < aTextTypes.getLength(); i++)
- pTypes[nIndex++] = pTextTypes[i];
- return aTypes;
+uno::Sequence< uno::Type > SAL_CALL
+SwXBodyText::getTypes() throw (uno::RuntimeException)
+{
+ const uno::Sequence< uno::Type > aTypes = SwXBodyText_Base::getTypes();
+ const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
+ return ::comphelper::concatSequences(aTypes, aTextTypes);
}
/* -----------------------------21.03.00 15:39--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< sal_Int8 > SwXBodyText::getImplementationId( ) throw(uno::RuntimeException)
+uno::Sequence< sal_Int8 > SAL_CALL
+SwXBodyText::getImplementationId() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
static uno::Sequence< sal_Int8 > aId( 16 );
@@ -2289,74 +2456,83 @@ uno::Sequence< sal_Int8 > SwXBodyText::getImplementationId( ) throw(uno::Runtim
-----------------------------------------------------------------------*/
uno::Any SAL_CALL
- SwXBodyText::queryInterface( const uno::Type& rType )
- throw(uno::RuntimeException)
+SwXBodyText::queryInterface(const uno::Type& rType)
+throw (uno::RuntimeException)
{
- uno::Any aRet = SwXText::queryInterface( rType );
- if(aRet.getValueType() == ::getCppuVoidType())
- aRet = SwXBodyTextBaseClass::queryInterface( rType );
- return aRet;
+ const uno::Any ret = SwXText::queryInterface(rType);
+ return (ret.getValueType() == ::getCppuVoidType())
+ ? SwXBodyText_Base::queryInterface(rType)
+ : ret;
}
/* -----------------------------05.01.00 11:07--------------------------------
---------------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXBodyText::CreateTextCursor(sal_Bool bIgnoreTables)
+SwXTextCursor * SwXBodyText::CreateTextCursor(const bool bIgnoreTables)
{
- uno::Reference< text::XTextCursor > xRet;
- if(IsValid())
+ if(!IsValid())
{
- SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
- //the cursor has to skip tables contained in this text
- SwPaM aPam(rNode);
- aPam.Move( fnMoveBackward, fnGoDoc );
- if(!bIgnoreTables)
+ return 0;
+ }
+
+ // the cursor has to skip tables contained in this text
+ SwPaM aPam(GetDoc()->GetNodes().GetEndOfContent());
+ aPam.Move( fnMoveBackward, fnGoDoc );
+ if (!bIgnoreTables)
+ {
+ SwTableNode * pTblNode = aPam.GetNode()->FindTableNode();
+ SwCntntNode * pCont = 0;
+ while (pTblNode)
{
- SwTableNode* pTblNode = aPam.GetNode()->FindTableNode();
- SwCntntNode* pCont = 0;
- while( pTblNode )
- {
- aPam.GetPoint()->nNode = *pTblNode->EndOfSectionNode();
- pCont = GetDoc()->GetNodes().GoNext(&aPam.GetPoint()->nNode);
- pTblNode = pCont->FindTableNode();
- }
- if(pCont)
- aPam.GetPoint()->nContent.Assign(pCont, 0);
+ aPam.GetPoint()->nNode = *pTblNode->EndOfSectionNode();
+ pCont = GetDoc()->GetNodes().GoNext(&aPam.GetPoint()->nNode);
+ pTblNode = pCont->FindTableNode();
+ }
+ if (pCont)
+ {
+ aPam.GetPoint()->nContent.Assign(pCont, 0);
}
- xRet = (text::XWordCursor*)new SwXTextCursor(this, *aPam.GetPoint(), CURSOR_BODY, GetDoc());
}
- return xRet;
+ return new SwXTextCursor(*GetDoc(), this, CURSOR_BODY, *aPam.GetPoint());
}
+
/*-- 10.12.98 11:17:29---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXBodyText::createTextCursor(void) throw( uno::RuntimeException )
+uno::Reference< text::XTextCursor > SAL_CALL
+SwXBodyText::createTextCursor() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > aRef = CreateTextCursor(sal_False);
- if(!aRef.is())
+
+ const uno::Reference< text::XTextCursor > xRef(
+ static_cast<text::XWordCursor*>(CreateTextCursor(false)) );
+ if (!xRef.is())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
- return aRef;
+ return xRef;
}
/*-- 10.12.98 11:17:29---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXBodyText::createTextCursorByRange(
- const uno::Reference< text::XTextRange > & aTextPosition) throw( uno::RuntimeException )
+uno::Reference< text::XTextCursor > SAL_CALL
+SwXBodyText::createTextCursorByRange(
+ const uno::Reference< text::XTextRange > & xTextPosition)
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > aRef;
+
if(!IsValid())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
+
+ uno::Reference< text::XTextCursor > aRef;
SwUnoInternalPaM aPam(*GetDoc());
- if(SwXTextRange::XTextRangeToSwPaM(aPam, aTextPosition))
+ if (::sw::XTextRangeToSwPaM(aPam, xTextPosition))
{
SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
@@ -2366,152 +2542,232 @@ uno::Reference< text::XTextCursor > SwXBodyText::createTextCursorByRange(
{
p1 = p1->StartOfSectionNode();
}
- SwStartNode* p2 = rNode.StartOfSectionNode();
+ SwStartNode *const p2 = rNode.StartOfSectionNode();
if(p1 == p2)
- aRef = (text::XWordCursor*)new SwXTextCursor(this , *aPam.GetPoint(), CURSOR_BODY, GetDoc(), aPam.GetMark());
+ {
+ aRef = static_cast<text::XWordCursor*>(
+ new SwXTextCursor(*GetDoc(), this, CURSOR_BODY,
+ *aPam.GetPoint(), aPam.GetMark()));
+ }
}
if(!aRef.is())
+ {
throw uno::RuntimeException();
+ }
return aRef;
}
+
/*-- 10.12.98 11:17:30---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< container::XEnumeration > SwXBodyText::createEnumeration(void)
- throw( uno::RuntimeException )
+uno::Reference< container::XEnumeration > SAL_CALL
+SwXBodyText::createEnumeration()
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< container::XEnumeration > aRef;
- if(IsValid())
- {
- SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
- SwPosition aPos(rNode);
- SwUnoCrsr* pUnoCrsr = GetDoc()->CreateUnoCrsr(aPos, sal_False);
- pUnoCrsr->Move( fnMoveBackward, fnGoDoc );
- aRef = new SwXParagraphEnumeration(this, pUnoCrsr, CURSOR_BODY);
- }
- else
+
+ if (!IsValid())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
- return aRef;
+ SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
+ SwPosition aPos(rNode);
+ ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
+ GetDoc()->CreateUnoCrsr(aPos, sal_False));
+ pUnoCursor->Move(fnMoveBackward, fnGoDoc);
+ const uno::Reference< container::XEnumeration > xRet
+ = new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_BODY);
+ return xRet;
}
+
/* -----------------18.12.98 13:36-------------------
*
* --------------------------------------------------*/
-uno::Type SwXBodyText::getElementType(void) throw( uno::RuntimeException )
+uno::Type SAL_CALL
+SwXBodyText::getElementType() throw (uno::RuntimeException)
{
- return ::getCppuType((uno::Reference<text::XTextRange>*)0);
+ return text::XTextRange::static_type();
}
/* -----------------18.12.98 13:36-------------------
*
* --------------------------------------------------*/
-sal_Bool SwXBodyText::hasElements(void) throw( uno::RuntimeException )
+sal_Bool SAL_CALL
+SwXBodyText::hasElements() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(IsValid())
- return sal_True;
- else
+
+ if (!IsValid())
{
uno::RuntimeException aRuntime;
aRuntime.Message = C2U(cInvalidObject);
throw aRuntime;
}
+
+ return sal_True;
}
+
/******************************************************************
* SwXHeadFootText
******************************************************************/
-TYPEINIT1(SwXHeadFootText, SwClient);
-/* -----------------------------06.04.00 16:40--------------------------------
- ---------------------------------------------------------------------------*/
-OUString SwXHeadFootText::getImplementationName(void) throw( uno::RuntimeException )
+class SwXHeadFootText::Impl
+ : public SwClient
{
- return C2U("SwXHeadFootText");
+
+public:
+
+ bool m_bIsHeader;
+
+ Impl( SwXHeadFootText & /*rThis*/,
+ SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
+ : SwClient(& rHeadFootFmt)
+ , m_bIsHeader(bIsHeader)
+ {
+ }
+
+ SwFrmFmt * GetHeadFootFmt() const {
+ return static_cast<SwFrmFmt*>(
+ const_cast<SwModify*>(GetRegisteredIn()));
+ }
+
+ SwFrmFmt & GetHeadFootFmtOrThrow() {
+ SwFrmFmt *const pFmt( GetHeadFootFmt() );
+ if (!pFmt) {
+ throw uno::RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM(
+ "SwXHeadFootText: disposed or invalid")), 0);
+ }
+ return *pFmt;
+ }
+
+ // SwClient
+ virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew);
+
+};
+
+/*-- 11.12.98 10:14:51---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXHeadFootText::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
}
-/* -----------------------------06.04.00 16:40--------------------------------
- ---------------------------------------------------------------------------*/
-BOOL SwXHeadFootText::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+bool SwXHeadFootText::IsXHeadFootText(SwClient *const pClient)
{
- return C2U("com.sun.star.text.Text") == rServiceName;
+ return 0 != dynamic_cast<SwXHeadFootText::Impl*>(pClient);
}
-/* -----------------------------06.04.00 16:40--------------------------------
- ---------------------------------------------------------------------------*/
-uno::Sequence< OUString > SwXHeadFootText::getSupportedServiceNames(void) throw( uno::RuntimeException )
+uno::Reference< text::XText >
+SwXHeadFootText::CreateXHeadFootText(
+ SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
{
- uno::Sequence< OUString > aRet(1);
- OUString* pArray = aRet.getArray();
- pArray[0] = C2U("com.sun.star.text.Text");
- return aRet;
+ // re-use existing SwXHeadFootText
+ // #i105557#: do not iterate over the registered clients: race condition
+ uno::Reference< text::XText > xText(rHeadFootFmt.GetXObject(),
+ uno::UNO_QUERY);
+ if (!xText.is())
+ {
+ SwXHeadFootText *const pXHFT(
+ new SwXHeadFootText(rHeadFootFmt, bIsHeader));
+ xText.set(pXHFT);
+ rHeadFootFmt.SetXObject(xText);
+ }
+ return xText;
}
+
/*-- 11.12.98 10:14:48---------------------------------------------------
-----------------------------------------------------------------------*/
-SwXHeadFootText::SwXHeadFootText(SwFrmFmt& rHeadFootFmt, BOOL bHeader) :
- SwXText(rHeadFootFmt.GetDoc(), bHeader ? CURSOR_HEADER : CURSOR_FOOTER),
- SwClient(&rHeadFootFmt),
- bIsHeader(bHeader)
+SwXHeadFootText::SwXHeadFootText(SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
+ : SwXText(rHeadFootFmt.GetDoc(),
+ (bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER)
+ , m_pImpl( new SwXHeadFootText::Impl(*this, rHeadFootFmt, bIsHeader) )
{
-
}
+
/*-- 11.12.98 10:14:48---------------------------------------------------
-----------------------------------------------------------------------*/
SwXHeadFootText::~SwXHeadFootText()
{
+}
+
+/* -----------------------------06.04.00 16:40--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SAL_CALL
+SwXHeadFootText::getImplementationName() throw (uno::RuntimeException)
+{
+ return C2U("SwXHeadFootText");
+}
+
+/* -----------------------------06.04.00 16:40--------------------------------
+
+ ---------------------------------------------------------------------------*/
+static char const*const g_ServicesHeadFootText[] =
+{
+ "com.sun.star.text.Text",
+};
+static const size_t g_nServicesHeadFootText(
+ sizeof(g_ServicesHeadFootText)/sizeof(g_ServicesHeadFootText[0]));
+sal_Bool SAL_CALL SwXHeadFootText::supportsService(const OUString& rServiceName)
+throw (uno::RuntimeException)
+{
+ return ::sw::SupportsServiceImpl(
+ g_nServicesHeadFootText, g_ServicesHeadFootText, rServiceName);
}
+
+uno::Sequence< OUString > SAL_CALL
+SwXHeadFootText::getSupportedServiceNames() throw (uno::RuntimeException)
+{
+ return ::sw::GetSupportedServiceNamesImpl(
+ g_nServicesHeadFootText, g_ServicesHeadFootText);
+}
+
/*-- 11.12.98 10:14:49---------------------------------------------------
-----------------------------------------------------------------------*/
const SwStartNode *SwXHeadFootText::GetStartNode() const
{
const SwStartNode *pSttNd = 0;
- SwFrmFmt* pHeadFootFmt = GetFmt();
+ SwFrmFmt *const pHeadFootFmt = m_pImpl->GetHeadFootFmt();
if(pHeadFootFmt)
{
const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
if( rFlyCntnt.GetCntntIdx() )
+ {
pSttNd = rFlyCntnt.GetCntntIdx()->GetNode().GetStartNode();
+ }
}
return pSttNd;
}
-uno::Reference< text::XTextCursor > SwXHeadFootText::createCursor() throw(uno::RuntimeException)
+uno::Reference< text::XTextCursor >
+SwXHeadFootText::CreateCursor() throw (uno::RuntimeException)
{
return createTextCursor();
}
/* -----------------------------21.03.00 15:39--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< uno::Type > SwXHeadFootText::getTypes( ) throw(uno::RuntimeException)
+uno::Sequence< uno::Type > SAL_CALL
+SwXHeadFootText::getTypes() throw (uno::RuntimeException)
{
- uno::Sequence< uno::Type > aHFTypes = SwXHeadFootTextBaseClass::getTypes();
- uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
-
- long nIndex = aHFTypes.getLength();
- aHFTypes.realloc(
- aHFTypes.getLength() +
- aTextTypes.getLength());
-
- uno::Type* pHFTypes = aHFTypes.getArray();
- const uno::Type* pTextTypes = aTextTypes.getConstArray();
- for(long nPos = 0; nPos < aTextTypes.getLength(); nPos++)
- pHFTypes[nIndex++] = pTextTypes[nPos];
-
- return aHFTypes;
+ const uno::Sequence< uno::Type > aTypes = SwXHeadFootText_Base::getTypes();
+ const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
+ return ::comphelper::concatSequences(aTypes, aTextTypes);
}
/* -----------------------------21.03.00 15:39--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< sal_Int8 > SwXHeadFootText::getImplementationId( ) throw(uno::RuntimeException)
+uno::Sequence< sal_Int8 > SAL_CALL
+SwXHeadFootText::getImplementationId() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
static uno::Sequence< sal_Int8 > aId( 16 );
@@ -2526,140 +2782,141 @@ uno::Sequence< sal_Int8 > SwXHeadFootText::getImplementationId( ) throw(uno::Ru
/* -----------------------------21.03.00 15:46--------------------------------
---------------------------------------------------------------------------*/
-uno::Any SwXHeadFootText::queryInterface( const uno::Type& aType ) throw(uno::RuntimeException)
+uno::Any SAL_CALL
+SwXHeadFootText::queryInterface(const uno::Type& rType)
+throw (uno::RuntimeException)
{
- uno::Any aRet = SwXHeadFootTextBaseClass::queryInterface(aType);
- if(aRet.getValueType() == ::getCppuVoidType() )
- aRet = SwXText::queryInterface(aType);
- return aRet;
+ const uno::Any ret = SwXHeadFootText_Base::queryInterface(rType);
+ return (ret.getValueType() == ::getCppuVoidType())
+ ? SwXText::queryInterface(rType)
+ : ret;
}
/*-- 11.12.98 10:14:50---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXHeadFootText::createTextCursor(void) throw( uno::RuntimeException )
+uno::Reference< text::XTextCursor > SAL_CALL
+SwXHeadFootText::createTextCursor() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRet;
- SwFrmFmt* pHeadFootFmt = GetFmt();
- if(pHeadFootFmt)
- {
- const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
- const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
- SwPosition aPos(rNode);
- SwXTextCursor* pCrsr = new SwXTextCursor(this, aPos, bIsHeader ? CURSOR_HEADER : CURSOR_FOOTER, GetDoc());
- SwUnoCrsr* pUnoCrsr = pCrsr->GetCrsr();
- pUnoCrsr->Move(fnMoveForward, fnGoNode);
-
- //save current start node to be able to check if there is content after the table -
- //otherwise the cursor would be in the body text!
-
- const SwStartNode* pOwnStartNode = rNode.FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- //steht hier eine Tabelle?
- SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode();
- SwCntntNode* pCont = 0;
- while( pTblNode )
- {
- pUnoCrsr->GetPoint()->nNode = *pTblNode->EndOfSectionNode();
- pCont = GetDoc()->GetNodes().GoNext(&pUnoCrsr->GetPoint()->nNode);
- pTblNode = pCont->FindTableNode();
- }
- if(pCont)
- pUnoCrsr->GetPoint()->nContent.Assign(pCont, 0);
- const SwStartNode* pNewStartNode = pUnoCrsr->GetNode()->FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- if(!pNewStartNode || pNewStartNode != pOwnStartNode)
- {
- pCrsr = NULL;
- uno::RuntimeException aExcept;
- aExcept.Message = S2U("no text available");
- throw aExcept;
- }
- xRet = (text::XWordCursor*)pCrsr;
- }
- else
- {
- uno::RuntimeException aRuntime;
- aRuntime.Message = C2U(cInvalidObject);
- throw aRuntime;
+
+ SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
+
+ uno::Reference< text::XTextCursor > xRet;
+ const SwFmtCntnt& rFlyCntnt = rHeadFootFmt.GetCntnt();
+ const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
+ SwPosition aPos(rNode);
+ SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this,
+ (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER, aPos);
+ SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
+ pUnoCrsr->Move(fnMoveForward, fnGoNode);
+
+ // save current start node to be able to check if there is content
+ // after the table - otherwise the cursor would be in the body text!
+ SwStartNode const*const pOwnStartNode = rNode.FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ // is there a table here?
+ SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode();
+ SwCntntNode* pCont = 0;
+ while (pTblNode)
+ {
+ pUnoCrsr->GetPoint()->nNode = *pTblNode->EndOfSectionNode();
+ pCont = GetDoc()->GetNodes().GoNext(&pUnoCrsr->GetPoint()->nNode);
+ pTblNode = pCont->FindTableNode();
+ }
+ if (pCont)
+ {
+ pUnoCrsr->GetPoint()->nContent.Assign(pCont, 0);
+ }
+ SwStartNode const*const pNewStartNode =
+ pUnoCrsr->GetNode()->FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ if (!pNewStartNode || (pNewStartNode != pOwnStartNode))
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = S2U("no text available");
+ throw aExcept;
}
+ xRet = static_cast<text::XWordCursor*>(pXCursor);
return xRet;
}
+
/*-- 11.12.98 10:14:50---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXHeadFootText::createTextCursorByRange(
- const uno::Reference< text::XTextRange > & aTextPosition) throw( uno::RuntimeException )
+uno::Reference< text::XTextCursor > SAL_CALL
+SwXHeadFootText::createTextCursorByRange(
+ const uno::Reference< text::XTextRange > & xTextPosition)
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRet;
- SwFrmFmt* pHeadFootFmt = GetFmt();
+
+ SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
+
SwUnoInternalPaM aPam(*GetDoc());
- if(pHeadFootFmt && SwXTextRange::XTextRangeToSwPaM(aPam, aTextPosition))
+ if (!::sw::XTextRangeToSwPaM(aPam, xTextPosition))
{
- SwNode& rNode = pHeadFootFmt->GetCntnt().GetCntntIdx()->GetNode();
- SwPosition aPos(rNode);
- SwPaM aHFPam(aPos);
- aHFPam.Move(fnMoveForward, fnGoNode);
- SwStartNode* pOwnStartNode = aHFPam.GetNode()->FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- SwStartNode* p1 = aPam.GetNode()->FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- if(p1 == pOwnStartNode)
- xRet = (text::XWordCursor*)new SwXTextCursor(this, *aPam.GetPoint(),
- bIsHeader ? CURSOR_HEADER : CURSOR_FOOTER, GetDoc(), aPam.GetMark());
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U(cInvalidObject);
+ throw aRuntime;
+ }
+
+ uno::Reference< text::XTextCursor > xRet;
+ SwNode& rNode = rHeadFootFmt.GetCntnt().GetCntntIdx()->GetNode();
+ SwPosition aPos(rNode);
+ SwPaM aHFPam(aPos);
+ aHFPam.Move(fnMoveForward, fnGoNode);
+ SwStartNode *const pOwnStartNode = aHFPam.GetNode()->FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ SwStartNode *const p1 = aPam.GetNode()->FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ if (p1 == pOwnStartNode)
+ {
+ xRet = static_cast<text::XWordCursor*>(
+ new SwXTextCursor(*GetDoc(), this,
+ (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER,
+ *aPam.GetPoint(), aPam.GetMark()));
}
return xRet;
}
+
/* -----------------19.03.99 15:44-------------------
*
* --------------------------------------------------*/
-uno::Reference< container::XEnumeration > SwXHeadFootText::createEnumeration(void)
- throw( uno::RuntimeException )
+uno::Reference< container::XEnumeration > SAL_CALL
+SwXHeadFootText::createEnumeration()
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
+ SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
+
uno::Reference< container::XEnumeration > aRef;
- //wenn this ungueltig ist, dann kommt die uno::Exception aus createTextCursor()
- SwFrmFmt* pHeadFootFmt = GetFmt();
- if(pHeadFootFmt)
- {
- const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
- const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
- SwPosition aPos(rNode);
- SwUnoCrsr* pUnoCrsr = GetDoc()->CreateUnoCrsr(aPos, sal_False);
- pUnoCrsr->Move(fnMoveForward, fnGoNode);
- aRef = new SwXParagraphEnumeration(this, pUnoCrsr, bIsHeader ? CURSOR_HEADER : CURSOR_FOOTER);
- }
- else
- {
- uno::RuntimeException aRuntime;
- aRuntime.Message = C2U(cInvalidObject);
- throw aRuntime;
- }
+ const SwFmtCntnt& rFlyCntnt = rHeadFootFmt.GetCntnt();
+ const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
+ SwPosition aPos(rNode);
+ ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
+ GetDoc()->CreateUnoCrsr(aPos, sal_False));
+ pUnoCursor->Move(fnMoveForward, fnGoNode);
+ aRef = new SwXParagraphEnumeration(this, pUnoCursor,
+ (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER);
return aRef;
}
+
/* -----------------19.03.99 15:50-------------------
*
* --------------------------------------------------*/
-uno::Type SwXHeadFootText::getElementType(void) throw( uno::RuntimeException )
+uno::Type SAL_CALL
+SwXHeadFootText::getElementType() throw (uno::RuntimeException)
{
- return ::getCppuType((uno::Reference<text::XTextRange>*)0);
+ return text::XTextRange::static_type();
}
/* -----------------19.03.99 15:50-------------------
*
* --------------------------------------------------*/
-sal_Bool SwXHeadFootText::hasElements(void) throw( uno::RuntimeException )
+sal_Bool SAL_CALL SwXHeadFootText::hasElements() throw (uno::RuntimeException)
{
return sal_True;
}
-/*-- 11.12.98 10:14:51---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-void SwXHeadFootText::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
-{
- ClientModify( this, pOld, pNew);
-}
-