xref: /trunk/main/sw/source/core/unocore/unotext.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <stdlib.h>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <memory>
30cdf0e10cSrcweir #include <iostream>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
33cdf0e10cSrcweir #include <com/sun/star/text/ControlCharacter.hpp>
34cdf0e10cSrcweir #include <com/sun/star/text/TableColumnSeparator.hpp>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <rtl/uuid.h>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #include <vos/mutex.hxx>
39cdf0e10cSrcweir #include <vcl/svapp.hxx>
40cdf0e10cSrcweir #include <comphelper/sequence.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <cmdid.h>
43cdf0e10cSrcweir #include <unotextbodyhf.hxx>
44cdf0e10cSrcweir #include <unotext.hxx>
45cdf0e10cSrcweir #include <unotextrange.hxx>
46cdf0e10cSrcweir #include <unotextcursor.hxx>
47cdf0e10cSrcweir #include <unosection.hxx>
48cdf0e10cSrcweir #include <unobookmark.hxx>
49cdf0e10cSrcweir #include <unorefmark.hxx>
50cdf0e10cSrcweir #include <unoport.hxx>
51cdf0e10cSrcweir #include <unotbl.hxx>
52cdf0e10cSrcweir #include <unoidx.hxx>
53cdf0e10cSrcweir #include <unoframe.hxx>
54cdf0e10cSrcweir #include <unofield.hxx>
55cdf0e10cSrcweir #include <unometa.hxx>
56cdf0e10cSrcweir #include <unodraw.hxx>
57cdf0e10cSrcweir #include <unoredline.hxx>
58cdf0e10cSrcweir #include <unomap.hxx>
59cdf0e10cSrcweir #include <unoprnms.hxx>
60cdf0e10cSrcweir #include <unoparagraph.hxx>
61cdf0e10cSrcweir #include <unocrsrhelper.hxx>
62cdf0e10cSrcweir #include <docsh.hxx>
63cdf0e10cSrcweir #include <docary.hxx>
64cdf0e10cSrcweir #include <doc.hxx>
65cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
66cdf0e10cSrcweir #include <redline.hxx>
67cdf0e10cSrcweir #include <swundo.hxx>
68cdf0e10cSrcweir #include <section.hxx>
69cdf0e10cSrcweir #include <IMark.hxx>
70cdf0e10cSrcweir #include <fmtanchr.hxx>
71cdf0e10cSrcweir #include <fmtcntnt.hxx>
72cdf0e10cSrcweir #include <crsskip.hxx>
73cdf0e10cSrcweir #include <ndtxt.hxx>
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 
76cdf0e10cSrcweir using namespace ::com::sun::star;
77cdf0e10cSrcweir using ::rtl::OUString;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir 
80cdf0e10cSrcweir const sal_Char cInvalidObject[] = "this object is invalid";
81cdf0e10cSrcweir 
82cdf0e10cSrcweir /******************************************************************
83cdf0e10cSrcweir  * SwXText
84cdf0e10cSrcweir  ******************************************************************/
85cdf0e10cSrcweir 
86cdf0e10cSrcweir class SwXText::Impl
87cdf0e10cSrcweir {
88cdf0e10cSrcweir 
89cdf0e10cSrcweir public:
90cdf0e10cSrcweir     SwXText &                   m_rThis;
91cdf0e10cSrcweir     SfxItemPropertySet const&   m_rPropSet;
92cdf0e10cSrcweir     const enum CursorType       m_eType;
93cdf0e10cSrcweir     SwDoc *                     m_pDoc;
94cdf0e10cSrcweir     bool                        m_bIsValid;
95cdf0e10cSrcweir 
Impl(SwXText & rThis,SwDoc * const pDoc,const enum CursorType eType)96cdf0e10cSrcweir     Impl(   SwXText & rThis,
97cdf0e10cSrcweir             SwDoc *const pDoc, const enum CursorType eType)
98cdf0e10cSrcweir         : m_rThis(rThis)
99cdf0e10cSrcweir         , m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT))
100cdf0e10cSrcweir         , m_eType(eType)
101cdf0e10cSrcweir         , m_pDoc(pDoc)
102cdf0e10cSrcweir         , m_bIsValid(0 != pDoc)
103cdf0e10cSrcweir     {
104cdf0e10cSrcweir     }
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     uno::Reference< text::XTextRange >
107cdf0e10cSrcweir         finishOrAppendParagraph(
108cdf0e10cSrcweir             const bool bFinish,
109cdf0e10cSrcweir             const uno::Sequence< beans::PropertyValue >&
110cdf0e10cSrcweir                 rCharacterAndParagraphProperties)
111cdf0e10cSrcweir         throw (lang::IllegalArgumentException, uno::RuntimeException);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     sal_Int16 ComparePositions(
114cdf0e10cSrcweir             const uno::Reference<text::XTextRange>& xPos1,
115cdf0e10cSrcweir             const uno::Reference<text::XTextRange>& xPos2)
116cdf0e10cSrcweir         throw (lang::IllegalArgumentException, uno::RuntimeException);
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     bool CheckForOwnMember(const SwPaM & rPaM)
119cdf0e10cSrcweir         throw (lang::IllegalArgumentException, uno::RuntimeException);
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     void ConvertCell(
122cdf0e10cSrcweir             const bool bFirstCell,
123cdf0e10cSrcweir             const uno::Sequence< uno::Reference< text::XTextRange > > & rCell,
124cdf0e10cSrcweir             ::std::vector<SwNodeRange> & rRowNodes,
125cdf0e10cSrcweir             ::std::auto_ptr< SwPaM > & rpFirstPaM,
126cdf0e10cSrcweir             SwPaM & rLastPaM,
127cdf0e10cSrcweir             bool & rbExcept);
128cdf0e10cSrcweir 
129cdf0e10cSrcweir };
130cdf0e10cSrcweir 
131cdf0e10cSrcweir /* -----------------------------15.03.2002 12:39------------------------------
132cdf0e10cSrcweir 
133cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SwXText(SwDoc * const pDoc,const enum CursorType eType)134cdf0e10cSrcweir SwXText::SwXText(SwDoc *const pDoc, const enum CursorType eType)
135cdf0e10cSrcweir     : m_pImpl( new SwXText::Impl(*this, pDoc, eType) )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir }
138cdf0e10cSrcweir /*-- 09.12.98 12:43:55---------------------------------------------------
139cdf0e10cSrcweir 
140cdf0e10cSrcweir   -----------------------------------------------------------------------*/
~SwXText()141cdf0e10cSrcweir SwXText::~SwXText()
142cdf0e10cSrcweir {
143cdf0e10cSrcweir }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir /*-- 09.12.98 12:44:07---------------------------------------------------
146cdf0e10cSrcweir 
147cdf0e10cSrcweir   -----------------------------------------------------------------------*/
148cdf0e10cSrcweir 
GetDoc() const149cdf0e10cSrcweir const SwDoc * SwXText::GetDoc() const
150cdf0e10cSrcweir {
151cdf0e10cSrcweir     return m_pImpl->m_pDoc;
152cdf0e10cSrcweir }
GetDoc()153cdf0e10cSrcweir       SwDoc * SwXText::GetDoc()
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     return m_pImpl->m_pDoc;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
IsValid() const158cdf0e10cSrcweir bool SwXText::IsValid() const
159cdf0e10cSrcweir {
160cdf0e10cSrcweir     return m_pImpl->m_bIsValid;
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
Invalidate()163cdf0e10cSrcweir void SwXText::Invalidate()
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     m_pImpl->m_bIsValid = false;
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
SetDoc(SwDoc * const pDoc)168cdf0e10cSrcweir void SwXText::SetDoc(SwDoc *const pDoc)
169cdf0e10cSrcweir {
170cdf0e10cSrcweir     OSL_ENSURE(!m_pImpl->m_pDoc || !pDoc,
171cdf0e10cSrcweir         "SwXText::SetDoc: already have a doc?");
172cdf0e10cSrcweir     m_pImpl->m_pDoc = pDoc;
173cdf0e10cSrcweir     m_pImpl->m_bIsValid = (0 != pDoc);
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir void
PrepareForAttach(uno::Reference<text::XTextRange> &,const SwPaM &)177cdf0e10cSrcweir SwXText::PrepareForAttach(uno::Reference< text::XTextRange > &, const SwPaM &)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
CheckForOwnMemberMeta(const SwPaM &,const bool)181cdf0e10cSrcweir bool SwXText::CheckForOwnMemberMeta(const SwPaM &, const bool)
182cdf0e10cSrcweir     throw (lang::IllegalArgumentException, uno::RuntimeException)
183cdf0e10cSrcweir {
184cdf0e10cSrcweir     ASSERT(CURSOR_META != m_pImpl->m_eType, "should not be called!");
185cdf0e10cSrcweir     return false;
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
GetStartNode() const188cdf0e10cSrcweir const SwStartNode *SwXText::GetStartNode() const
189cdf0e10cSrcweir {
190cdf0e10cSrcweir     return GetDoc()->GetNodes().GetEndOfContent().StartOfSectionNode();
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir uno::Reference< text::XTextCursor >
CreateCursor()194cdf0e10cSrcweir SwXText::CreateCursor() throw (uno::RuntimeException)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir     uno::Reference< text::XTextCursor >  xRet;
197cdf0e10cSrcweir     if(IsValid())
198cdf0e10cSrcweir     {
199cdf0e10cSrcweir         SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
200cdf0e10cSrcweir         SwPosition aPos(rNode);
201cdf0e10cSrcweir         xRet = static_cast<text::XWordCursor*>(
202cdf0e10cSrcweir                 new SwXTextCursor(*GetDoc(), this, m_pImpl->m_eType, aPos));
203cdf0e10cSrcweir         xRet->gotoStart(sal_False);
204cdf0e10cSrcweir     }
205cdf0e10cSrcweir     return xRet;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir /*-- 09.12.98 12:43:02---------------------------------------------------
209cdf0e10cSrcweir 
210cdf0e10cSrcweir   -----------------------------------------------------------------------*/
211cdf0e10cSrcweir uno::Any SAL_CALL
queryInterface(const uno::Type & rType)212cdf0e10cSrcweir SwXText::queryInterface(const uno::Type& rType) throw (uno::RuntimeException)
213cdf0e10cSrcweir {
214cdf0e10cSrcweir     uno::Any aRet;
215cdf0e10cSrcweir     if (rType == text::XText::static_type())
216cdf0e10cSrcweir     {
217cdf0e10cSrcweir         aRet <<= uno::Reference< text::XText >(this);
218cdf0e10cSrcweir     }
219cdf0e10cSrcweir     else if (rType == text::XSimpleText::static_type())
220cdf0e10cSrcweir     {
221cdf0e10cSrcweir         aRet <<= uno::Reference< text::XSimpleText >(this);
222cdf0e10cSrcweir     }
223cdf0e10cSrcweir     else if (rType == text::XTextRange::static_type())
224cdf0e10cSrcweir     {
225cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextRange>(this);
226cdf0e10cSrcweir     }
227cdf0e10cSrcweir     else if (rType == text::XTextRangeCompare::static_type())
228cdf0e10cSrcweir     {
229cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextRangeCompare >(this);
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir     else if (rType == lang::XTypeProvider::static_type())
232cdf0e10cSrcweir     {
233cdf0e10cSrcweir         aRet <<= uno::Reference< lang::XTypeProvider >(this);
234cdf0e10cSrcweir     }
235cdf0e10cSrcweir     else if (rType == text::XRelativeTextContentInsert::static_type())
236cdf0e10cSrcweir     {
237cdf0e10cSrcweir         aRet <<= uno::Reference< text::XRelativeTextContentInsert >(this);
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir     else if (rType == text::XRelativeTextContentRemove::static_type())
240cdf0e10cSrcweir     {
241cdf0e10cSrcweir         aRet <<= uno::Reference< text::XRelativeTextContentRemove >(this);
242cdf0e10cSrcweir     }
243cdf0e10cSrcweir     else if (rType == beans::XPropertySet::static_type())
244cdf0e10cSrcweir     {
245cdf0e10cSrcweir         aRet <<= uno::Reference< beans::XPropertySet >(this);
246cdf0e10cSrcweir     }
247cdf0e10cSrcweir     else if (rType == lang::XUnoTunnel::static_type())
248cdf0e10cSrcweir     {
249cdf0e10cSrcweir         aRet <<= uno::Reference< lang::XUnoTunnel >(this);
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir     else if (rType == text::XTextAppendAndConvert::static_type())
252cdf0e10cSrcweir     {
253cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextAppendAndConvert >(this);
254cdf0e10cSrcweir     }
255cdf0e10cSrcweir     else if (rType == text::XTextAppend::static_type())
256cdf0e10cSrcweir     {
257cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextAppend >(this);
258cdf0e10cSrcweir     }
259cdf0e10cSrcweir     else if (rType == text::XTextPortionAppend::static_type())
260cdf0e10cSrcweir     {
261cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextPortionAppend >(this);
262cdf0e10cSrcweir     }
263cdf0e10cSrcweir     else if (rType == text::XParagraphAppend::static_type())
264cdf0e10cSrcweir     {
265cdf0e10cSrcweir         aRet <<= uno::Reference< text::XParagraphAppend >(this);
266cdf0e10cSrcweir     }
267cdf0e10cSrcweir     else if (rType == text::XTextConvert::static_type() )
268cdf0e10cSrcweir     {
269cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextConvert >(this);
270cdf0e10cSrcweir     }
271cdf0e10cSrcweir     else if (rType == text::XTextContentAppend::static_type())
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextContentAppend >(this);
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir     else if(rType == text::XTextCopy::static_type())
276cdf0e10cSrcweir     {
277cdf0e10cSrcweir         aRet <<= uno::Reference< text::XTextCopy >( this );
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir     return aRet;
280cdf0e10cSrcweir }
281cdf0e10cSrcweir /* -----------------------------15.03.00 17:42--------------------------------
282cdf0e10cSrcweir 
283cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
284cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL
getTypes()285cdf0e10cSrcweir SwXText::getTypes() throw (uno::RuntimeException)
286cdf0e10cSrcweir {
287cdf0e10cSrcweir     uno::Sequence< uno::Type > aRet(12);
288cdf0e10cSrcweir     uno::Type* pTypes = aRet.getArray();
289cdf0e10cSrcweir     pTypes[0] = text::XText::static_type();
290cdf0e10cSrcweir     pTypes[1] = text::XTextRangeCompare::static_type();
291cdf0e10cSrcweir     pTypes[2] = text::XRelativeTextContentInsert::static_type();
292cdf0e10cSrcweir     pTypes[3] = text::XRelativeTextContentRemove::static_type();
293cdf0e10cSrcweir     pTypes[4] = lang::XUnoTunnel::static_type();
294cdf0e10cSrcweir     pTypes[5] = beans::XPropertySet::static_type();
295cdf0e10cSrcweir     pTypes[6] = text::XTextPortionAppend::static_type();
296cdf0e10cSrcweir     pTypes[7] = text::XParagraphAppend::static_type();
297cdf0e10cSrcweir     pTypes[8] = text::XTextContentAppend::static_type();
298cdf0e10cSrcweir     pTypes[9] = text::XTextConvert::static_type();
299cdf0e10cSrcweir     pTypes[10] = text::XTextAppend::static_type();
300cdf0e10cSrcweir     pTypes[11] = text::XTextAppendAndConvert::static_type();
301cdf0e10cSrcweir 
302cdf0e10cSrcweir     return aRet;
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
305cdf0e10cSrcweir // belongs the range in the text ? insert it then.
306cdf0e10cSrcweir void SAL_CALL
insertString(const uno::Reference<text::XTextRange> & xTextRange,const OUString & rString,sal_Bool bAbsorb)307cdf0e10cSrcweir SwXText::insertString(const uno::Reference< text::XTextRange >& xTextRange,
308cdf0e10cSrcweir     const OUString& rString, sal_Bool bAbsorb)
309cdf0e10cSrcweir throw (uno::RuntimeException)
310cdf0e10cSrcweir {
311cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
312cdf0e10cSrcweir 
313cdf0e10cSrcweir     if (!xTextRange.is())
314cdf0e10cSrcweir     {
315cdf0e10cSrcweir         throw uno::RuntimeException();
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir     if (!GetDoc())
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         throw uno::RuntimeException();
320cdf0e10cSrcweir     }
321cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xRangeTunnel(xTextRange,
322cdf0e10cSrcweir             uno::UNO_QUERY);
323cdf0e10cSrcweir     SwXTextRange *const pRange =
324cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
325cdf0e10cSrcweir     OTextCursorHelper *const pCursor =
326cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
327cdf0e10cSrcweir     if ((!pRange  || pRange ->GetDoc() != GetDoc()) &&
328cdf0e10cSrcweir         (!pCursor || pCursor->GetDoc() != GetDoc()))
329cdf0e10cSrcweir     {
330cdf0e10cSrcweir         throw uno::RuntimeException();
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     const SwStartNode *const pOwnStartNode = GetStartNode();
334cdf0e10cSrcweir     SwPaM aPam(GetDoc()->GetNodes());
335cdf0e10cSrcweir     const SwPaM * pPam(0);
336cdf0e10cSrcweir     if (pCursor)
337cdf0e10cSrcweir     {
338cdf0e10cSrcweir         pPam = pCursor->GetPaM();
339cdf0e10cSrcweir     }
340cdf0e10cSrcweir     else // pRange
341cdf0e10cSrcweir     {
342cdf0e10cSrcweir         if (pRange->GetPositions(aPam))
343cdf0e10cSrcweir         {
344cdf0e10cSrcweir             pPam = &aPam;
345cdf0e10cSrcweir         }
346cdf0e10cSrcweir     }
347cdf0e10cSrcweir     if (!pPam)
348cdf0e10cSrcweir     {
349cdf0e10cSrcweir         throw uno::RuntimeException();
350cdf0e10cSrcweir     }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir     const SwStartNode* pTmp(pPam->GetNode()->StartOfSectionNode());
353cdf0e10cSrcweir     while (pTmp && pTmp->IsSectionNode())
354cdf0e10cSrcweir     {
355cdf0e10cSrcweir         pTmp = pTmp->StartOfSectionNode();
356cdf0e10cSrcweir     }
357cdf0e10cSrcweir     if (!pOwnStartNode || (pOwnStartNode != pTmp))
358cdf0e10cSrcweir     {
359cdf0e10cSrcweir         throw uno::RuntimeException();
360cdf0e10cSrcweir     }
361cdf0e10cSrcweir 
362cdf0e10cSrcweir     bool bForceExpandHints( false );
363cdf0e10cSrcweir     if (CURSOR_META == m_pImpl->m_eType)
364cdf0e10cSrcweir     {
365cdf0e10cSrcweir         try
366cdf0e10cSrcweir         {
367cdf0e10cSrcweir             bForceExpandHints = CheckForOwnMemberMeta(*pPam, bAbsorb);
368cdf0e10cSrcweir         }
369cdf0e10cSrcweir         catch (lang::IllegalArgumentException & iae)
370cdf0e10cSrcweir         {
371cdf0e10cSrcweir             // stupid method not allowed to throw iae
372cdf0e10cSrcweir             throw uno::RuntimeException(iae.Message, 0);
373cdf0e10cSrcweir         }
374cdf0e10cSrcweir     }
375cdf0e10cSrcweir     if (bAbsorb)
376cdf0e10cSrcweir     {
377cdf0e10cSrcweir         //!! scan for CR characters and inserting the paragraph breaks
378cdf0e10cSrcweir         //!! has to be done in the called function.
379cdf0e10cSrcweir         //!! Implemented in SwXTextRange::DeleteAndInsert
380cdf0e10cSrcweir         if (pCursor)
381cdf0e10cSrcweir         {
382cdf0e10cSrcweir             SwXTextCursor * const pTextCursor(
383cdf0e10cSrcweir                 dynamic_cast<SwXTextCursor*>(pCursor) );
384cdf0e10cSrcweir             if (pTextCursor)
385cdf0e10cSrcweir             {
386cdf0e10cSrcweir                 pTextCursor->DeleteAndInsert(rString, bForceExpandHints);
387cdf0e10cSrcweir             }
388cdf0e10cSrcweir             else
389cdf0e10cSrcweir             {
390cdf0e10cSrcweir                 xTextRange->setString(rString);
391cdf0e10cSrcweir             }
392cdf0e10cSrcweir         }
393cdf0e10cSrcweir         else
394cdf0e10cSrcweir         {
395cdf0e10cSrcweir             pRange->DeleteAndInsert(rString, bForceExpandHints);
396cdf0e10cSrcweir         }
397cdf0e10cSrcweir     }
398cdf0e10cSrcweir     else
399cdf0e10cSrcweir     {
400cdf0e10cSrcweir         // create a PaM positioned before the parameter PaM,
401cdf0e10cSrcweir         // so the text is inserted before
402cdf0e10cSrcweir         UnoActionContext aContext(GetDoc());
403cdf0e10cSrcweir         SwPaM aInsertPam(*pPam->Start());
404cdf0e10cSrcweir         ::sw::GroupUndoGuard const undoGuard(GetDoc()->GetIDocumentUndoRedo());
405cdf0e10cSrcweir         SwUnoCursorHelper::DocInsertStringSplitCR(
406cdf0e10cSrcweir             *GetDoc(), aInsertPam, rString, bForceExpandHints );
407cdf0e10cSrcweir     }
408cdf0e10cSrcweir }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir /*-- 09.12.98 12:43:16---------------------------------------------------
411cdf0e10cSrcweir 
412cdf0e10cSrcweir   -----------------------------------------------------------------------*/
413cdf0e10cSrcweir void SAL_CALL
insertControlCharacter(const uno::Reference<text::XTextRange> & xTextRange,sal_Int16 nControlCharacter,sal_Bool bAbsorb)414cdf0e10cSrcweir SwXText::insertControlCharacter(
415cdf0e10cSrcweir         const uno::Reference< text::XTextRange > & xTextRange,
416cdf0e10cSrcweir         sal_Int16 nControlCharacter, sal_Bool bAbsorb)
417cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
418cdf0e10cSrcweir {
419cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
420cdf0e10cSrcweir 
421cdf0e10cSrcweir     if (!xTextRange.is())
422cdf0e10cSrcweir     {
423cdf0e10cSrcweir         throw lang::IllegalArgumentException();
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir     if (!GetDoc())
426cdf0e10cSrcweir     {
427cdf0e10cSrcweir         throw uno::RuntimeException();
428cdf0e10cSrcweir     }
429cdf0e10cSrcweir 
430cdf0e10cSrcweir     SwUnoInternalPaM aPam(*GetDoc());
431cdf0e10cSrcweir     if (!::sw::XTextRangeToSwPaM(aPam, xTextRange))
432cdf0e10cSrcweir     {
433cdf0e10cSrcweir         throw uno::RuntimeException();
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir     const bool bForceExpandHints(CheckForOwnMemberMeta(aPam, bAbsorb));
436cdf0e10cSrcweir 
437cdf0e10cSrcweir     const enum IDocumentContentOperations::InsertFlags nInsertFlags =
438cdf0e10cSrcweir         (bForceExpandHints)
439cdf0e10cSrcweir         ? static_cast<IDocumentContentOperations::InsertFlags>(
440cdf0e10cSrcweir                 IDocumentContentOperations::INS_FORCEHINTEXPAND |
441cdf0e10cSrcweir                 IDocumentContentOperations::INS_EMPTYEXPAND)
442cdf0e10cSrcweir         : IDocumentContentOperations::INS_EMPTYEXPAND;
443cdf0e10cSrcweir 
444cdf0e10cSrcweir     SwPaM aTmp(*aPam.Start());
445cdf0e10cSrcweir     if (bAbsorb && aPam.HasMark())
446cdf0e10cSrcweir     {
447cdf0e10cSrcweir         m_pImpl->m_pDoc->DeleteAndJoin(aPam);
448cdf0e10cSrcweir     }
449cdf0e10cSrcweir 
450cdf0e10cSrcweir     sal_Unicode cIns = 0;
451cdf0e10cSrcweir     switch (nControlCharacter)
452cdf0e10cSrcweir     {
453cdf0e10cSrcweir         case text::ControlCharacter::PARAGRAPH_BREAK :
454cdf0e10cSrcweir             // a table cell now becomes an ordinary text cell!
455cdf0e10cSrcweir             m_pImpl->m_pDoc->ClearBoxNumAttrs( aTmp.GetPoint()->nNode );
456cdf0e10cSrcweir             m_pImpl->m_pDoc->SplitNode( *aTmp.GetPoint(), sal_False );
457cdf0e10cSrcweir             break;
458cdf0e10cSrcweir         case text::ControlCharacter::APPEND_PARAGRAPH:
459cdf0e10cSrcweir         {
460cdf0e10cSrcweir             m_pImpl->m_pDoc->ClearBoxNumAttrs( aTmp.GetPoint()->nNode );
461cdf0e10cSrcweir             m_pImpl->m_pDoc->AppendTxtNode( *aTmp.GetPoint() );
462cdf0e10cSrcweir 
463cdf0e10cSrcweir             const uno::Reference<lang::XUnoTunnel> xRangeTunnel(
464cdf0e10cSrcweir                     xTextRange, uno::UNO_QUERY);
465cdf0e10cSrcweir             SwXTextRange *const pRange =
466cdf0e10cSrcweir                 ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
467cdf0e10cSrcweir             OTextCursorHelper *const pCursor =
468cdf0e10cSrcweir                 ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(
469cdf0e10cSrcweir                             xRangeTunnel);
470cdf0e10cSrcweir             if (pRange)
471cdf0e10cSrcweir             {
472cdf0e10cSrcweir                 pRange->SetPositions(aTmp);
473cdf0e10cSrcweir             }
474cdf0e10cSrcweir             else if (pCursor)
475cdf0e10cSrcweir             {
476cdf0e10cSrcweir                 SwPaM *const pCrsr = pCursor->GetPaM();
477cdf0e10cSrcweir                 *pCrsr->GetPoint() = *aTmp.GetPoint();
478cdf0e10cSrcweir                 pCrsr->DeleteMark();
479cdf0e10cSrcweir             }
480cdf0e10cSrcweir         }
481cdf0e10cSrcweir         break;
482cdf0e10cSrcweir         case text::ControlCharacter::LINE_BREAK:  cIns = 10;              break;
483cdf0e10cSrcweir         case text::ControlCharacter::SOFT_HYPHEN: cIns = CHAR_SOFTHYPHEN; break;
484cdf0e10cSrcweir         case text::ControlCharacter::HARD_HYPHEN: cIns = CHAR_HARDHYPHEN; break;
485cdf0e10cSrcweir         case text::ControlCharacter::HARD_SPACE:  cIns = CHAR_HARDBLANK;  break;
486cdf0e10cSrcweir     }
487cdf0e10cSrcweir     if (cIns)
488cdf0e10cSrcweir     {
489cdf0e10cSrcweir         m_pImpl->m_pDoc->InsertString( aTmp, cIns, nInsertFlags );
490cdf0e10cSrcweir     }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     if (bAbsorb)
493cdf0e10cSrcweir     {
494cdf0e10cSrcweir         const uno::Reference<lang::XUnoTunnel> xRangeTunnel(
495cdf0e10cSrcweir                 xTextRange, uno::UNO_QUERY);
496cdf0e10cSrcweir         SwXTextRange *const pRange =
497cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
498cdf0e10cSrcweir         OTextCursorHelper *const pCursor =
499cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
500cdf0e10cSrcweir 
501cdf0e10cSrcweir         SwCursor aCrsr(*aTmp.GetPoint(),0,false);
502cdf0e10cSrcweir         SwUnoCursorHelper::SelectPam(aCrsr, true);
503cdf0e10cSrcweir         aCrsr.Left(1, CRSR_SKIP_CHARS, sal_False, sal_False);
504cdf0e10cSrcweir         //hier muss der uebergebene PaM umgesetzt werden:
505cdf0e10cSrcweir         if (pRange)
506cdf0e10cSrcweir         {
507cdf0e10cSrcweir             pRange->SetPositions(aCrsr);
508cdf0e10cSrcweir         }
509cdf0e10cSrcweir         else
510cdf0e10cSrcweir         {
511cdf0e10cSrcweir             SwPaM *const pUnoCrsr = pCursor->GetPaM();
512cdf0e10cSrcweir             *pUnoCrsr->GetPoint() = *aCrsr.GetPoint();
513cdf0e10cSrcweir             if (aCrsr.HasMark())
514cdf0e10cSrcweir             {
515cdf0e10cSrcweir                 pUnoCrsr->SetMark();
516cdf0e10cSrcweir                 *pUnoCrsr->GetMark() = *aCrsr.GetMark();
517cdf0e10cSrcweir             }
518cdf0e10cSrcweir             else
519cdf0e10cSrcweir             {
520cdf0e10cSrcweir                 pUnoCrsr->DeleteMark();
521cdf0e10cSrcweir             }
522cdf0e10cSrcweir         }
523cdf0e10cSrcweir     }
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir /*-- 09.12.98 12:43:17---------------------------------------------------
527cdf0e10cSrcweir 
528cdf0e10cSrcweir   -----------------------------------------------------------------------*/
529cdf0e10cSrcweir void SAL_CALL
insertTextContent(const uno::Reference<text::XTextRange> & xRange,const uno::Reference<text::XTextContent> & xContent,sal_Bool bAbsorb)530cdf0e10cSrcweir SwXText::insertTextContent(
531cdf0e10cSrcweir         const uno::Reference< text::XTextRange > & xRange,
532cdf0e10cSrcweir         const uno::Reference< text::XTextContent > & xContent,
533cdf0e10cSrcweir         sal_Bool bAbsorb)
534cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
535cdf0e10cSrcweir {
536cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
537cdf0e10cSrcweir 
538cdf0e10cSrcweir     if (!xRange.is())
539cdf0e10cSrcweir     {
540cdf0e10cSrcweir         lang::IllegalArgumentException aIllegal;
541cdf0e10cSrcweir         aIllegal.Message = C2U("first parameter invalid;");
542cdf0e10cSrcweir         throw aIllegal;
543cdf0e10cSrcweir     }
544cdf0e10cSrcweir     if (!xContent.is())
545cdf0e10cSrcweir     {
546cdf0e10cSrcweir         lang::IllegalArgumentException aIllegal;
547cdf0e10cSrcweir         aIllegal.Message += C2U("second parameter invalid");
548cdf0e10cSrcweir         throw aIllegal;
549cdf0e10cSrcweir     }
550cdf0e10cSrcweir     if(!GetDoc())
551cdf0e10cSrcweir     {
552cdf0e10cSrcweir         uno::RuntimeException aRuntime;
553cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
554cdf0e10cSrcweir         throw aRuntime;
555cdf0e10cSrcweir     }
556cdf0e10cSrcweir 
557cdf0e10cSrcweir     SwUnoInternalPaM aPam(*GetDoc());
558cdf0e10cSrcweir     if (!::sw::XTextRangeToSwPaM(aPam, xRange))
559cdf0e10cSrcweir     {
560cdf0e10cSrcweir         lang::IllegalArgumentException aIllegal;
561cdf0e10cSrcweir         aIllegal.Message = C2U("first parameter invalid");
562cdf0e10cSrcweir         throw aIllegal;
563cdf0e10cSrcweir     }
564cdf0e10cSrcweir     // first test if the range is at the right position, then call
565cdf0e10cSrcweir     // xContent->attach
566cdf0e10cSrcweir     const SwStartNode* pOwnStartNode = GetStartNode();
567cdf0e10cSrcweir     SwStartNodeType eSearchNodeType = SwNormalStartNode;
568cdf0e10cSrcweir     switch (m_pImpl->m_eType)
569cdf0e10cSrcweir     {
570cdf0e10cSrcweir         case CURSOR_FRAME:      eSearchNodeType = SwFlyStartNode;       break;
571cdf0e10cSrcweir         case CURSOR_TBLTEXT:    eSearchNodeType = SwTableBoxStartNode;  break;
572cdf0e10cSrcweir         case CURSOR_FOOTNOTE:   eSearchNodeType = SwFootnoteStartNode;  break;
573cdf0e10cSrcweir         case CURSOR_HEADER:     eSearchNodeType = SwHeaderStartNode;    break;
574cdf0e10cSrcweir         case CURSOR_FOOTER:     eSearchNodeType = SwFooterStartNode;    break;
575cdf0e10cSrcweir         //case CURSOR_INVALID:
576cdf0e10cSrcweir         //case CURSOR_BODY:
577cdf0e10cSrcweir         default:
578cdf0e10cSrcweir             break;
579cdf0e10cSrcweir     }
580cdf0e10cSrcweir 
581cdf0e10cSrcweir     const SwStartNode* pTmp =
582cdf0e10cSrcweir         aPam.GetNode()->FindSttNodeByType(eSearchNodeType);
583cdf0e10cSrcweir 
584cdf0e10cSrcweir     // ignore SectionNodes
585cdf0e10cSrcweir     while (pTmp && pTmp->IsSectionNode())
586cdf0e10cSrcweir     {
587cdf0e10cSrcweir         pTmp = pTmp->StartOfSectionNode();
588cdf0e10cSrcweir     }
589cdf0e10cSrcweir     // if the document starts with a section
590cdf0e10cSrcweir     while (pOwnStartNode->IsSectionNode())
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir         pOwnStartNode = pOwnStartNode->StartOfSectionNode();
593cdf0e10cSrcweir     }
594cdf0e10cSrcweir     // this checks if (this) and xRange are in the same text::XText interface
595cdf0e10cSrcweir     if (pOwnStartNode != pTmp)
596cdf0e10cSrcweir     {
597cdf0e10cSrcweir         uno::RuntimeException aRunException;
598cdf0e10cSrcweir         aRunException.Message = C2U("text interface and cursor not related");
599cdf0e10cSrcweir         throw aRunException;
600cdf0e10cSrcweir     }
601cdf0e10cSrcweir 
602cdf0e10cSrcweir     const bool bForceExpandHints(CheckForOwnMemberMeta(aPam, bAbsorb));
603cdf0e10cSrcweir 
604cdf0e10cSrcweir     // special treatment for Contents that do not replace the range, but
605cdf0e10cSrcweir     // instead are "overlaid"
606cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xContentTunnel(xContent,
607cdf0e10cSrcweir             uno::UNO_QUERY);
608cdf0e10cSrcweir     if (!xContentTunnel.is())
609cdf0e10cSrcweir     {
610cdf0e10cSrcweir         lang::IllegalArgumentException aArgException;
611cdf0e10cSrcweir         aArgException.Message =
612cdf0e10cSrcweir             C2U("text content does not support lang::XUnoTunnel");
613cdf0e10cSrcweir         throw aArgException;
614cdf0e10cSrcweir     }
615cdf0e10cSrcweir     SwXDocumentIndexMark *const pDocumentIndexMark =
616cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXDocumentIndexMark>(xContentTunnel);
617cdf0e10cSrcweir     SwXTextSection *const pSection =
618cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXTextSection>(xContentTunnel);
619cdf0e10cSrcweir     SwXBookmark *const pBookmark =
620cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXBookmark>(xContentTunnel);
621cdf0e10cSrcweir     SwXReferenceMark *const pReferenceMark =
622cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXReferenceMark>(xContentTunnel);
623cdf0e10cSrcweir     SwXMeta *const pMeta =
624cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXMeta>(xContentTunnel);
6253b32dd21SOliver-Rainer Wittmann     SwXTextField* pTextField =
6263b32dd21SOliver-Rainer Wittmann         ::sw::UnoTunnelGetImplementation<SwXTextField>(xContentTunnel);
6273b32dd21SOliver-Rainer Wittmann     if ( pTextField
6283b32dd21SOliver-Rainer Wittmann          && pTextField->GetServiceId() != SW_SERVICE_FIELDTYPE_ANNOTATION )
6293b32dd21SOliver-Rainer Wittmann     {
6303b32dd21SOliver-Rainer Wittmann         pTextField = 0;
6313b32dd21SOliver-Rainer Wittmann     }
632cdf0e10cSrcweir 
6333b32dd21SOliver-Rainer Wittmann     const bool bAttribute =
6343b32dd21SOliver-Rainer Wittmann         pBookmark || pDocumentIndexMark || pSection || pReferenceMark || pMeta || pTextField;
635cdf0e10cSrcweir 
636cdf0e10cSrcweir     if (bAbsorb && !bAttribute)
637cdf0e10cSrcweir     {
638cdf0e10cSrcweir         xRange->setString(aEmptyStr);
639cdf0e10cSrcweir     }
640cdf0e10cSrcweir     uno::Reference< text::XTextRange > xTempRange =
641cdf0e10cSrcweir         (bAttribute && bAbsorb) ? xRange : xRange->getStart();
642cdf0e10cSrcweir     if (bForceExpandHints)
643cdf0e10cSrcweir     {
644cdf0e10cSrcweir         // if necessary, replace xTempRange with a new SwXTextCursor
645cdf0e10cSrcweir         PrepareForAttach(xTempRange, aPam);
646cdf0e10cSrcweir     }
647cdf0e10cSrcweir     xContent->attach(xTempRange);
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir /* -----------------------------10.07.00 15:40--------------------------------
651cdf0e10cSrcweir 
652cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
653cdf0e10cSrcweir void SAL_CALL
insertTextContentBefore(const uno::Reference<text::XTextContent> & xNewContent,const uno::Reference<text::XTextContent> & xSuccessor)654cdf0e10cSrcweir SwXText::insertTextContentBefore(
655cdf0e10cSrcweir     const uno::Reference< text::XTextContent>& xNewContent,
656cdf0e10cSrcweir     const uno::Reference< text::XTextContent>& xSuccessor)
657cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
658cdf0e10cSrcweir {
659cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
660cdf0e10cSrcweir 
661cdf0e10cSrcweir     if(!GetDoc())
662cdf0e10cSrcweir     {
663cdf0e10cSrcweir         uno::RuntimeException aRuntime;
664cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
665cdf0e10cSrcweir         throw aRuntime;
666cdf0e10cSrcweir     }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xParaTunnel(xNewContent,
669cdf0e10cSrcweir             uno::UNO_QUERY);
670cdf0e10cSrcweir     SwXParagraph *const pPara =
671cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXParagraph>(xParaTunnel);
672cdf0e10cSrcweir     if (!pPara || !pPara->IsDescriptor() || !xSuccessor.is())
673cdf0e10cSrcweir     {
674cdf0e10cSrcweir         throw lang::IllegalArgumentException();
675cdf0e10cSrcweir     }
676cdf0e10cSrcweir 
677cdf0e10cSrcweir     sal_Bool bRet = sal_False;
678cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xSuccTunnel(xSuccessor,
679cdf0e10cSrcweir             uno::UNO_QUERY);
680cdf0e10cSrcweir     SwXTextSection *const pXSection =
681cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextSection>(xSuccTunnel);
682cdf0e10cSrcweir     SwXTextTable *const pXTable =
683cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextTable>(xSuccTunnel);
684cdf0e10cSrcweir     SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
685cdf0e10cSrcweir     SwTxtNode * pTxtNode = 0;
686cdf0e10cSrcweir     if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
687cdf0e10cSrcweir     {
688cdf0e10cSrcweir         SwTable *const pTable = SwTable::FindTable( pTableFmt );
689cdf0e10cSrcweir         SwTableNode *const pTblNode = pTable->GetTableNode();
690cdf0e10cSrcweir 
691cdf0e10cSrcweir         const SwNodeIndex aTblIdx( *pTblNode, -1 );
692cdf0e10cSrcweir         SwPosition aBefore(aTblIdx);
693cdf0e10cSrcweir         bRet = GetDoc()->AppendTxtNode( aBefore );
694cdf0e10cSrcweir         pTxtNode = aBefore.nNode.GetNode().GetTxtNode();
695cdf0e10cSrcweir     }
696cdf0e10cSrcweir     else if (pXSection && pXSection->GetFmt() &&
697cdf0e10cSrcweir             pXSection->GetFmt()->GetDoc() == GetDoc())
698cdf0e10cSrcweir     {
699cdf0e10cSrcweir         SwSectionFmt *const pSectFmt = pXSection->GetFmt();
700cdf0e10cSrcweir         SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
701cdf0e10cSrcweir 
702cdf0e10cSrcweir         const SwNodeIndex aSectIdx( *pSectNode, -1 );
703cdf0e10cSrcweir         SwPosition aBefore(aSectIdx);
704cdf0e10cSrcweir         bRet = GetDoc()->AppendTxtNode( aBefore );
705cdf0e10cSrcweir         pTxtNode = aBefore.nNode.GetNode().GetTxtNode();
706cdf0e10cSrcweir     }
707cdf0e10cSrcweir     if (!bRet || !pTxtNode)
708cdf0e10cSrcweir     {
709cdf0e10cSrcweir         throw lang::IllegalArgumentException();
710cdf0e10cSrcweir     }
711cdf0e10cSrcweir     pPara->attachToText(*this, *pTxtNode);
712cdf0e10cSrcweir }
713cdf0e10cSrcweir 
714cdf0e10cSrcweir /* -----------------------------10.07.00 15:40--------------------------------
715cdf0e10cSrcweir 
716cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
717cdf0e10cSrcweir void SAL_CALL
insertTextContentAfter(const uno::Reference<text::XTextContent> & xNewContent,const uno::Reference<text::XTextContent> & xPredecessor)718cdf0e10cSrcweir SwXText::insertTextContentAfter(
719cdf0e10cSrcweir     const uno::Reference< text::XTextContent>& xNewContent,
720cdf0e10cSrcweir     const uno::Reference< text::XTextContent>& xPredecessor)
721cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
722cdf0e10cSrcweir {
723cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
724cdf0e10cSrcweir 
725cdf0e10cSrcweir     if(!GetDoc())
726cdf0e10cSrcweir     {
727cdf0e10cSrcweir         throw uno::RuntimeException();
728cdf0e10cSrcweir     }
729cdf0e10cSrcweir 
730cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xParaTunnel(xNewContent,
731cdf0e10cSrcweir             uno::UNO_QUERY);
732cdf0e10cSrcweir     SwXParagraph *const pPara =
733cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXParagraph>(xParaTunnel);
734cdf0e10cSrcweir     if(!pPara || !pPara->IsDescriptor() || !xPredecessor.is())
735cdf0e10cSrcweir     {
736cdf0e10cSrcweir         throw lang::IllegalArgumentException();
737cdf0e10cSrcweir     }
738cdf0e10cSrcweir 
739cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xPredTunnel(xPredecessor,
740cdf0e10cSrcweir             uno::UNO_QUERY);
741cdf0e10cSrcweir     SwXTextSection *const pXSection =
742cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextSection>(xPredTunnel);
743cdf0e10cSrcweir     SwXTextTable *const pXTable =
744cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextTable>(xPredTunnel);
745cdf0e10cSrcweir     SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
746cdf0e10cSrcweir     sal_Bool bRet = sal_False;
747cdf0e10cSrcweir     SwTxtNode * pTxtNode = 0;
748cdf0e10cSrcweir     if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
749cdf0e10cSrcweir     {
750cdf0e10cSrcweir         SwTable *const pTable = SwTable::FindTable( pTableFmt );
751cdf0e10cSrcweir         SwTableNode *const pTblNode = pTable->GetTableNode();
752cdf0e10cSrcweir 
753cdf0e10cSrcweir         SwEndNode *const pTableEnd = pTblNode->EndOfSectionNode();
754cdf0e10cSrcweir         SwPosition aTableEnd(*pTableEnd);
755cdf0e10cSrcweir         bRet = GetDoc()->AppendTxtNode( aTableEnd );
756cdf0e10cSrcweir         pTxtNode = aTableEnd.nNode.GetNode().GetTxtNode();
757cdf0e10cSrcweir     }
758cdf0e10cSrcweir     else if (pXSection && pXSection->GetFmt() &&
759cdf0e10cSrcweir             pXSection->GetFmt()->GetDoc() == GetDoc())
760cdf0e10cSrcweir     {
761cdf0e10cSrcweir         SwSectionFmt *const pSectFmt = pXSection->GetFmt();
762cdf0e10cSrcweir         SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
763cdf0e10cSrcweir         SwEndNode *const pEnd = pSectNode->EndOfSectionNode();
764cdf0e10cSrcweir         SwPosition aEnd(*pEnd);
765cdf0e10cSrcweir         bRet = GetDoc()->AppendTxtNode( aEnd );
766cdf0e10cSrcweir         pTxtNode = aEnd.nNode.GetNode().GetTxtNode();
767cdf0e10cSrcweir     }
768cdf0e10cSrcweir     if (!bRet || !pTxtNode)
769cdf0e10cSrcweir     {
770cdf0e10cSrcweir         throw lang::IllegalArgumentException();
771cdf0e10cSrcweir     }
772cdf0e10cSrcweir     pPara->attachToText(*this, *pTxtNode);
773cdf0e10cSrcweir }
774cdf0e10cSrcweir 
775cdf0e10cSrcweir /* -----------------------------10.07.00 15:40--------------------------------
776cdf0e10cSrcweir 
777cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
778cdf0e10cSrcweir void SAL_CALL
removeTextContentBefore(const uno::Reference<text::XTextContent> & xSuccessor)779cdf0e10cSrcweir SwXText::removeTextContentBefore(
780cdf0e10cSrcweir     const uno::Reference< text::XTextContent>& xSuccessor)
781cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
782cdf0e10cSrcweir {
783cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
784cdf0e10cSrcweir 
785cdf0e10cSrcweir     if(!GetDoc())
786cdf0e10cSrcweir     {
787cdf0e10cSrcweir         uno::RuntimeException aRuntime;
788cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
789cdf0e10cSrcweir         throw aRuntime;
790cdf0e10cSrcweir     }
791cdf0e10cSrcweir 
792cdf0e10cSrcweir     sal_Bool bRet = sal_False;
793cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xSuccTunnel(xSuccessor,
794cdf0e10cSrcweir             uno::UNO_QUERY);
795cdf0e10cSrcweir     SwXTextSection *const pXSection =
796cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextSection>(xSuccTunnel);
797cdf0e10cSrcweir     SwXTextTable *const pXTable =
798cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextTable>(xSuccTunnel);
799cdf0e10cSrcweir     SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
800cdf0e10cSrcweir     if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
801cdf0e10cSrcweir     {
802cdf0e10cSrcweir         SwTable *const pTable = SwTable::FindTable( pTableFmt );
803cdf0e10cSrcweir         SwTableNode *const pTblNode = pTable->GetTableNode();
804cdf0e10cSrcweir 
805cdf0e10cSrcweir         const SwNodeIndex aTblIdx( *pTblNode, -1 );
806cdf0e10cSrcweir         if(aTblIdx.GetNode().IsTxtNode())
807cdf0e10cSrcweir         {
808cdf0e10cSrcweir             SwPaM aBefore(aTblIdx);
809cdf0e10cSrcweir             bRet = GetDoc()->DelFullPara( aBefore );
810cdf0e10cSrcweir         }
811cdf0e10cSrcweir     }
812cdf0e10cSrcweir     else if (pXSection && pXSection->GetFmt() &&
813cdf0e10cSrcweir             pXSection->GetFmt()->GetDoc() == GetDoc())
814cdf0e10cSrcweir     {
815cdf0e10cSrcweir         SwSectionFmt *const pSectFmt = pXSection->GetFmt();
816cdf0e10cSrcweir         SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
817cdf0e10cSrcweir 
818cdf0e10cSrcweir         const SwNodeIndex aSectIdx(  *pSectNode, -1 );
819cdf0e10cSrcweir         if(aSectIdx.GetNode().IsTxtNode())
820cdf0e10cSrcweir         {
821cdf0e10cSrcweir             SwPaM aBefore(aSectIdx);
822cdf0e10cSrcweir             bRet = GetDoc()->DelFullPara( aBefore );
823cdf0e10cSrcweir         }
824cdf0e10cSrcweir     }
825cdf0e10cSrcweir     if(!bRet)
826cdf0e10cSrcweir     {
827cdf0e10cSrcweir         throw lang::IllegalArgumentException();
828cdf0e10cSrcweir     }
829cdf0e10cSrcweir }
830cdf0e10cSrcweir 
831cdf0e10cSrcweir /* -----------------------------10.07.00 15:40--------------------------------
832cdf0e10cSrcweir 
833cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
834cdf0e10cSrcweir void SAL_CALL
removeTextContentAfter(const uno::Reference<text::XTextContent> & xPredecessor)835cdf0e10cSrcweir SwXText::removeTextContentAfter(
836cdf0e10cSrcweir         const uno::Reference< text::XTextContent>& xPredecessor)
837cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
838cdf0e10cSrcweir {
839cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
840cdf0e10cSrcweir 
841cdf0e10cSrcweir     if(!GetDoc())
842cdf0e10cSrcweir     {
843cdf0e10cSrcweir         uno::RuntimeException aRuntime;
844cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
845cdf0e10cSrcweir         throw aRuntime;
846cdf0e10cSrcweir     }
847cdf0e10cSrcweir 
848cdf0e10cSrcweir     sal_Bool bRet = sal_False;
849cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xPredTunnel(xPredecessor,
850cdf0e10cSrcweir             uno::UNO_QUERY);
851cdf0e10cSrcweir     SwXTextSection *const pXSection =
852cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextSection>(xPredTunnel);
853cdf0e10cSrcweir     SwXTextTable *const pXTable =
854cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextTable>(xPredTunnel);
855cdf0e10cSrcweir     SwFrmFmt *const pTableFmt = (pXTable) ? pXTable->GetFrmFmt() : 0;
856cdf0e10cSrcweir     if(pTableFmt && pTableFmt->GetDoc() == GetDoc())
857cdf0e10cSrcweir     {
858cdf0e10cSrcweir         SwTable *const pTable = SwTable::FindTable( pTableFmt );
859cdf0e10cSrcweir         SwTableNode *const pTblNode = pTable->GetTableNode();
860cdf0e10cSrcweir         SwEndNode *const pTableEnd = pTblNode->EndOfSectionNode();
861cdf0e10cSrcweir 
862cdf0e10cSrcweir         const SwNodeIndex aTblIdx( *pTableEnd, 1 );
863cdf0e10cSrcweir         if(aTblIdx.GetNode().IsTxtNode())
864cdf0e10cSrcweir         {
865cdf0e10cSrcweir             SwPaM aPaM(aTblIdx);
866cdf0e10cSrcweir             bRet = GetDoc()->DelFullPara( aPaM );
867cdf0e10cSrcweir         }
868cdf0e10cSrcweir     }
869cdf0e10cSrcweir     else if (pXSection && pXSection->GetFmt() &&
870cdf0e10cSrcweir             pXSection->GetFmt()->GetDoc() == GetDoc())
871cdf0e10cSrcweir     {
872cdf0e10cSrcweir         SwSectionFmt *const pSectFmt = pXSection->GetFmt();
873cdf0e10cSrcweir         SwSectionNode *const pSectNode = pSectFmt->GetSectionNode();
874cdf0e10cSrcweir         SwEndNode *const pEnd = pSectNode->EndOfSectionNode();
875cdf0e10cSrcweir         const SwNodeIndex aSectIdx(  *pEnd, 1 );
876cdf0e10cSrcweir         if(aSectIdx.GetNode().IsTxtNode())
877cdf0e10cSrcweir         {
878cdf0e10cSrcweir             SwPaM aAfter(aSectIdx);
879cdf0e10cSrcweir             bRet = GetDoc()->DelFullPara( aAfter );
880cdf0e10cSrcweir         }
881cdf0e10cSrcweir     }
882cdf0e10cSrcweir     if(!bRet)
883cdf0e10cSrcweir     {
884cdf0e10cSrcweir         throw lang::IllegalArgumentException();
885cdf0e10cSrcweir     }
886cdf0e10cSrcweir }
887cdf0e10cSrcweir 
888cdf0e10cSrcweir /*-- 09.12.98 12:43:19---------------------------------------------------
889cdf0e10cSrcweir 
890cdf0e10cSrcweir   -----------------------------------------------------------------------*/
891cdf0e10cSrcweir void SAL_CALL
removeTextContent(const uno::Reference<text::XTextContent> & xContent)892cdf0e10cSrcweir SwXText::removeTextContent(
893cdf0e10cSrcweir         const uno::Reference< text::XTextContent > & xContent)
894cdf0e10cSrcweir throw (container::NoSuchElementException, uno::RuntimeException)
895cdf0e10cSrcweir {
896cdf0e10cSrcweir     // forward: need no solar mutex here
897cdf0e10cSrcweir     if(!xContent.is())
898cdf0e10cSrcweir     {
899cdf0e10cSrcweir         uno::RuntimeException aRuntime;
900cdf0e10cSrcweir         aRuntime.Message = C2U("first parameter invalid");
901cdf0e10cSrcweir         throw aRuntime;
902cdf0e10cSrcweir     }
903cdf0e10cSrcweir     xContent->dispose();
904cdf0e10cSrcweir }
905cdf0e10cSrcweir 
906cdf0e10cSrcweir /*-- 09.12.98 12:43:22---------------------------------------------------
907cdf0e10cSrcweir 
908cdf0e10cSrcweir   -----------------------------------------------------------------------*/
909cdf0e10cSrcweir uno::Reference< text::XText > SAL_CALL
getText()910cdf0e10cSrcweir SwXText::getText() throw (uno::RuntimeException)
911cdf0e10cSrcweir {
912cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
913cdf0e10cSrcweir 
914cdf0e10cSrcweir     const uno::Reference< text::XText > xRet(this);
915cdf0e10cSrcweir     return xRet;
916cdf0e10cSrcweir }
917cdf0e10cSrcweir 
918cdf0e10cSrcweir /*-- 09.12.98 12:43:24---------------------------------------------------
919cdf0e10cSrcweir 
920cdf0e10cSrcweir   -----------------------------------------------------------------------*/
921cdf0e10cSrcweir uno::Reference< text::XTextRange > SAL_CALL
getStart()922cdf0e10cSrcweir SwXText::getStart() throw (uno::RuntimeException)
923cdf0e10cSrcweir {
924cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
925cdf0e10cSrcweir 
926cdf0e10cSrcweir     const uno::Reference< text::XTextCursor > xRef = CreateCursor();
927cdf0e10cSrcweir     if(!xRef.is())
928cdf0e10cSrcweir     {
929cdf0e10cSrcweir         uno::RuntimeException aRuntime;
930cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
931cdf0e10cSrcweir         throw aRuntime;
932cdf0e10cSrcweir     }
933cdf0e10cSrcweir     xRef->gotoStart(sal_False);
934cdf0e10cSrcweir     const uno::Reference< text::XTextRange > xRet(xRef, uno::UNO_QUERY);
935cdf0e10cSrcweir     return xRet;
936cdf0e10cSrcweir }
937cdf0e10cSrcweir /*-- 09.12.98 12:43:27---------------------------------------------------
938cdf0e10cSrcweir 
939cdf0e10cSrcweir   -----------------------------------------------------------------------*/
940cdf0e10cSrcweir uno::Reference< text::XTextRange > SAL_CALL
getEnd()941cdf0e10cSrcweir SwXText::getEnd() throw (uno::RuntimeException)
942cdf0e10cSrcweir {
943cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
944cdf0e10cSrcweir 
945cdf0e10cSrcweir     const uno::Reference< text::XTextCursor > xRef = CreateCursor();
946cdf0e10cSrcweir     if(!xRef.is())
947cdf0e10cSrcweir     {
948cdf0e10cSrcweir         uno::RuntimeException aRuntime;
949cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
950cdf0e10cSrcweir         throw aRuntime;
951cdf0e10cSrcweir     }
952cdf0e10cSrcweir     xRef->gotoEnd(sal_False);
953cdf0e10cSrcweir     const uno::Reference< text::XTextRange >  xRet(xRef, uno::UNO_QUERY);
954cdf0e10cSrcweir     return xRet;
955cdf0e10cSrcweir }
956cdf0e10cSrcweir 
957cdf0e10cSrcweir /*-- 09.12.98 12:43:29---------------------------------------------------
958cdf0e10cSrcweir 
959cdf0e10cSrcweir   -----------------------------------------------------------------------*/
getString()960cdf0e10cSrcweir OUString SAL_CALL SwXText::getString() throw (uno::RuntimeException)
961cdf0e10cSrcweir {
962cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
963cdf0e10cSrcweir 
964cdf0e10cSrcweir     const uno::Reference< text::XTextCursor > xRet = CreateCursor();
965cdf0e10cSrcweir     if(!xRet.is())
966cdf0e10cSrcweir     {
967cdf0e10cSrcweir         uno::RuntimeException aRuntime;
968cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
969cdf0e10cSrcweir         throw aRuntime;
970cdf0e10cSrcweir     }
971cdf0e10cSrcweir     xRet->gotoEnd(sal_True);
972cdf0e10cSrcweir     return xRet->getString();
973cdf0e10cSrcweir }
974cdf0e10cSrcweir /*-- 09.12.98 12:43:30---------------------------------------------------
975cdf0e10cSrcweir 
976cdf0e10cSrcweir   -----------------------------------------------------------------------*/
977cdf0e10cSrcweir void SAL_CALL
setString(const OUString & rString)978cdf0e10cSrcweir SwXText::setString(const OUString& rString) throw (uno::RuntimeException)
979cdf0e10cSrcweir {
980cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
981cdf0e10cSrcweir 
982cdf0e10cSrcweir     if (!GetDoc())
983cdf0e10cSrcweir     {
984cdf0e10cSrcweir         uno::RuntimeException aRuntime;
985cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
986cdf0e10cSrcweir         throw aRuntime;
987cdf0e10cSrcweir     }
988cdf0e10cSrcweir 
989cdf0e10cSrcweir     const SwStartNode* pStartNode = GetStartNode();
990cdf0e10cSrcweir     if (!pStartNode)
991cdf0e10cSrcweir     {
992cdf0e10cSrcweir         throw uno::RuntimeException();
993cdf0e10cSrcweir     }
994cdf0e10cSrcweir 
995cdf0e10cSrcweir     GetDoc()->GetIDocumentUndoRedo().StartUndo(UNDO_START, NULL);
996cdf0e10cSrcweir     //insert an empty paragraph at the start and at the end to ensure that
997cdf0e10cSrcweir     //all tables and sections can be removed by the selecting text::XTextCursor
998cdf0e10cSrcweir     if (CURSOR_META != m_pImpl->m_eType)
999cdf0e10cSrcweir     {
1000cdf0e10cSrcweir         SwPosition aStartPos(*pStartNode);
1001cdf0e10cSrcweir         const SwEndNode* pEnd = pStartNode->EndOfSectionNode();
1002cdf0e10cSrcweir         SwNodeIndex aEndIdx(*pEnd);
1003cdf0e10cSrcweir         aEndIdx--;
1004cdf0e10cSrcweir         //the inserting of nodes should only be done if really necessary
1005cdf0e10cSrcweir         //to prevent #97924# (removes paragraph attributes when setting the text
1006cdf0e10cSrcweir         //e.g. of a table cell
1007cdf0e10cSrcweir         sal_Bool bInsertNodes = sal_False;
1008cdf0e10cSrcweir         SwNodeIndex aStartIdx(*pStartNode);
1009cdf0e10cSrcweir         do
1010cdf0e10cSrcweir         {
1011cdf0e10cSrcweir             aStartIdx++;
1012cdf0e10cSrcweir             SwNode& rCurrentNode = aStartIdx.GetNode();
1013cdf0e10cSrcweir             if(rCurrentNode.GetNodeType() == ND_SECTIONNODE
1014cdf0e10cSrcweir                 ||rCurrentNode.GetNodeType() == ND_TABLENODE)
1015cdf0e10cSrcweir             {
1016cdf0e10cSrcweir                 bInsertNodes = sal_True;
1017cdf0e10cSrcweir                 break;
1018cdf0e10cSrcweir             }
1019cdf0e10cSrcweir         }
1020cdf0e10cSrcweir         while(aStartIdx < aEndIdx);
1021cdf0e10cSrcweir         if(bInsertNodes)
1022cdf0e10cSrcweir         {
1023cdf0e10cSrcweir             GetDoc()->AppendTxtNode( aStartPos );
1024cdf0e10cSrcweir             SwPosition aEndPos(aEndIdx.GetNode());
1025cdf0e10cSrcweir             SwPaM aPam(aEndPos);
1026cdf0e10cSrcweir             GetDoc()->AppendTxtNode( *aPam.Start() );
1027cdf0e10cSrcweir         }
1028cdf0e10cSrcweir     }
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir     const uno::Reference< text::XTextCursor > xRet = CreateCursor();
1031cdf0e10cSrcweir     if(!xRet.is())
1032cdf0e10cSrcweir     {
1033cdf0e10cSrcweir         GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_END, NULL);
1034cdf0e10cSrcweir         uno::RuntimeException aRuntime;
1035cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
1036cdf0e10cSrcweir         throw aRuntime;
1037cdf0e10cSrcweir     }
1038cdf0e10cSrcweir     xRet->gotoEnd(sal_True);
1039cdf0e10cSrcweir     xRet->setString(rString);
1040cdf0e10cSrcweir     GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_END, NULL);
1041cdf0e10cSrcweir }
1042cdf0e10cSrcweir 
1043cdf0e10cSrcweir //FIXME why is CheckForOwnMember duplicated in some insert methods?
1044cdf0e10cSrcweir //  Description: Checks if pRange/pCursor are member of the same text interface.
1045cdf0e10cSrcweir //              Only one of the pointers has to be set!
CheckForOwnMember(const SwPaM & rPaM)1046cdf0e10cSrcweir bool SwXText::Impl::CheckForOwnMember(
1047cdf0e10cSrcweir     const SwPaM & rPaM)
1048cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1049cdf0e10cSrcweir {
1050cdf0e10cSrcweir     const uno::Reference<text::XTextCursor> xOwnCursor(m_rThis.CreateCursor());
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xTunnel(xOwnCursor, uno::UNO_QUERY);
1053cdf0e10cSrcweir     OTextCursorHelper *const pOwnCursor =
1054cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xTunnel);
1055cdf0e10cSrcweir     DBG_ASSERT(pOwnCursor, "OTextCursorHelper::getUnoTunnelId() ??? ");
1056cdf0e10cSrcweir     const SwStartNode* pOwnStartNode =
1057cdf0e10cSrcweir         pOwnCursor->GetPaM()->GetNode()->StartOfSectionNode();
1058cdf0e10cSrcweir     SwStartNodeType eSearchNodeType = SwNormalStartNode;
1059cdf0e10cSrcweir     switch (m_eType)
1060cdf0e10cSrcweir     {
1061cdf0e10cSrcweir         case CURSOR_FRAME:      eSearchNodeType = SwFlyStartNode;       break;
1062cdf0e10cSrcweir         case CURSOR_TBLTEXT:    eSearchNodeType = SwTableBoxStartNode;  break;
1063cdf0e10cSrcweir         case CURSOR_FOOTNOTE:   eSearchNodeType = SwFootnoteStartNode;  break;
1064cdf0e10cSrcweir         case CURSOR_HEADER:     eSearchNodeType = SwHeaderStartNode;    break;
1065cdf0e10cSrcweir         case CURSOR_FOOTER:     eSearchNodeType = SwFooterStartNode;    break;
1066cdf0e10cSrcweir         //case CURSOR_INVALID:
1067cdf0e10cSrcweir         //case CURSOR_BODY:
1068cdf0e10cSrcweir         default:
1069cdf0e10cSrcweir             ;
1070cdf0e10cSrcweir     }
1071cdf0e10cSrcweir 
1072cdf0e10cSrcweir     SwNode const*const pSrcNode(rPaM.GetNode());
1073cdf0e10cSrcweir     if (!pSrcNode) { return false; }
1074cdf0e10cSrcweir     const SwStartNode* pTmp = pSrcNode->FindSttNodeByType(eSearchNodeType);
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir     //SectionNodes ueberspringen
1077cdf0e10cSrcweir     while(pTmp && pTmp->IsSectionNode())
1078cdf0e10cSrcweir     {
1079cdf0e10cSrcweir         pTmp = pTmp->StartOfSectionNode();
1080cdf0e10cSrcweir     }
1081cdf0e10cSrcweir 
1082cdf0e10cSrcweir     //if the document starts with a section
1083cdf0e10cSrcweir     while(pOwnStartNode->IsSectionNode())
1084cdf0e10cSrcweir     {
1085cdf0e10cSrcweir         pOwnStartNode = pOwnStartNode->StartOfSectionNode();
1086cdf0e10cSrcweir     }
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir     //this checks if (this) and xRange are in the same text::XText interface
1089cdf0e10cSrcweir     return (pOwnStartNode == pTmp);
1090cdf0e10cSrcweir }
1091cdf0e10cSrcweir 
1092cdf0e10cSrcweir sal_Int16
ComparePositions(const uno::Reference<text::XTextRange> & xPos1,const uno::Reference<text::XTextRange> & xPos2)1093cdf0e10cSrcweir SwXText::Impl::ComparePositions(
1094cdf0e10cSrcweir     const uno::Reference<text::XTextRange>& xPos1,
1095cdf0e10cSrcweir     const uno::Reference<text::XTextRange>& xPos2)
1096cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1097cdf0e10cSrcweir {
1098cdf0e10cSrcweir     SwUnoInternalPaM aPam1(*m_pDoc);
1099cdf0e10cSrcweir     SwUnoInternalPaM aPam2(*m_pDoc);
1100cdf0e10cSrcweir 
1101cdf0e10cSrcweir     if (!::sw::XTextRangeToSwPaM(aPam1, xPos1) ||
1102cdf0e10cSrcweir         !::sw::XTextRangeToSwPaM(aPam2, xPos2))
1103cdf0e10cSrcweir     {
1104cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1105cdf0e10cSrcweir     }
1106cdf0e10cSrcweir     if (!CheckForOwnMember(aPam1) || !CheckForOwnMember(aPam2))
1107cdf0e10cSrcweir     {
1108cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1109cdf0e10cSrcweir     }
1110cdf0e10cSrcweir 
1111cdf0e10cSrcweir     sal_Int16 nCompare = 0;
1112cdf0e10cSrcweir     SwPosition const*const pStart1 = aPam1.Start();
1113cdf0e10cSrcweir     SwPosition const*const pStart2 = aPam2.Start();
1114cdf0e10cSrcweir     if (*pStart1 < *pStart2)
1115cdf0e10cSrcweir     {
1116cdf0e10cSrcweir         nCompare = 1;
1117cdf0e10cSrcweir     }
1118cdf0e10cSrcweir     else if (*pStart1 > *pStart2)
1119cdf0e10cSrcweir     {
1120cdf0e10cSrcweir         nCompare = -1;
1121cdf0e10cSrcweir     }
1122cdf0e10cSrcweir     else
1123cdf0e10cSrcweir     {
1124cdf0e10cSrcweir         DBG_ASSERT(*pStart1 == *pStart2,
1125cdf0e10cSrcweir                 "SwPositions should be equal here");
1126cdf0e10cSrcweir         nCompare = 0;
1127cdf0e10cSrcweir     }
1128cdf0e10cSrcweir 
1129cdf0e10cSrcweir     return nCompare;
1130cdf0e10cSrcweir }
1131cdf0e10cSrcweir 
1132cdf0e10cSrcweir /*-- 28.03.00 10:37:22---------------------------------------------------
1133cdf0e10cSrcweir 
1134cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1135cdf0e10cSrcweir sal_Int16 SAL_CALL
compareRegionStarts(const uno::Reference<text::XTextRange> & xRange1,const uno::Reference<text::XTextRange> & xRange2)1136cdf0e10cSrcweir SwXText::compareRegionStarts(
1137cdf0e10cSrcweir     const uno::Reference<text::XTextRange>& xRange1,
1138cdf0e10cSrcweir     const uno::Reference<text::XTextRange>& xRange2)
1139cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1140cdf0e10cSrcweir {
1141cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
1142cdf0e10cSrcweir 
1143cdf0e10cSrcweir     if (!xRange1.is() || !xRange2.is())
1144cdf0e10cSrcweir     {
1145cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1146cdf0e10cSrcweir     }
1147cdf0e10cSrcweir     const uno::Reference<text::XTextRange> xStart1 = xRange1->getStart();
1148cdf0e10cSrcweir     const uno::Reference<text::XTextRange> xStart2 = xRange2->getStart();
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir     return m_pImpl->ComparePositions(xStart1, xStart2);
1151cdf0e10cSrcweir }
1152cdf0e10cSrcweir /*-- 28.03.00 10:37:25---------------------------------------------------
1153cdf0e10cSrcweir 
1154cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1155cdf0e10cSrcweir sal_Int16 SAL_CALL
compareRegionEnds(const uno::Reference<text::XTextRange> & xRange1,const uno::Reference<text::XTextRange> & xRange2)1156cdf0e10cSrcweir SwXText::compareRegionEnds(
1157cdf0e10cSrcweir     const uno::Reference<text::XTextRange>& xRange1,
1158cdf0e10cSrcweir     const uno::Reference<text::XTextRange>& xRange2)
1159cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
1162cdf0e10cSrcweir 
1163cdf0e10cSrcweir     if (!xRange1.is() || !xRange2.is())
1164cdf0e10cSrcweir     {
1165cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1166cdf0e10cSrcweir     }
1167cdf0e10cSrcweir     uno::Reference<text::XTextRange> xEnd1 = xRange1->getEnd();
1168cdf0e10cSrcweir     uno::Reference<text::XTextRange> xEnd2 = xRange2->getEnd();
1169cdf0e10cSrcweir 
1170cdf0e10cSrcweir     return m_pImpl->ComparePositions(xEnd1, xEnd2);
1171cdf0e10cSrcweir }
1172cdf0e10cSrcweir 
1173cdf0e10cSrcweir /*-- 15.03.2002 12:30:40---------------------------------------------------
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1176cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()1177cdf0e10cSrcweir SwXText::getPropertySetInfo() throw(uno::RuntimeException)
1178cdf0e10cSrcweir {
1179cdf0e10cSrcweir     vos::OGuard g(Application::GetSolarMutex());
1180cdf0e10cSrcweir 
1181cdf0e10cSrcweir     static uno::Reference< beans::XPropertySetInfo > xInfo =
1182cdf0e10cSrcweir         m_pImpl->m_rPropSet.getPropertySetInfo();
1183cdf0e10cSrcweir     return xInfo;
1184cdf0e10cSrcweir }
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir /*-- 15.03.2002 12:30:42---------------------------------------------------
1187cdf0e10cSrcweir 
1188cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1189cdf0e10cSrcweir void SAL_CALL
setPropertyValue(const::rtl::OUString &,const uno::Any &)1190cdf0e10cSrcweir SwXText::setPropertyValue(const ::rtl::OUString& /*aPropertyName*/,
1191cdf0e10cSrcweir         const uno::Any& /*aValue*/)
1192cdf0e10cSrcweir throw (beans::UnknownPropertyException, beans::PropertyVetoException,
1193cdf0e10cSrcweir     lang::IllegalArgumentException, lang::WrappedTargetException,
1194cdf0e10cSrcweir     uno::RuntimeException)
1195cdf0e10cSrcweir {
1196cdf0e10cSrcweir     throw lang::IllegalArgumentException();
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir /*-- 15.03.2002 12:30:42---------------------------------------------------
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1201cdf0e10cSrcweir uno::Any SAL_CALL
getPropertyValue(const::rtl::OUString & rPropertyName)1202cdf0e10cSrcweir SwXText::getPropertyValue(
1203cdf0e10cSrcweir     const ::rtl::OUString& rPropertyName)
1204cdf0e10cSrcweir throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1205cdf0e10cSrcweir         uno::RuntimeException)
1206cdf0e10cSrcweir {
1207cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
1208cdf0e10cSrcweir 
1209cdf0e10cSrcweir     if(!IsValid())
1210cdf0e10cSrcweir     {
1211cdf0e10cSrcweir         throw  uno::RuntimeException();
1212cdf0e10cSrcweir     }
1213cdf0e10cSrcweir 
1214cdf0e10cSrcweir     SfxItemPropertySimpleEntry const*const pEntry =
1215cdf0e10cSrcweir         m_pImpl->m_rPropSet.getPropertyMap()->getByName(rPropertyName);
1216cdf0e10cSrcweir     if (!pEntry)
1217cdf0e10cSrcweir     {
1218cdf0e10cSrcweir         beans::UnknownPropertyException aExcept;
1219cdf0e10cSrcweir         aExcept.Message = C2U("Unknown property: ");
1220cdf0e10cSrcweir         aExcept.Message += rPropertyName;
1221cdf0e10cSrcweir         throw aExcept;
1222cdf0e10cSrcweir     }
1223cdf0e10cSrcweir 
1224cdf0e10cSrcweir     uno::Any aRet;
1225cdf0e10cSrcweir     switch (pEntry->nWID)
1226cdf0e10cSrcweir     {
1227cdf0e10cSrcweir //          no code necessary - the redline is always located at the end node
1228cdf0e10cSrcweir //            case FN_UNO_REDLINE_NODE_START:
1229cdf0e10cSrcweir //            break;
1230cdf0e10cSrcweir         case FN_UNO_REDLINE_NODE_END:
1231cdf0e10cSrcweir         {
1232cdf0e10cSrcweir             const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl();
1233cdf0e10cSrcweir             const sal_uInt16 nRedTblCount = rRedTbl.Count();
1234cdf0e10cSrcweir             if (nRedTblCount > 0)
1235cdf0e10cSrcweir             {
1236cdf0e10cSrcweir                 SwStartNode const*const pStartNode = GetStartNode();
1237cdf0e10cSrcweir                 const sal_uLong nOwnIndex = pStartNode->EndOfSectionIndex();
1238cdf0e10cSrcweir                 for (sal_uInt16 nRed = 0; nRed < nRedTblCount; nRed++)
1239cdf0e10cSrcweir                 {
1240cdf0e10cSrcweir                     SwRedline const*const pRedline = rRedTbl[nRed];
1241cdf0e10cSrcweir                     SwPosition const*const pRedStart = pRedline->Start();
1242cdf0e10cSrcweir                     const SwNodeIndex nRedNode = pRedStart->nNode;
1243cdf0e10cSrcweir                     if (nOwnIndex == nRedNode.GetIndex())
1244cdf0e10cSrcweir                     {
1245cdf0e10cSrcweir                         aRet <<= SwXRedlinePortion::CreateRedlineProperties(
1246cdf0e10cSrcweir                                 *pRedline, sal_True);
1247cdf0e10cSrcweir                         break;
1248cdf0e10cSrcweir                     }
1249cdf0e10cSrcweir                 }
1250cdf0e10cSrcweir             }
1251cdf0e10cSrcweir         }
1252cdf0e10cSrcweir         break;
1253cdf0e10cSrcweir     }
1254cdf0e10cSrcweir     return aRet;
1255cdf0e10cSrcweir }
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir /*-- 15.03.2002 12:30:42---------------------------------------------------
1258cdf0e10cSrcweir 
1259cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1260cdf0e10cSrcweir void SAL_CALL
addPropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)1261cdf0e10cSrcweir SwXText::addPropertyChangeListener(
1262cdf0e10cSrcweir         const ::rtl::OUString& /*rPropertyName*/,
1263cdf0e10cSrcweir         const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
1264cdf0e10cSrcweir throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1265cdf0e10cSrcweir     uno::RuntimeException)
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir     OSL_ENSURE(false,
1268cdf0e10cSrcweir         "SwXText::addPropertyChangeListener(): not implemented");
1269cdf0e10cSrcweir }
1270cdf0e10cSrcweir /*-- 15.03.2002 12:30:43---------------------------------------------------
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1273cdf0e10cSrcweir void SAL_CALL
removePropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)1274cdf0e10cSrcweir SwXText::removePropertyChangeListener(
1275cdf0e10cSrcweir         const ::rtl::OUString& /*rPropertyName*/,
1276cdf0e10cSrcweir         const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
1277cdf0e10cSrcweir throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1278cdf0e10cSrcweir     uno::RuntimeException)
1279cdf0e10cSrcweir {
1280cdf0e10cSrcweir     OSL_ENSURE(false,
1281cdf0e10cSrcweir         "SwXText::removePropertyChangeListener(): not implemented");
1282cdf0e10cSrcweir }
1283cdf0e10cSrcweir /*-- 15.03.2002 12:30:43---------------------------------------------------
1284cdf0e10cSrcweir 
1285cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1286cdf0e10cSrcweir void SAL_CALL
addVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1287cdf0e10cSrcweir SwXText::addVetoableChangeListener(
1288cdf0e10cSrcweir         const ::rtl::OUString& /*rPropertyName*/,
1289cdf0e10cSrcweir         const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
1290cdf0e10cSrcweir throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1291cdf0e10cSrcweir     uno::RuntimeException)
1292cdf0e10cSrcweir {
1293cdf0e10cSrcweir     OSL_ENSURE(false,
1294cdf0e10cSrcweir         "SwXText::addVetoableChangeListener(): not implemented");
1295cdf0e10cSrcweir }
1296cdf0e10cSrcweir /*-- 15.03.2002 12:30:43---------------------------------------------------
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1299cdf0e10cSrcweir void SAL_CALL
removeVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1300cdf0e10cSrcweir SwXText::removeVetoableChangeListener(
1301cdf0e10cSrcweir         const ::rtl::OUString& /*rPropertyName*/,
1302cdf0e10cSrcweir         const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
1303cdf0e10cSrcweir throw (beans::UnknownPropertyException, lang::WrappedTargetException,
1304cdf0e10cSrcweir         uno::RuntimeException)
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir     OSL_ENSURE(false,
1307cdf0e10cSrcweir         "SwXText::removeVetoableChangeListener(): not implemented");
1308cdf0e10cSrcweir }
1309cdf0e10cSrcweir 
1310cdf0e10cSrcweir /* -----------------------------08.01.01 09:07--------------------------------
1311cdf0e10cSrcweir 
1312cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
getUnoTunnelId()1313cdf0e10cSrcweir const uno::Sequence< sal_Int8 > & SwXText::getUnoTunnelId()
1314cdf0e10cSrcweir {
1315cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
1316cdf0e10cSrcweir     return aSeq;
1317cdf0e10cSrcweir }
1318cdf0e10cSrcweir /* -----------------------------08.01.01 09:07--------------------------------
1319cdf0e10cSrcweir 
1320cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
1321cdf0e10cSrcweir sal_Int64 SAL_CALL
getSomething(const uno::Sequence<sal_Int8> & rId)1322cdf0e10cSrcweir SwXText::getSomething(const uno::Sequence< sal_Int8 >& rId)
1323cdf0e10cSrcweir throw (uno::RuntimeException)
1324cdf0e10cSrcweir {
1325cdf0e10cSrcweir     return ::sw::UnoTunnelImpl<SwXText>(rId, this);
1326cdf0e10cSrcweir }
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir /*-- 23.06.2006 08:56:30---------------------------------------------------
1329cdf0e10cSrcweir 
1330cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1331cdf0e10cSrcweir uno::Reference< text::XTextRange > SAL_CALL
appendParagraph(const uno::Sequence<beans::PropertyValue> & rProperties)1332cdf0e10cSrcweir SwXText::appendParagraph(
1333cdf0e10cSrcweir         const uno::Sequence< beans::PropertyValue > & rProperties)
1334cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1335cdf0e10cSrcweir {
1336cdf0e10cSrcweir     vos::OGuard g(Application::GetSolarMutex());
1337cdf0e10cSrcweir 
1338cdf0e10cSrcweir     return m_pImpl->finishOrAppendParagraph(false, rProperties);
1339cdf0e10cSrcweir }
1340cdf0e10cSrcweir /*-- 23.06.2006 08:56:22---------------------------------------------------
1341cdf0e10cSrcweir 
1342cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1343cdf0e10cSrcweir uno::Reference< text::XTextRange > SAL_CALL
finishParagraph(const uno::Sequence<beans::PropertyValue> & rProperties)1344cdf0e10cSrcweir SwXText::finishParagraph(
1345cdf0e10cSrcweir         const uno::Sequence< beans::PropertyValue > & rProperties)
1346cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1347cdf0e10cSrcweir {
1348cdf0e10cSrcweir     vos::OGuard g(Application::GetSolarMutex());
1349cdf0e10cSrcweir 
1350cdf0e10cSrcweir     return m_pImpl->finishOrAppendParagraph(true, rProperties);
1351cdf0e10cSrcweir }
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir /*-- 08.05.2006 13:26:26---------------------------------------------------
1354cdf0e10cSrcweir 
1355cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1356cdf0e10cSrcweir uno::Reference< text::XTextRange >
finishOrAppendParagraph(const bool bFinish,const uno::Sequence<beans::PropertyValue> & rProperties)1357cdf0e10cSrcweir SwXText::Impl::finishOrAppendParagraph(
1358cdf0e10cSrcweir         const bool bFinish,
1359cdf0e10cSrcweir         const uno::Sequence< beans::PropertyValue > & rProperties)
1360cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1361cdf0e10cSrcweir {
1362cdf0e10cSrcweir     if (!m_bIsValid)
1363cdf0e10cSrcweir     {
1364cdf0e10cSrcweir         throw  uno::RuntimeException();
1365cdf0e10cSrcweir     }
1366cdf0e10cSrcweir 
1367cdf0e10cSrcweir     const SwStartNode* pStartNode = m_rThis.GetStartNode();
1368cdf0e10cSrcweir     if(!pStartNode)
1369cdf0e10cSrcweir     {
1370cdf0e10cSrcweir         throw  uno::RuntimeException();
1371cdf0e10cSrcweir     }
1372cdf0e10cSrcweir 
1373cdf0e10cSrcweir     uno::Reference< text::XTextRange > xRet;
1374cdf0e10cSrcweir     bool bIllegalException = false;
1375cdf0e10cSrcweir     bool bRuntimeException = false;
1376cdf0e10cSrcweir     ::rtl::OUString sMessage;
1377cdf0e10cSrcweir     m_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_START , NULL);
1378cdf0e10cSrcweir     // find end node, go backward - don't skip tables because the new
1379cdf0e10cSrcweir     // paragraph has to be the last node
1380cdf0e10cSrcweir     //aPam.Move( fnMoveBackward, fnGoNode );
1381cdf0e10cSrcweir     SwPosition aInsertPosition(
1382cdf0e10cSrcweir             SwNodeIndex( *pStartNode->EndOfSectionNode(), -1 ) );
1383cdf0e10cSrcweir     SwPaM aPam(aInsertPosition);
1384cdf0e10cSrcweir     m_pDoc->AppendTxtNode( *aPam.GetPoint() );
1385cdf0e10cSrcweir     // remove attributes from the previous paragraph
1386cdf0e10cSrcweir     m_pDoc->ResetAttrs(aPam);
1387cdf0e10cSrcweir     // in case of finishParagraph the PaM needs to be moved to the
1388cdf0e10cSrcweir     // previous paragraph
1389cdf0e10cSrcweir     if (bFinish)
1390cdf0e10cSrcweir     {
1391cdf0e10cSrcweir         aPam.Move( fnMoveBackward, fnGoNode );
1392cdf0e10cSrcweir     }
1393cdf0e10cSrcweir     if (rProperties.getLength())
1394cdf0e10cSrcweir     {
1395cdf0e10cSrcweir         // now set the properties
1396cdf0e10cSrcweir         SfxItemPropertySet const*const pParaPropSet =
1397cdf0e10cSrcweir             aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH);
1398cdf0e10cSrcweir         SfxItemPropertyMap const*const pParagraphMap =
1399cdf0e10cSrcweir             pParaPropSet->getPropertyMap();
1400cdf0e10cSrcweir 
1401cdf0e10cSrcweir         const beans::PropertyValue* pValues = rProperties.getConstArray();
1402cdf0e10cSrcweir 
1403cdf0e10cSrcweir         for (sal_Int32 nProp = 0; nProp < rProperties.getLength(); ++nProp)
1404cdf0e10cSrcweir         {
1405cdf0e10cSrcweir             if (!pParagraphMap->getByName(pValues[nProp].Name))
1406cdf0e10cSrcweir             {
1407cdf0e10cSrcweir                 bIllegalException = true;
1408cdf0e10cSrcweir                 break;
1409cdf0e10cSrcweir             }
1410cdf0e10cSrcweir             try
1411cdf0e10cSrcweir             {
1412cdf0e10cSrcweir                 SwUnoCursorHelper::SetPropertyValue(aPam, *pParaPropSet,
1413cdf0e10cSrcweir                     pValues[nProp].Name, pValues[nProp].Value);
1414cdf0e10cSrcweir             }
1415cdf0e10cSrcweir             catch (lang::IllegalArgumentException& rIllegal)
1416cdf0e10cSrcweir             {
1417cdf0e10cSrcweir                 sMessage = rIllegal.Message;
1418cdf0e10cSrcweir                 bIllegalException = true;
1419cdf0e10cSrcweir                 break;
1420cdf0e10cSrcweir             }
1421cdf0e10cSrcweir             catch (uno::RuntimeException& rRuntime)
1422cdf0e10cSrcweir             {
1423cdf0e10cSrcweir                 sMessage = rRuntime.Message;
1424cdf0e10cSrcweir                 bRuntimeException = true;
1425cdf0e10cSrcweir                 break;
1426cdf0e10cSrcweir             }
1427cdf0e10cSrcweir         }
1428cdf0e10cSrcweir     }
1429cdf0e10cSrcweir     m_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_END, NULL);
1430cdf0e10cSrcweir     if (bIllegalException || bRuntimeException)
1431cdf0e10cSrcweir     {
1432cdf0e10cSrcweir         m_pDoc->GetIDocumentUndoRedo().Undo();
1433cdf0e10cSrcweir         if (bIllegalException)
1434cdf0e10cSrcweir         {
1435cdf0e10cSrcweir             lang::IllegalArgumentException aEx;
1436cdf0e10cSrcweir             aEx.Message = sMessage;
1437cdf0e10cSrcweir             throw aEx;
1438cdf0e10cSrcweir         }
1439cdf0e10cSrcweir         else // if(bRuntimeException)
1440cdf0e10cSrcweir         {
1441cdf0e10cSrcweir             uno::RuntimeException aEx;
1442cdf0e10cSrcweir             aEx.Message = sMessage;
1443cdf0e10cSrcweir             throw aEx;
1444cdf0e10cSrcweir         }
1445cdf0e10cSrcweir     }
1446cdf0e10cSrcweir     SwTxtNode *const pTxtNode( aPam.Start()->nNode.GetNode().GetTxtNode() );
1447cdf0e10cSrcweir     OSL_ENSURE(pTxtNode, "no SwTxtNode?");
1448cdf0e10cSrcweir     if (pTxtNode)
1449cdf0e10cSrcweir     {
1450cdf0e10cSrcweir         xRet.set(SwXParagraph::CreateXParagraph(*m_pDoc, *pTxtNode, &m_rThis),
1451cdf0e10cSrcweir                 uno::UNO_QUERY);
1452cdf0e10cSrcweir     }
1453cdf0e10cSrcweir 
1454cdf0e10cSrcweir     return xRet;
1455cdf0e10cSrcweir }
1456cdf0e10cSrcweir 
1457cdf0e10cSrcweir /*-- 08.05.2006 13:28:26---------------------------------------------------
1458cdf0e10cSrcweir     Append text portions at the end of the last paragraph of the text
1459cdf0e10cSrcweir     interface. Support of import filters.
1460cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1461cdf0e10cSrcweir uno::Reference< text::XTextRange > SAL_CALL
appendTextPortion(const::rtl::OUString & rText,const uno::Sequence<beans::PropertyValue> & rCharacterAndParagraphProperties)1462cdf0e10cSrcweir SwXText::appendTextPortion(
1463cdf0e10cSrcweir         const ::rtl::OUString& rText,
1464cdf0e10cSrcweir         const uno::Sequence< beans::PropertyValue > &
1465cdf0e10cSrcweir             rCharacterAndParagraphProperties)
1466cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1467cdf0e10cSrcweir {
1468cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
1469cdf0e10cSrcweir 
1470cdf0e10cSrcweir     if(!IsValid())
1471cdf0e10cSrcweir     {
1472cdf0e10cSrcweir         throw  uno::RuntimeException();
1473cdf0e10cSrcweir     }
1474cdf0e10cSrcweir     uno::Reference< text::XTextRange > xRet;
1475cdf0e10cSrcweir     const uno::Reference< text::XTextCursor > xTextCursor = CreateCursor();
1476cdf0e10cSrcweir     xTextCursor->gotoEnd(sal_False);
1477cdf0e10cSrcweir 
1478cdf0e10cSrcweir     const uno::Reference< lang::XUnoTunnel > xRangeTunnel(
1479cdf0e10cSrcweir             xTextCursor, uno::UNO_QUERY_THROW );
1480cdf0e10cSrcweir     SwXTextCursor *const pTextCursor =
1481cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXTextCursor>(xRangeTunnel);
1482cdf0e10cSrcweir 
1483cdf0e10cSrcweir     bool bIllegalException = false;
1484cdf0e10cSrcweir     bool bRuntimeException = false;
1485cdf0e10cSrcweir     ::rtl::OUString sMessage;
1486cdf0e10cSrcweir     m_pImpl->m_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_INSERT, NULL);
1487cdf0e10cSrcweir 
1488cdf0e10cSrcweir //        SwPaM aPam(*pStartNode->EndOfSectionNode());
1489cdf0e10cSrcweir     //aPam.Move( fnMoveBackward, fnGoNode );
1490cdf0e10cSrcweir     SwUnoCrsr *const pCursor = pTextCursor->GetCursor();
1491cdf0e10cSrcweir     pCursor->MovePara( fnParaCurr, fnParaEnd );
1492cdf0e10cSrcweir     m_pImpl->m_pDoc->DontExpandFmt( *pCursor->Start() );
1493cdf0e10cSrcweir 
1494cdf0e10cSrcweir     if (rText.getLength())
1495cdf0e10cSrcweir     {
1496cdf0e10cSrcweir         const xub_StrLen nContentPos = pCursor->GetPoint()->nContent.GetIndex();
1497cdf0e10cSrcweir         SwUnoCursorHelper::DocInsertStringSplitCR(
1498cdf0e10cSrcweir             *m_pImpl->m_pDoc, *pCursor, rText, false);
1499cdf0e10cSrcweir         SwUnoCursorHelper::SelectPam(*pCursor, true);
1500cdf0e10cSrcweir         pCursor->GetPoint()->nContent = nContentPos;
1501cdf0e10cSrcweir     }
1502cdf0e10cSrcweir 
1503cdf0e10cSrcweir     if (rCharacterAndParagraphProperties.getLength())
1504cdf0e10cSrcweir     {
1505cdf0e10cSrcweir         SfxItemPropertyMap const*const pCursorMap =
1506cdf0e10cSrcweir             aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR)
1507cdf0e10cSrcweir                 ->getPropertyMap();
1508cdf0e10cSrcweir         beans::PropertyValue const*const pValues =
1509cdf0e10cSrcweir             rCharacterAndParagraphProperties.getConstArray();
1510cdf0e10cSrcweir         SfxItemPropertySet const*const pCursorPropSet =
1511cdf0e10cSrcweir             aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR);
1512cdf0e10cSrcweir         const sal_Int32 nLen(rCharacterAndParagraphProperties.getLength());
1513cdf0e10cSrcweir         for (sal_Int32 nProp = 0; nProp < nLen; ++nProp)
1514cdf0e10cSrcweir         {
1515cdf0e10cSrcweir             if (!pCursorMap->getByName( pValues[nProp].Name ))
1516cdf0e10cSrcweir             {
1517cdf0e10cSrcweir                 bIllegalException = true;
1518cdf0e10cSrcweir                 break;
1519cdf0e10cSrcweir             }
1520cdf0e10cSrcweir             try
1521cdf0e10cSrcweir             {
1522cdf0e10cSrcweir                 SwUnoCursorHelper::SetPropertyValue(
1523cdf0e10cSrcweir                     *pCursor, *pCursorPropSet,
1524cdf0e10cSrcweir                     pValues[nProp].Name, pValues[nProp].Value,
1525cdf0e10cSrcweir                     nsSetAttrMode::SETATTR_NOFORMATATTR);
1526cdf0e10cSrcweir             }
1527cdf0e10cSrcweir             catch( lang::IllegalArgumentException& rIllegal )
1528cdf0e10cSrcweir             {
1529cdf0e10cSrcweir                 sMessage = rIllegal.Message;
1530cdf0e10cSrcweir                 bIllegalException = true;
1531cdf0e10cSrcweir                 break;
1532cdf0e10cSrcweir             }
1533cdf0e10cSrcweir             catch( uno::RuntimeException& rRuntime )
1534cdf0e10cSrcweir             {
1535cdf0e10cSrcweir                 sMessage = rRuntime.Message;
1536cdf0e10cSrcweir                 bRuntimeException = true;
1537cdf0e10cSrcweir                 break;
1538cdf0e10cSrcweir             }
1539cdf0e10cSrcweir         }
1540cdf0e10cSrcweir     }
1541cdf0e10cSrcweir     m_pImpl->m_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_INSERT, NULL);
1542cdf0e10cSrcweir     if (bIllegalException || bRuntimeException)
1543cdf0e10cSrcweir     {
1544cdf0e10cSrcweir         m_pImpl->m_pDoc->GetIDocumentUndoRedo().Undo();
1545cdf0e10cSrcweir         if (bIllegalException)
1546cdf0e10cSrcweir         {
1547cdf0e10cSrcweir             lang::IllegalArgumentException aEx;
1548cdf0e10cSrcweir             aEx.Message = sMessage;
1549cdf0e10cSrcweir             throw aEx;
1550cdf0e10cSrcweir         }
1551cdf0e10cSrcweir         else //if(bRuntimeException)
1552cdf0e10cSrcweir         {
1553cdf0e10cSrcweir             uno::RuntimeException aEx;
1554cdf0e10cSrcweir             aEx.Message = sMessage;
1555cdf0e10cSrcweir             throw aEx;
1556cdf0e10cSrcweir         }
1557cdf0e10cSrcweir     }
1558cdf0e10cSrcweir     xRet = new SwXTextRange(*pCursor, this);
1559cdf0e10cSrcweir     return xRet;
1560cdf0e10cSrcweir }
1561cdf0e10cSrcweir 
1562cdf0e10cSrcweir /*-- 11.05.2006 15:46:26---------------------------------------------------
1563cdf0e10cSrcweir     enable appending text contents like graphic objects, shapes and so on
1564cdf0e10cSrcweir     to support import filters
1565cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1566cdf0e10cSrcweir uno::Reference< text::XTextRange > SAL_CALL
appendTextContent(const uno::Reference<text::XTextContent> & xTextContent,const uno::Sequence<beans::PropertyValue> & rCharacterAndParagraphProperties)1567cdf0e10cSrcweir SwXText::appendTextContent(
1568cdf0e10cSrcweir     const uno::Reference< text::XTextContent >& xTextContent,
1569cdf0e10cSrcweir     const uno::Sequence< beans::PropertyValue >&
1570cdf0e10cSrcweir         rCharacterAndParagraphProperties)
1571cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1572cdf0e10cSrcweir {
1573cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir     if (!IsValid())
1576cdf0e10cSrcweir     {
1577cdf0e10cSrcweir         throw  uno::RuntimeException();
1578cdf0e10cSrcweir     }
1579cdf0e10cSrcweir     SwStartNode const*const pStartNode = GetStartNode();
1580cdf0e10cSrcweir     if(!pStartNode)
1581cdf0e10cSrcweir     {
1582cdf0e10cSrcweir         throw  uno::RuntimeException();
1583cdf0e10cSrcweir     }
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir     uno::Reference< text::XTextRange > xRet;
1586cdf0e10cSrcweir     m_pImpl->m_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_INSERT, NULL);
1587cdf0e10cSrcweir     // find end node, go backward - don't skip tables because the
1588cdf0e10cSrcweir     // new paragraph has to be the last node
1589cdf0e10cSrcweir     SwPaM aPam(*pStartNode->EndOfSectionNode());
1590cdf0e10cSrcweir     aPam.Move( fnMoveBackward, fnGoNode );
1591cdf0e10cSrcweir     // set cursor to the end of the last text node
1592cdf0e10cSrcweir     SwCursor aCursor( *aPam.Start(), 0, false );
1593cdf0e10cSrcweir     xRet = new SwXTextRange(aCursor, this);
1594cdf0e10cSrcweir     aCursor.MovePara( fnParaCurr, fnParaEnd );
1595cdf0e10cSrcweir     m_pImpl->m_pDoc->DontExpandFmt( *aCursor.Start() );
1596cdf0e10cSrcweir     // now attach the text content here
1597cdf0e10cSrcweir     insertTextContent( xRet, xTextContent, false );
1598cdf0e10cSrcweir     // now apply the properties to the anchor
1599cdf0e10cSrcweir     if (rCharacterAndParagraphProperties.getLength())
1600cdf0e10cSrcweir     {
1601cdf0e10cSrcweir         try
1602cdf0e10cSrcweir         {
1603cdf0e10cSrcweir             const sal_Int32 nLen(rCharacterAndParagraphProperties.getLength());
1604cdf0e10cSrcweir             const uno::Reference< beans::XPropertySet > xAnchor(
1605cdf0e10cSrcweir                 xTextContent->getAnchor(), uno::UNO_QUERY);
1606cdf0e10cSrcweir             if (xAnchor.is())
1607cdf0e10cSrcweir             {
1608cdf0e10cSrcweir                 for (sal_Int32 nElement = 0; nElement < nLen; ++nElement)
1609cdf0e10cSrcweir                 {
1610cdf0e10cSrcweir                     xAnchor->setPropertyValue(
1611cdf0e10cSrcweir                         rCharacterAndParagraphProperties[nElement].Name,
1612cdf0e10cSrcweir                         rCharacterAndParagraphProperties[nElement].Value);
1613cdf0e10cSrcweir                 }
1614cdf0e10cSrcweir             }
1615cdf0e10cSrcweir         }
1616cdf0e10cSrcweir         catch (const uno::Exception&)
1617cdf0e10cSrcweir         {
1618cdf0e10cSrcweir             throw uno::RuntimeException();
1619cdf0e10cSrcweir         }
1620cdf0e10cSrcweir     }
1621cdf0e10cSrcweir     m_pImpl->m_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_INSERT, NULL);
1622cdf0e10cSrcweir     return xRet;
1623cdf0e10cSrcweir }
1624cdf0e10cSrcweir 
1625cdf0e10cSrcweir // move previously appended paragraphs into a text frames
1626cdf0e10cSrcweir // to support import filters
1627cdf0e10cSrcweir uno::Reference< text::XTextContent > SAL_CALL
convertToTextFrame(const uno::Reference<text::XTextRange> & xStart,const uno::Reference<text::XTextRange> & xEnd,const uno::Sequence<beans::PropertyValue> & rFrameProperties)1628cdf0e10cSrcweir SwXText::convertToTextFrame(
1629cdf0e10cSrcweir     const uno::Reference< text::XTextRange >& xStart,
1630cdf0e10cSrcweir     const uno::Reference< text::XTextRange >& xEnd,
1631cdf0e10cSrcweir     const uno::Sequence< beans::PropertyValue >& rFrameProperties)
1632cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
1635cdf0e10cSrcweir 
1636cdf0e10cSrcweir     if(!IsValid())
1637cdf0e10cSrcweir     {
1638cdf0e10cSrcweir         throw  uno::RuntimeException();
1639cdf0e10cSrcweir     }
1640cdf0e10cSrcweir     uno::Reference< text::XTextContent > xRet;
1641cdf0e10cSrcweir     SwUnoInternalPaM aStartPam(*GetDoc());
1642cdf0e10cSrcweir     std::auto_ptr< SwUnoInternalPaM > pEndPam(new SwUnoInternalPaM(*GetDoc()));
1643cdf0e10cSrcweir     if (!::sw::XTextRangeToSwPaM(aStartPam, xStart) ||
1644cdf0e10cSrcweir         !::sw::XTextRangeToSwPaM(*pEndPam, xEnd))
1645cdf0e10cSrcweir     {
1646cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1647cdf0e10cSrcweir     }
1648cdf0e10cSrcweir 
1649cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xStartRangeTunnel(xStart,
1650cdf0e10cSrcweir             uno::UNO_QUERY);
1651cdf0e10cSrcweir     SwXTextRange *const pStartRange =
1652cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXTextRange>(xStartRangeTunnel);
1653cdf0e10cSrcweir     const uno::Reference<lang::XUnoTunnel> xEndRangeTunnel(xEnd,
1654cdf0e10cSrcweir             uno::UNO_QUERY);
1655cdf0e10cSrcweir     SwXTextRange *const pEndRange   =
1656cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<SwXTextRange>(xEndRangeTunnel);
1657cdf0e10cSrcweir     // bookmarks have to be removed before the referenced text node
1658cdf0e10cSrcweir     // is deleted in DelFullPara
1659cdf0e10cSrcweir     if (pStartRange)
1660cdf0e10cSrcweir     {
1661cdf0e10cSrcweir         pStartRange->Invalidate();
1662cdf0e10cSrcweir     }
1663cdf0e10cSrcweir     if (pEndRange)
1664cdf0e10cSrcweir     {
1665cdf0e10cSrcweir         pEndRange->Invalidate();
1666cdf0e10cSrcweir     }
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir     m_pImpl->m_pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
1669cdf0e10cSrcweir     bool bIllegalException = false;
1670cdf0e10cSrcweir     bool bRuntimeException = false;
1671cdf0e10cSrcweir     ::rtl::OUString sMessage;
1672cdf0e10cSrcweir     SwStartNode* pStartStartNode = aStartPam.GetNode()->StartOfSectionNode();
1673cdf0e10cSrcweir     while (pStartStartNode && pStartStartNode->IsSectionNode())
1674cdf0e10cSrcweir     {
1675cdf0e10cSrcweir         pStartStartNode = pStartStartNode->StartOfSectionNode();
1676cdf0e10cSrcweir     }
1677cdf0e10cSrcweir     SwStartNode* pEndStartNode = pEndPam->GetNode()->StartOfSectionNode();
1678cdf0e10cSrcweir     while (pEndStartNode && pEndStartNode->IsSectionNode())
1679cdf0e10cSrcweir     {
1680cdf0e10cSrcweir         pEndStartNode = pEndStartNode->StartOfSectionNode();
1681cdf0e10cSrcweir     }
1682cdf0e10cSrcweir     bool bParaAfterInserted = false;
1683cdf0e10cSrcweir     bool bParaBeforeInserted = false;
1684cdf0e10cSrcweir     if (pStartStartNode != pEndStartNode || pStartStartNode != GetStartNode())
1685cdf0e10cSrcweir     {
1686cdf0e10cSrcweir         // todo: if the start/end is in a table then insert a paragraph
1687cdf0e10cSrcweir         // before/after, move the start/end nodes, then convert and
168886e1cf34SPedro Giffuni         // remove the additional paragraphs in the end
1689cdf0e10cSrcweir         if (pStartStartNode->GetStartNodeType() == SwTableBoxStartNode)
1690cdf0e10cSrcweir         {
1691cdf0e10cSrcweir             SwTableNode *const pSartTableNode(pStartStartNode->FindTableNode());
1692cdf0e10cSrcweir             const SwNodeIndex aTblIdx(  *pSartTableNode, -1 );
1693cdf0e10cSrcweir             SwPosition aBefore(aTblIdx);
1694cdf0e10cSrcweir             bParaBeforeInserted = GetDoc()->AppendTxtNode( aBefore );
1695cdf0e10cSrcweir             aStartPam.DeleteMark();
1696cdf0e10cSrcweir             *aStartPam.GetPoint() = aBefore;
1697cdf0e10cSrcweir             pStartStartNode = aStartPam.GetNode()->StartOfSectionNode();
1698cdf0e10cSrcweir         }
1699cdf0e10cSrcweir         if (pEndStartNode->GetStartNodeType() == SwTableBoxStartNode)
1700cdf0e10cSrcweir         {
1701cdf0e10cSrcweir             SwTableNode *const pEndTableNode = pEndStartNode->FindTableNode();
1702cdf0e10cSrcweir             SwEndNode *const pTableEnd = pEndTableNode->EndOfSectionNode();
1703cdf0e10cSrcweir             SwPosition aTableEnd(*pTableEnd);
1704cdf0e10cSrcweir             bParaAfterInserted = GetDoc()->AppendTxtNode( aTableEnd );
1705cdf0e10cSrcweir             pEndPam->DeleteMark();
1706cdf0e10cSrcweir             *pEndPam->GetPoint() = aTableEnd;
1707cdf0e10cSrcweir             pEndStartNode = pEndPam->GetNode()->StartOfSectionNode();
1708cdf0e10cSrcweir         }
1709cdf0e10cSrcweir         // now we should have the positions in the same hierarchy
1710cdf0e10cSrcweir         if ((pStartStartNode != pEndStartNode) ||
1711cdf0e10cSrcweir             (pStartStartNode != GetStartNode()))
1712cdf0e10cSrcweir         {
1713cdf0e10cSrcweir             // if not - remove the additional paragraphs and throw
1714cdf0e10cSrcweir             if (bParaBeforeInserted)
1715cdf0e10cSrcweir             {
1716cdf0e10cSrcweir                 SwCursor aDelete(*aStartPam.GetPoint(), 0, false);
1717cdf0e10cSrcweir                 aDelete.MovePara(fnParaCurr, fnParaStart);
1718cdf0e10cSrcweir                 aDelete.SetMark();
1719cdf0e10cSrcweir                 aDelete.MovePara(fnParaCurr, fnParaEnd);
1720cdf0e10cSrcweir                 GetDoc()->DelFullPara(aDelete);
1721cdf0e10cSrcweir             }
1722cdf0e10cSrcweir             if (bParaAfterInserted)
1723cdf0e10cSrcweir             {
1724cdf0e10cSrcweir                 SwCursor aDelete(*pEndPam->GetPoint(), 0, false);
1725cdf0e10cSrcweir                 aDelete.MovePara(fnParaCurr, fnParaStart);
1726cdf0e10cSrcweir                 aDelete.SetMark();
1727cdf0e10cSrcweir                 aDelete.MovePara(fnParaCurr, fnParaEnd);
1728cdf0e10cSrcweir                 GetDoc()->DelFullPara(aDelete);
1729cdf0e10cSrcweir             }
1730cdf0e10cSrcweir             throw lang::IllegalArgumentException();
1731cdf0e10cSrcweir         }
1732cdf0e10cSrcweir     }
1733cdf0e10cSrcweir 
1734cdf0e10cSrcweir     // make a selection from aStartPam to a EndPam
1735cdf0e10cSrcweir     SwSelBoxes aBoxes;
1736cdf0e10cSrcweir     SfxItemSet aFrameItemSet(m_pImpl->m_pDoc->GetAttrPool(),
1737cdf0e10cSrcweir                     RES_FRMATR_BEGIN, RES_FRMATR_END-1,
1738cdf0e10cSrcweir                     0 );
1739cdf0e10cSrcweir 
1740cdf0e10cSrcweir     aStartPam.SetMark();
1741cdf0e10cSrcweir     *aStartPam.End() = *pEndPam->End();
1742cdf0e10cSrcweir     pEndPam.reset(0);
1743cdf0e10cSrcweir 
1744cdf0e10cSrcweir     SwXTextFrame *const pNewFrame = new SwXTextFrame(m_pImpl->m_pDoc);
1745cdf0e10cSrcweir     const uno::Reference< text::XTextFrame > xNewFrame = pNewFrame;
1746cdf0e10cSrcweir     pNewFrame->SetSelection( aStartPam );
1747cdf0e10cSrcweir     try
1748cdf0e10cSrcweir     {
1749cdf0e10cSrcweir         const beans::PropertyValue* pValues = rFrameProperties.getConstArray();
1750cdf0e10cSrcweir         for (sal_Int32 nProp = 0; nProp < rFrameProperties.getLength(); ++nProp)
1751cdf0e10cSrcweir         {
1752cdf0e10cSrcweir             pNewFrame->SwXFrame::setPropertyValue(
1753cdf0e10cSrcweir                     pValues[nProp].Name, pValues[nProp].Value);
1754cdf0e10cSrcweir         }
1755cdf0e10cSrcweir 
1756cdf0e10cSrcweir         {   // has to be in a block to remove the SwIndexes before
1757cdf0e10cSrcweir             // DelFullPara is called
1758cdf0e10cSrcweir             const uno::Reference< text::XTextRange> xInsertTextRange =
1759cdf0e10cSrcweir                 new SwXTextRange(aStartPam, this);
1760cdf0e10cSrcweir             aStartPam.DeleteMark(); // mark position node may be deleted!
1761cdf0e10cSrcweir             pNewFrame->attach( xInsertTextRange );
1762cdf0e10cSrcweir             pNewFrame->setName(m_pImpl->m_pDoc->GetUniqueFrameName());
1763cdf0e10cSrcweir         }
1764cdf0e10cSrcweir 
1765cdf0e10cSrcweir         SwTxtNode *const pTxtNode(aStartPam.GetNode()->GetTxtNode());
1766cdf0e10cSrcweir         OSL_ASSERT(pTxtNode);
1767cdf0e10cSrcweir         if (!pTxtNode || !pTxtNode->Len()) // don't remove if it contains text!
1768cdf0e10cSrcweir         {
1769cdf0e10cSrcweir             {   // has to be in a block to remove the SwIndexes before
1770cdf0e10cSrcweir                 // DelFullPara is called
1771cdf0e10cSrcweir                 SwPaM aMovePam( *aStartPam.GetNode() );
1772cdf0e10cSrcweir                 if (aMovePam.Move( fnMoveForward, fnGoCntnt ))
1773cdf0e10cSrcweir                 {
1774cdf0e10cSrcweir                     // move the anchor to the next paragraph
1775cdf0e10cSrcweir                     SwFmtAnchor aNewAnchor(pNewFrame->GetFrmFmt()->GetAnchor());
1776cdf0e10cSrcweir                     aNewAnchor.SetAnchor( aMovePam.Start() );
1777cdf0e10cSrcweir                     m_pImpl->m_pDoc->SetAttr(
1778cdf0e10cSrcweir                         aNewAnchor, *pNewFrame->GetFrmFmt() );
1779cdf0e10cSrcweir                 }
1780cdf0e10cSrcweir             }
1781cdf0e10cSrcweir             m_pImpl->m_pDoc->DelFullPara(aStartPam);
1782cdf0e10cSrcweir         }
1783cdf0e10cSrcweir     }
1784cdf0e10cSrcweir     catch (lang::IllegalArgumentException& rIllegal)
1785cdf0e10cSrcweir     {
1786cdf0e10cSrcweir         sMessage = rIllegal.Message;
1787cdf0e10cSrcweir         bIllegalException = true;
1788cdf0e10cSrcweir     }
1789cdf0e10cSrcweir     catch (uno::RuntimeException& rRuntime)
1790cdf0e10cSrcweir     {
1791cdf0e10cSrcweir         sMessage = rRuntime.Message;
1792cdf0e10cSrcweir         bRuntimeException = true;
1793cdf0e10cSrcweir     }
1794*f1a18c4fSJim Jagielski     catch (...)
1795*f1a18c4fSJim Jagielski     {
1796*f1a18c4fSJim Jagielski         return pNewFrame;
1797*f1a18c4fSJim Jagielski     }
1798cdf0e10cSrcweir     xRet = pNewFrame;
1799cdf0e10cSrcweir     if (bParaBeforeInserted || bParaAfterInserted)
1800cdf0e10cSrcweir     {
1801cdf0e10cSrcweir         const uno::Reference<text::XTextCursor> xFrameTextCursor =
1802cdf0e10cSrcweir             pNewFrame->createTextCursor();
1803cdf0e10cSrcweir         const uno::Reference<XUnoTunnel> xTunnel(xFrameTextCursor,
1804cdf0e10cSrcweir                 uno::UNO_QUERY);
1805cdf0e10cSrcweir         SwXTextCursor *const pFrameCursor =
1806cdf0e10cSrcweir             ::sw::UnoTunnelGetImplementation<SwXTextCursor>(xTunnel);
1807cdf0e10cSrcweir         if (bParaBeforeInserted)
1808cdf0e10cSrcweir         {
1809cdf0e10cSrcweir             // todo: remove paragraph before frame
1810cdf0e10cSrcweir             m_pImpl->m_pDoc->DelFullPara(*pFrameCursor->GetPaM());
1811cdf0e10cSrcweir         }
1812cdf0e10cSrcweir         if (bParaAfterInserted)
1813cdf0e10cSrcweir         {
1814cdf0e10cSrcweir             xFrameTextCursor->gotoEnd(sal_False);
1815cdf0e10cSrcweir             m_pImpl->m_pDoc->DelFullPara(*pFrameCursor->GetPaM());
1816cdf0e10cSrcweir         }
1817cdf0e10cSrcweir     }
1818cdf0e10cSrcweir 
1819cdf0e10cSrcweir     m_pImpl->m_pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_END, NULL);
1820cdf0e10cSrcweir     if (bIllegalException || bRuntimeException)
1821cdf0e10cSrcweir     {
1822cdf0e10cSrcweir         m_pImpl->m_pDoc->GetIDocumentUndoRedo().Undo();
1823cdf0e10cSrcweir         if (bIllegalException)
1824cdf0e10cSrcweir         {
1825cdf0e10cSrcweir             lang::IllegalArgumentException aEx;
1826cdf0e10cSrcweir             aEx.Message = sMessage;
1827cdf0e10cSrcweir             throw aEx;
1828cdf0e10cSrcweir         }
1829cdf0e10cSrcweir         else //if(bRuntimeException)
1830cdf0e10cSrcweir         {
1831cdf0e10cSrcweir             uno::RuntimeException aEx;
1832cdf0e10cSrcweir             aEx.Message = sMessage;
1833cdf0e10cSrcweir             throw aEx;
1834cdf0e10cSrcweir         }
1835cdf0e10cSrcweir     }
1836cdf0e10cSrcweir     return xRet;
1837cdf0e10cSrcweir }
1838cdf0e10cSrcweir 
1839cdf0e10cSrcweir /*-- 11.05.2006 15:46:26---------------------------------------------------
1840cdf0e10cSrcweir     Move previously imported paragraphs into a new text table.
1841cdf0e10cSrcweir 
1842cdf0e10cSrcweir   -----------------------------------------------------------------------*/
1843cdf0e10cSrcweir struct VerticallyMergedCell
1844cdf0e10cSrcweir {
1845cdf0e10cSrcweir     std::vector<uno::Reference< beans::XPropertySet > > aCells;
1846cdf0e10cSrcweir     sal_Int32                                           nLeftPosition;
1847cdf0e10cSrcweir     bool                                                bOpen;
1848cdf0e10cSrcweir 
VerticallyMergedCellVerticallyMergedCell1849cdf0e10cSrcweir     VerticallyMergedCell(uno::Reference< beans::XPropertySet > const& rxCell,
1850cdf0e10cSrcweir             const sal_Int32 nLeft)
1851cdf0e10cSrcweir         : nLeftPosition( nLeft )
1852cdf0e10cSrcweir         , bOpen( true )
1853cdf0e10cSrcweir     {
1854cdf0e10cSrcweir         aCells.push_back( rxCell );
1855cdf0e10cSrcweir     }
1856cdf0e10cSrcweir };
1857cdf0e10cSrcweir #define COL_POS_FUZZY 2
lcl_SimilarPosition(const sal_Int32 nPos1,const sal_Int32 nPos2)1858cdf0e10cSrcweir static bool lcl_SimilarPosition( const sal_Int32 nPos1, const sal_Int32 nPos2 )
1859cdf0e10cSrcweir {
1860cdf0e10cSrcweir     return abs( nPos1 - nPos2 ) < COL_POS_FUZZY;
1861cdf0e10cSrcweir }
1862cdf0e10cSrcweir 
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)1863cdf0e10cSrcweir void SwXText::Impl::ConvertCell(
1864cdf0e10cSrcweir     const bool bFirstCell,
1865cdf0e10cSrcweir     const uno::Sequence< uno::Reference< text::XTextRange > > & rCell,
1866cdf0e10cSrcweir     ::std::vector<SwNodeRange> & rRowNodes,
1867cdf0e10cSrcweir     ::std::auto_ptr< SwPaM > & rpFirstPaM,
1868cdf0e10cSrcweir     SwPaM & rLastPaM,
1869cdf0e10cSrcweir     bool & rbExcept)
1870cdf0e10cSrcweir {
1871cdf0e10cSrcweir     if (rCell.getLength() != 2)
1872cdf0e10cSrcweir     {
1873cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1874cdf0e10cSrcweir     }
1875cdf0e10cSrcweir     const uno::Reference<text::XTextRange> xStartRange = rCell[0];
1876cdf0e10cSrcweir     const uno::Reference<text::XTextRange> xEndRange = rCell[1];
1877cdf0e10cSrcweir     SwUnoInternalPaM aStartCellPam(*m_pDoc);
1878cdf0e10cSrcweir     SwUnoInternalPaM aEndCellPam(*m_pDoc);
1879cdf0e10cSrcweir 
1880cdf0e10cSrcweir     // !!! TODO - PaMs in tables and sections do not work here -
1881cdf0e10cSrcweir     //     the same applies to PaMs in frames !!!
1882cdf0e10cSrcweir 
1883cdf0e10cSrcweir     if (!::sw::XTextRangeToSwPaM(aStartCellPam, xStartRange) ||
1884cdf0e10cSrcweir         !::sw::XTextRangeToSwPaM(aEndCellPam, xEndRange))
1885cdf0e10cSrcweir     {
1886cdf0e10cSrcweir         throw lang::IllegalArgumentException();
1887cdf0e10cSrcweir     }
1888cdf0e10cSrcweir 
1889cdf0e10cSrcweir     SwNodeRange aTmpRange(aStartCellPam.Start()->nNode,
1890cdf0e10cSrcweir                           aEndCellPam.End()->nNode);
1891cdf0e10cSrcweir     SwNodeRange * pCorrectedRange =
1892cdf0e10cSrcweir         m_pDoc->GetNodes().ExpandRangeForTableBox(aTmpRange);
1893cdf0e10cSrcweir 
1894cdf0e10cSrcweir     if (pCorrectedRange != NULL)
1895cdf0e10cSrcweir     {
1896cdf0e10cSrcweir         SwPaM aNewStartPaM(pCorrectedRange->aStart, 0);
1897cdf0e10cSrcweir         aStartCellPam = aNewStartPaM;
1898cdf0e10cSrcweir 
1899cdf0e10cSrcweir         xub_StrLen nEndLen = 0;
1900cdf0e10cSrcweir         SwTxtNode * pTxtNode = pCorrectedRange->aEnd.GetNode().GetTxtNode();
1901cdf0e10cSrcweir         if (pTxtNode != NULL)
1902cdf0e10cSrcweir             nEndLen = pTxtNode->Len();
1903cdf0e10cSrcweir 
1904cdf0e10cSrcweir         SwPaM aNewEndPaM(pCorrectedRange->aEnd, nEndLen);
1905cdf0e10cSrcweir         aEndCellPam = aNewEndPaM;
1906cdf0e10cSrcweir     }
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir     /** check the nodes between start and end
1909cdf0e10cSrcweir         it is allowed to have pairs of StartNode/EndNodes
1910cdf0e10cSrcweir      */
1911cdf0e10cSrcweir     if (aStartCellPam.Start()->nNode < aEndCellPam.End()->nNode)
1912cdf0e10cSrcweir     {
1913cdf0e10cSrcweir         // increment on each StartNode and decrement on each EndNode
1914cdf0e10cSrcweir         // we must reach zero at the end and must not go below zero
1915cdf0e10cSrcweir         long nOpenNodeBlock = 0;
1916cdf0e10cSrcweir         SwNodeIndex aCellIndex = aStartCellPam.Start()->nNode;
1917cdf0e10cSrcweir         while (aCellIndex < aEndCellPam.End()->nNode.GetIndex())
1918cdf0e10cSrcweir         {
1919cdf0e10cSrcweir             if (aCellIndex.GetNode().IsStartNode())
1920cdf0e10cSrcweir             {
1921cdf0e10cSrcweir                 ++nOpenNodeBlock;
1922cdf0e10cSrcweir             }
1923cdf0e10cSrcweir             else if (aCellIndex.GetNode().IsEndNode())
1924cdf0e10cSrcweir             {
1925cdf0e10cSrcweir                 --nOpenNodeBlock;
1926cdf0e10cSrcweir             }
1927cdf0e10cSrcweir             if (nOpenNodeBlock < 0)
1928cdf0e10cSrcweir             {
1929cdf0e10cSrcweir                 rbExcept = true;
1930cdf0e10cSrcweir                 break;
1931cdf0e10cSrcweir             }
1932cdf0e10cSrcweir             ++aCellIndex;
1933cdf0e10cSrcweir         }
1934cdf0e10cSrcweir         if (nOpenNodeBlock != 0)
1935cdf0e10cSrcweir         {
1936cdf0e10cSrcweir             rbExcept = true;
1937cdf0e10cSrcweir             return;
1938cdf0e10cSrcweir         }
1939cdf0e10cSrcweir     }
1940cdf0e10cSrcweir 
1941cdf0e10cSrcweir     /** The vector<vector> NodeRanges has to contain consecutive nodes.
1942cdf0e10cSrcweir         In rTableRanges the ranges don't need to be full paragraphs but
1943cdf0e10cSrcweir         they have to follow each other. To process the ranges they
1944cdf0e10cSrcweir         have to be aligned on paragraph borders by inserting paragraph
1945cdf0e10cSrcweir         breaks. Non-consecutive ranges must initiate an exception.
1946cdf0e10cSrcweir      */
1947cdf0e10cSrcweir     if (bFirstCell)
1948cdf0e10cSrcweir     {
1949cdf0e10cSrcweir         // align the beginning - if necessary
1950cdf0e10cSrcweir         if (aStartCellPam.Start()->nContent.GetIndex())
1951cdf0e10cSrcweir         {
1952cdf0e10cSrcweir             m_pDoc->SplitNode(*aStartCellPam.Start(), sal_False);
1953cdf0e10cSrcweir         }
1954cdf0e10cSrcweir     }
1955cdf0e10cSrcweir     else
1956cdf0e10cSrcweir     {
1957cdf0e10cSrcweir         // check the predecessor
1958cdf0e10cSrcweir         const sal_uLong nLastNodeIndex = rLastPaM.End()->nNode.GetIndex();
1959cdf0e10cSrcweir         const sal_uLong nStartCellNodeIndex =
1960cdf0e10cSrcweir             aStartCellPam.Start()->nNode.GetIndex();
1961cdf0e10cSrcweir         const sal_uLong nLastNodeEndIndex = rLastPaM.End()->nNode.GetIndex();
1962cdf0e10cSrcweir         if (nLastNodeIndex == nStartCellNodeIndex)
1963cdf0e10cSrcweir         {
1964cdf0e10cSrcweir             // same node as predecessor then equal nContent?
1965cdf0e10cSrcweir             if (rLastPaM.End()->nContent != aStartCellPam.Start()->nContent)
1966cdf0e10cSrcweir             {
1967cdf0e10cSrcweir                 rbExcept = true;
1968cdf0e10cSrcweir             }
1969cdf0e10cSrcweir             else
1970cdf0e10cSrcweir             {
1971cdf0e10cSrcweir                 m_pDoc->SplitNode(*aStartCellPam.Start(), sal_False);
1972cdf0e10cSrcweir             }
1973cdf0e10cSrcweir         }
1974cdf0e10cSrcweir         else if (nStartCellNodeIndex == (nLastNodeEndIndex + 1))
1975cdf0e10cSrcweir         {
1976cdf0e10cSrcweir             // next paragraph - now the content index of the new should be 0
1977cdf0e10cSrcweir             // and of the old one should be equal to the text length
1978cdf0e10cSrcweir             // but if it isn't we don't care - the cell is being inserted on
1979cdf0e10cSrcweir             // the node border anyway
1980cdf0e10cSrcweir         }
1981cdf0e10cSrcweir         else
1982cdf0e10cSrcweir         {
1983cdf0e10cSrcweir             rbExcept = true;
1984cdf0e10cSrcweir         }
1985cdf0e10cSrcweir     }
1986cdf0e10cSrcweir     // now check if there's a need to insert another paragraph break
1987cdf0e10cSrcweir     if (aEndCellPam.End()->nContent.GetIndex() <
1988cdf0e10cSrcweir             aEndCellPam.End()->nNode.GetNode().GetTxtNode()->Len())
1989cdf0e10cSrcweir     {
1990cdf0e10cSrcweir         m_pDoc->SplitNode(*aEndCellPam.End(), sal_False);
1991cdf0e10cSrcweir         // take care that the new start/endcell is moved to the right position
1992cdf0e10cSrcweir         // aStartCellPam has to point to the start of the new (previous) node
1993cdf0e10cSrcweir         // aEndCellPam has to point to the end of the new (previous) node
1994cdf0e10cSrcweir         aStartCellPam.DeleteMark();
1995cdf0e10cSrcweir         aStartCellPam.Move(fnMoveBackward, fnGoNode);
1996cdf0e10cSrcweir         aStartCellPam.GetPoint()->nContent = 0;
1997cdf0e10cSrcweir         aEndCellPam.DeleteMark();
1998cdf0e10cSrcweir         aEndCellPam.Move(fnMoveBackward, fnGoNode);
1999cdf0e10cSrcweir         aEndCellPam.GetPoint()->nContent =
2000cdf0e10cSrcweir             aEndCellPam.GetNode()->GetTxtNode()->Len();
2001cdf0e10cSrcweir     }
2002cdf0e10cSrcweir 
2003cdf0e10cSrcweir     *rLastPaM.GetPoint() = *aEndCellPam.Start();
2004cdf0e10cSrcweir     if (aStartCellPam.HasMark())
2005cdf0e10cSrcweir     {
2006cdf0e10cSrcweir         rLastPaM.SetMark();
2007cdf0e10cSrcweir         *rLastPaM.GetMark() = *aEndCellPam.End();
2008cdf0e10cSrcweir     }
2009cdf0e10cSrcweir     else
2010cdf0e10cSrcweir     {
2011cdf0e10cSrcweir         rLastPaM.DeleteMark();
2012cdf0e10cSrcweir     }
2013cdf0e10cSrcweir 
2014cdf0e10cSrcweir     SwNodeRange aCellRange(aStartCellPam.Start()->nNode,
2015cdf0e10cSrcweir             aEndCellPam.End()->nNode);
2016cdf0e10cSrcweir     rRowNodes.push_back(aCellRange);
2017cdf0e10cSrcweir     if (bFirstCell)
2018cdf0e10cSrcweir     {
2019cdf0e10cSrcweir         rpFirstPaM.reset(new SwPaM(*aStartCellPam.Start()));
2020cdf0e10cSrcweir     }
2021cdf0e10cSrcweir }
2022cdf0e10cSrcweir 
2023cdf0e10cSrcweir typedef uno::Sequence< text::TableColumnSeparator > TableColumnSeparators;
2024cdf0e10cSrcweir 
2025cdf0e10cSrcweir static void
lcl_ApplyRowProperties(uno::Sequence<beans::PropertyValue> const & rRowProperties,uno::Any const & rRow,TableColumnSeparators & rRowSeparators)2026cdf0e10cSrcweir lcl_ApplyRowProperties(
2027cdf0e10cSrcweir     uno::Sequence<beans::PropertyValue> const& rRowProperties,
2028cdf0e10cSrcweir     uno::Any const& rRow,
2029cdf0e10cSrcweir     TableColumnSeparators & rRowSeparators)
2030cdf0e10cSrcweir {
2031cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xRow;
2032cdf0e10cSrcweir     rRow >>= xRow;
2033cdf0e10cSrcweir     const beans::PropertyValue* pProperties = rRowProperties.getConstArray();
2034cdf0e10cSrcweir     for (sal_Int32 nProperty = 0; nProperty < rRowProperties.getLength();
2035cdf0e10cSrcweir          ++nProperty)
2036cdf0e10cSrcweir     {
2037cdf0e10cSrcweir         if (pProperties[ nProperty ].Name.equalsAsciiL(
2038cdf0e10cSrcweir                 RTL_CONSTASCII_STRINGPARAM("TableColumnSeparators")))
2039cdf0e10cSrcweir         {
2040cdf0e10cSrcweir             // add the separators to access the cell's positions
2041cdf0e10cSrcweir             // for vertical merging later
2042cdf0e10cSrcweir             TableColumnSeparators aSeparators;
2043cdf0e10cSrcweir             pProperties[ nProperty ].Value >>= aSeparators;
2044cdf0e10cSrcweir             rRowSeparators = aSeparators;
2045cdf0e10cSrcweir         }
2046cdf0e10cSrcweir         xRow->setPropertyValue(
2047cdf0e10cSrcweir             pProperties[ nProperty ].Name, pProperties[ nProperty ].Value);
2048cdf0e10cSrcweir     }
2049cdf0e10cSrcweir }
2050cdf0e10cSrcweir 
2051cdf0e10cSrcweir #ifdef DEBUG
2052cdf0e10cSrcweir //-->debug cell properties of all rows
2053cdf0e10cSrcweir static void
lcl_DebugCellProperties(const uno::Sequence<uno::Sequence<uno::Sequence<beans::PropertyValue>>> & rCellProperties)2054cdf0e10cSrcweir lcl_DebugCellProperties(
2055cdf0e10cSrcweir     const uno::Sequence< uno::Sequence< uno::Sequence<
2056cdf0e10cSrcweir         beans::PropertyValue > > >& rCellProperties)
2057cdf0e10cSrcweir {
2058cdf0e10cSrcweir     ::rtl::OUString sNames;
2059cdf0e10cSrcweir     for (sal_Int32  nDebugRow = 0; nDebugRow < rCellProperties.getLength();
2060cdf0e10cSrcweir          ++nDebugRow)
2061cdf0e10cSrcweir     {
2062cdf0e10cSrcweir         const uno::Sequence< beans::PropertyValues > aDebugCurrentRow =
2063cdf0e10cSrcweir             rCellProperties[nDebugRow];
2064cdf0e10cSrcweir         sal_Int32 nDebugCells = aDebugCurrentRow.getLength();
2065cdf0e10cSrcweir         (void) nDebugCells;
2066cdf0e10cSrcweir         for (sal_Int32  nDebugCell = 0; nDebugCell < nDebugCells;
2067cdf0e10cSrcweir              ++nDebugCell)
2068cdf0e10cSrcweir         {
2069cdf0e10cSrcweir             const uno::Sequence< beans::PropertyValue >&
2070cdf0e10cSrcweir                 rDebugCellProperties = aDebugCurrentRow[nDebugCell];
2071cdf0e10cSrcweir             const sal_Int32 nDebugCellProperties =
2072cdf0e10cSrcweir                 rDebugCellProperties.getLength();
2073cdf0e10cSrcweir             for (sal_Int32  nDebugProperty = 0;
2074cdf0e10cSrcweir                  nDebugProperty < nDebugCellProperties; ++nDebugProperty)
2075cdf0e10cSrcweir             {
2076cdf0e10cSrcweir                 const ::rtl::OUString sName =
2077cdf0e10cSrcweir                     rDebugCellProperties[nDebugProperty].Name;
2078cdf0e10cSrcweir                 sNames += sName;
2079cdf0e10cSrcweir                 sNames += ::rtl::OUString('-');
2080cdf0e10cSrcweir             }
2081cdf0e10cSrcweir             sNames += ::rtl::OUString('+');
2082cdf0e10cSrcweir         }
2083cdf0e10cSrcweir         sNames += ::rtl::OUString('|');
2084cdf0e10cSrcweir     }
2085cdf0e10cSrcweir     (void)sNames;
2086cdf0e10cSrcweir }
2087cdf0e10cSrcweir //--<
2088cdf0e10cSrcweir #endif
2089cdf0e10cSrcweir 
2090cdf0e10cSrcweir 
2091cdf0e10cSrcweir 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)2092cdf0e10cSrcweir lcl_ApplyCellProperties(
2093cdf0e10cSrcweir     const sal_Int32 nCell,
2094cdf0e10cSrcweir     TableColumnSeparators const& rRowSeparators,
2095cdf0e10cSrcweir     const uno::Sequence< beans::PropertyValue >& rCellProperties,
2096cdf0e10cSrcweir     uno::Reference< uno::XInterface > xCell,
2097cdf0e10cSrcweir     ::std::vector<VerticallyMergedCell> & rMergedCells)
2098cdf0e10cSrcweir {
2099cdf0e10cSrcweir     const sal_Int32 nCellProperties = rCellProperties.getLength();
2100cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > xCellPS(xCell, uno::UNO_QUERY);
2101cdf0e10cSrcweir     for (sal_Int32 nProperty = 0; nProperty < nCellProperties; ++nProperty)
2102cdf0e10cSrcweir     {
2103cdf0e10cSrcweir         const OUString & rName  = rCellProperties[nProperty].Name;
2104cdf0e10cSrcweir         const uno::Any & rValue = rCellProperties[nProperty].Value;
2105cdf0e10cSrcweir         if (rName.equalsAscii("VerticalMerge"))
2106cdf0e10cSrcweir         {
2107cdf0e10cSrcweir             // determine left border position
2108cdf0e10cSrcweir             // add the cell to a queue of merged cells
2109cdf0e10cSrcweir             sal_Bool bMerge = sal_False;
2110cdf0e10cSrcweir             rValue >>= bMerge;
2111cdf0e10cSrcweir             sal_Int32 nLeftPos = -1;
2112cdf0e10cSrcweir             if (!nCell)
2113cdf0e10cSrcweir             {
2114cdf0e10cSrcweir                 nLeftPos = 0;
2115cdf0e10cSrcweir             }
2116cdf0e10cSrcweir             else if (rRowSeparators.getLength() >= nCell)
2117cdf0e10cSrcweir             {
2118cdf0e10cSrcweir                 const text::TableColumnSeparator* pSeparators =
2119cdf0e10cSrcweir                     rRowSeparators.getConstArray();
2120cdf0e10cSrcweir                 nLeftPos = pSeparators[nCell - 1].Position;
2121cdf0e10cSrcweir             }
2122cdf0e10cSrcweir             if (bMerge)
2123cdf0e10cSrcweir             {
2124cdf0e10cSrcweir                 // 'close' all the cell with the same left position
2125cdf0e10cSrcweir                 // if separate vertical merges in the same column exist
2126cdf0e10cSrcweir                 if (rMergedCells.size())
2127cdf0e10cSrcweir                 {
2128cdf0e10cSrcweir                     std::vector<VerticallyMergedCell>::iterator aMergedIter =
2129cdf0e10cSrcweir                         rMergedCells.begin();
2130cdf0e10cSrcweir                     while (aMergedIter != rMergedCells.end())
2131cdf0e10cSrcweir                     {
2132cdf0e10cSrcweir                         if (lcl_SimilarPosition(aMergedIter->nLeftPosition,
2133cdf0e10cSrcweir                                     nLeftPos))
2134cdf0e10cSrcweir                         {
2135cdf0e10cSrcweir                             aMergedIter->bOpen = false;
2136cdf0e10cSrcweir                         }
2137cdf0e10cSrcweir                         ++aMergedIter;
2138cdf0e10cSrcweir                     }
2139cdf0e10cSrcweir                 }
2140cdf0e10cSrcweir                 // add the new group of merged cells
2141cdf0e10cSrcweir                 rMergedCells.push_back(VerticallyMergedCell(xCellPS, nLeftPos));
2142cdf0e10cSrcweir             }
2143cdf0e10cSrcweir             else
2144cdf0e10cSrcweir             {
2145cdf0e10cSrcweir                 // find the cell that
2146cdf0e10cSrcweir                 DBG_ASSERT(rMergedCells.size(),
2147cdf0e10cSrcweir                         "the first merged cell is missing");
2148cdf0e10cSrcweir                 if (rMergedCells.size())
2149cdf0e10cSrcweir                 {
2150cdf0e10cSrcweir                     std::vector<VerticallyMergedCell>::iterator aMergedIter =
2151cdf0e10cSrcweir                         rMergedCells.begin();
2152cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
2153cdf0e10cSrcweir                     bool bDbgFound = false;
2154cdf0e10cSrcweir #endif
2155cdf0e10cSrcweir                     while (aMergedIter != rMergedCells.end())
2156cdf0e10cSrcweir                     {
2157cdf0e10cSrcweir                         if (aMergedIter->bOpen &&
2158cdf0e10cSrcweir                             lcl_SimilarPosition(aMergedIter->nLeftPosition,
2159cdf0e10cSrcweir                                 nLeftPos))
2160cdf0e10cSrcweir                         {
2161cdf0e10cSrcweir                             aMergedIter->aCells.push_back( xCellPS );
2162cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
2163cdf0e10cSrcweir                             bDbgFound = true;
2164cdf0e10cSrcweir #endif
2165cdf0e10cSrcweir                         }
2166cdf0e10cSrcweir                         ++aMergedIter;
2167cdf0e10cSrcweir                     }
2168cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
2169cdf0e10cSrcweir                     DBG_ASSERT( bDbgFound,
2170cdf0e10cSrcweir                             "couldn't find first vertically merged cell" );
2171cdf0e10cSrcweir #endif
2172cdf0e10cSrcweir                 }
2173cdf0e10cSrcweir             }
2174cdf0e10cSrcweir         }
2175cdf0e10cSrcweir         else
2176cdf0e10cSrcweir         {
2177cdf0e10cSrcweir             try
2178cdf0e10cSrcweir             {
2179cdf0e10cSrcweir                 xCellPS->setPropertyValue(rName, rValue);
2180cdf0e10cSrcweir             }
2181c0286415SOliver-Rainer Wittmann             catch (uno::Exception const& )
2182cdf0e10cSrcweir             {
2183cdf0e10cSrcweir                 // Apply the paragraph and char properties to the cell's content
2184cdf0e10cSrcweir                 const uno::Reference< text::XText > xCellText(xCell,
2185cdf0e10cSrcweir                         uno::UNO_QUERY);
2186cdf0e10cSrcweir                 const uno::Reference< text::XTextCursor > xCellCurs =
2187cdf0e10cSrcweir                     xCellText->createTextCursor();
2188cdf0e10cSrcweir                 xCellCurs->gotoStart( sal_False );
2189cdf0e10cSrcweir                 xCellCurs->gotoEnd( sal_True );
219007f29ca7SJian Fang Zhang                 const uno::Reference< beans::XPropertyState >
219107f29ca7SJian Fang Zhang                     xCellTextPropState(xCellCurs, uno::UNO_QUERY);
219207f29ca7SJian Fang Zhang                 const beans::PropertyState state = xCellTextPropState->getPropertyState(rName);
219307f29ca7SJian Fang Zhang                 if (state == beans::PropertyState_DEFAULT_VALUE)
219407f29ca7SJian Fang Zhang                 {
219507f29ca7SJian Fang Zhang                     const uno::Reference< beans::XPropertySet >
219607f29ca7SJian Fang Zhang                         xCellTextProps(xCellCurs, uno::UNO_QUERY);
2197cdf0e10cSrcweir                     xCellTextProps->setPropertyValue(rName, rValue);
2198cdf0e10cSrcweir                 }
2199cdf0e10cSrcweir             }
2200cdf0e10cSrcweir         }
2201cdf0e10cSrcweir     }
220207f29ca7SJian Fang Zhang }
2203cdf0e10cSrcweir 
2204cdf0e10cSrcweir static void
lcl_MergeCells(::std::vector<VerticallyMergedCell> & rMergedCells)2205cdf0e10cSrcweir lcl_MergeCells(::std::vector<VerticallyMergedCell> & rMergedCells)
2206cdf0e10cSrcweir {
2207cdf0e10cSrcweir     if (rMergedCells.size())
2208cdf0e10cSrcweir     {
2209cdf0e10cSrcweir         std::vector<VerticallyMergedCell>::iterator aMergedIter =
2210cdf0e10cSrcweir             rMergedCells.begin();
2211cdf0e10cSrcweir         while (aMergedIter != rMergedCells.end())
2212cdf0e10cSrcweir         {
2213cdf0e10cSrcweir             sal_Int32 nCellCount =
2214cdf0e10cSrcweir                 static_cast<sal_Int32>(aMergedIter->aCells.size());
2215cdf0e10cSrcweir             std::vector<uno::Reference< beans::XPropertySet > >::iterator
2216cdf0e10cSrcweir                 aCellIter = aMergedIter->aCells.begin();
2217cdf0e10cSrcweir             bool bFirstCell = true;
2218cdf0e10cSrcweir             // the first of the cells gets the number of cells set as RowSpan
2219cdf0e10cSrcweir             // the others get the inverted number of remaining merged cells
2220cdf0e10cSrcweir             // (3,-2,-1)
2221cdf0e10cSrcweir             while (aCellIter != aMergedIter->aCells.end())
2222cdf0e10cSrcweir             {
2223cdf0e10cSrcweir                 (*aCellIter)->setPropertyValue(
2224cdf0e10cSrcweir                     C2U(SW_PROP_NAME_STR(UNO_NAME_ROW_SPAN)),
2225cdf0e10cSrcweir                     uno::makeAny(nCellCount));
2226cdf0e10cSrcweir                 if (bFirstCell)
2227cdf0e10cSrcweir                 {
2228cdf0e10cSrcweir                     nCellCount *= -1;
2229cdf0e10cSrcweir                     bFirstCell = false;
2230cdf0e10cSrcweir                 }
2231cdf0e10cSrcweir                 ++nCellCount;
2232cdf0e10cSrcweir                 ++aCellIter;
2233cdf0e10cSrcweir             }
2234cdf0e10cSrcweir             ++aMergedIter;
2235cdf0e10cSrcweir         }
2236cdf0e10cSrcweir     }
2237cdf0e10cSrcweir }
2238cdf0e10cSrcweir 
2239cdf0e10cSrcweir uno::Reference< text::XTextTable > SAL_CALL
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)2240cdf0e10cSrcweir SwXText::convertToTable(
2241cdf0e10cSrcweir     const uno::Sequence< uno::Sequence< uno::Sequence<
2242cdf0e10cSrcweir         uno::Reference< text::XTextRange > > > >& rTableRanges,
2243cdf0e10cSrcweir     const uno::Sequence< uno::Sequence< uno::Sequence<
2244cdf0e10cSrcweir         beans::PropertyValue > > >& rCellProperties,
2245cdf0e10cSrcweir     const uno::Sequence< uno::Sequence< beans::PropertyValue > >&
2246cdf0e10cSrcweir         rRowProperties,
2247cdf0e10cSrcweir     const uno::Sequence< beans::PropertyValue >& rTableProperties)
2248cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
2249cdf0e10cSrcweir {
2250cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2251cdf0e10cSrcweir 
2252cdf0e10cSrcweir     if(!IsValid())
2253cdf0e10cSrcweir     {
2254cdf0e10cSrcweir         throw  uno::RuntimeException();
2255cdf0e10cSrcweir     }
2256cdf0e10cSrcweir 
2257cdf0e10cSrcweir     //at first collect the text ranges as SwPaMs
2258cdf0e10cSrcweir     const uno::Sequence< uno::Sequence< uno::Reference< text::XTextRange > > >*
2259cdf0e10cSrcweir         pTableRanges = rTableRanges.getConstArray();
2260cdf0e10cSrcweir     std::auto_ptr < SwPaM > pFirstPaM;
2261cdf0e10cSrcweir     std::vector< std::vector<SwNodeRange> > aTableNodes;
2262cdf0e10cSrcweir     bool bExcept = false;
2263cdf0e10cSrcweir     SwPaM aLastPaM(m_pImpl->m_pDoc->GetNodes());
2264cdf0e10cSrcweir     for (sal_Int32 nRow = 0; !bExcept && (nRow < rTableRanges.getLength());
2265cdf0e10cSrcweir             ++nRow)
2266cdf0e10cSrcweir     {
2267cdf0e10cSrcweir         std::vector<SwNodeRange> aRowNodes;
2268cdf0e10cSrcweir         const uno::Sequence< uno::Reference< text::XTextRange > >* pRow =
2269cdf0e10cSrcweir             pTableRanges[nRow].getConstArray();
2270cdf0e10cSrcweir         const sal_Int32 nCells(pTableRanges[nRow].getLength());
2271cdf0e10cSrcweir 
2272cdf0e10cSrcweir         for (sal_Int32 nCell = 0; nCell < nCells; ++nCell)
2273cdf0e10cSrcweir         {
2274cdf0e10cSrcweir             m_pImpl->ConvertCell((nCell == 0) && (nRow == 0), pRow[nCell],
2275cdf0e10cSrcweir                 aRowNodes, pFirstPaM, aLastPaM, bExcept);
2276cdf0e10cSrcweir         }
2277cdf0e10cSrcweir         aTableNodes.push_back(aRowNodes);
2278cdf0e10cSrcweir     }
2279cdf0e10cSrcweir 
2280cdf0e10cSrcweir     if(bExcept)
2281cdf0e10cSrcweir     {
2282cdf0e10cSrcweir         m_pImpl->m_pDoc->GetIDocumentUndoRedo().Undo();
2283cdf0e10cSrcweir         throw lang::IllegalArgumentException();
2284cdf0e10cSrcweir     }
2285cdf0e10cSrcweir 
2286cdf0e10cSrcweir     std::vector< TableColumnSeparators >
2287cdf0e10cSrcweir         aRowSeparators(rRowProperties.getLength());
2288cdf0e10cSrcweir     std::vector<VerticallyMergedCell> aMergedCells;
2289cdf0e10cSrcweir 
2290cdf0e10cSrcweir     SwTable const*const pTable = m_pImpl->m_pDoc->TextToTable( aTableNodes );
2291cdf0e10cSrcweir     SwXTextTable *const pTextTable = new SwXTextTable( *pTable->GetFrmFmt() );
2292cdf0e10cSrcweir     const uno::Reference< text::XTextTable > xRet = pTextTable;
2293cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > xPrSet = pTextTable;
2294cdf0e10cSrcweir     // set properties to the table
2295cdf0e10cSrcweir     // catch lang::WrappedTargetException and lang::IndexOutOfBoundsException
2296cdf0e10cSrcweir     try
2297cdf0e10cSrcweir     {
2298cdf0e10cSrcweir         //apply table properties
2299cdf0e10cSrcweir         const beans::PropertyValue* pTableProperties =
2300cdf0e10cSrcweir             rTableProperties.getConstArray();
2301cdf0e10cSrcweir         for (sal_Int32 nProperty = 0; nProperty < rTableProperties.getLength();
2302cdf0e10cSrcweir              ++nProperty)
2303cdf0e10cSrcweir         {
2304cdf0e10cSrcweir             try
2305cdf0e10cSrcweir             {
2306cdf0e10cSrcweir                 xPrSet->setPropertyValue( pTableProperties[nProperty].Name,
2307cdf0e10cSrcweir                         pTableProperties[nProperty].Value );
2308cdf0e10cSrcweir             }
2309cdf0e10cSrcweir             catch ( uno::Exception const& e )
2310cdf0e10cSrcweir             {
2311cdf0e10cSrcweir #if DEBUG
2312cdf0e10cSrcweir                 std::clog << "Exception when setting property: ";
2313cdf0e10cSrcweir                 std::clog << rtl::OUStringToOString(
2314cdf0e10cSrcweir                     pTableProperties[nProperty].Name, RTL_TEXTENCODING_UTF8)
2315cdf0e10cSrcweir                     .getStr();
2316cdf0e10cSrcweir                 std::clog << ". Message: ";
2317cdf0e10cSrcweir                 std::clog << rtl::OUStringToOString( e.Message,
2318cdf0e10cSrcweir                     RTL_TEXTENCODING_UTF8 ).getStr();
2319cdf0e10cSrcweir                 std::clog << std::endl;
2320cdf0e10cSrcweir #endif
2321cdf0e10cSrcweir             }
2322cdf0e10cSrcweir         }
2323cdf0e10cSrcweir 
2324cdf0e10cSrcweir         //apply row properties
2325cdf0e10cSrcweir         const uno::Reference< table::XTableRows >  xRows = xRet->getRows();
2326cdf0e10cSrcweir 
2327cdf0e10cSrcweir         const beans::PropertyValues* pRowProperties =
2328cdf0e10cSrcweir             rRowProperties.getConstArray();
2329cdf0e10cSrcweir         for (sal_Int32 nRow = 0; nRow < xRows->getCount(); ++nRow)
2330cdf0e10cSrcweir         {
2331cdf0e10cSrcweir             if( nRow >= rRowProperties.getLength())
2332cdf0e10cSrcweir             {
2333cdf0e10cSrcweir                 break;
2334cdf0e10cSrcweir             }
2335cdf0e10cSrcweir             lcl_ApplyRowProperties(pRowProperties[nRow],
2336cdf0e10cSrcweir                 xRows->getByIndex(nRow), aRowSeparators[nRow]);
2337cdf0e10cSrcweir         }
2338cdf0e10cSrcweir 
2339cdf0e10cSrcweir #ifdef DEBUG
2340cdf0e10cSrcweir         lcl_DebugCellProperties(rCellProperties);
2341cdf0e10cSrcweir #endif
2342cdf0e10cSrcweir 
2343cdf0e10cSrcweir         //apply cell properties
2344cdf0e10cSrcweir         for (sal_Int32 nRow = 0; nRow < rCellProperties.getLength(); ++nRow)
2345cdf0e10cSrcweir         {
2346cdf0e10cSrcweir             const uno::Sequence< beans::PropertyValues > aCurrentRow =
2347cdf0e10cSrcweir                 rCellProperties[nRow];
2348cdf0e10cSrcweir             sal_Int32 nCells = aCurrentRow.getLength();
2349cdf0e10cSrcweir             for (sal_Int32  nCell = 0; nCell < nCells; ++nCell)
2350cdf0e10cSrcweir             {
2351cdf0e10cSrcweir                 lcl_ApplyCellProperties(nCell,
2352cdf0e10cSrcweir                     aRowSeparators[nRow], aCurrentRow[nCell],
2353cdf0e10cSrcweir                     pTextTable->getCellByPosition(nCell, nRow),
2354cdf0e10cSrcweir                     aMergedCells);
2355cdf0e10cSrcweir             }
2356cdf0e10cSrcweir         }
2357cdf0e10cSrcweir         // now that the cell properties are set the vertical merge values
2358cdf0e10cSrcweir         // have to be applied
2359cdf0e10cSrcweir         lcl_MergeCells(aMergedCells);
2360cdf0e10cSrcweir     }
2361cdf0e10cSrcweir     catch( const lang::WrappedTargetException& rWrapped )
2362cdf0e10cSrcweir     {
2363cdf0e10cSrcweir         (void)rWrapped;
2364cdf0e10cSrcweir     }
2365cdf0e10cSrcweir     catch ( const lang::IndexOutOfBoundsException& rBounds )
2366cdf0e10cSrcweir     {
2367cdf0e10cSrcweir         (void)rBounds;
2368cdf0e10cSrcweir     }
2369cdf0e10cSrcweir 
2370cdf0e10cSrcweir     return xRet;
2371cdf0e10cSrcweir }
2372cdf0e10cSrcweir 
2373cdf0e10cSrcweir 
2374cdf0e10cSrcweir void SAL_CALL
copyText(const uno::Reference<text::XTextCopy> & xSource)2375cdf0e10cSrcweir SwXText::copyText(
2376cdf0e10cSrcweir     const uno::Reference< text::XTextCopy >& xSource )
2377cdf0e10cSrcweir throw (uno::RuntimeException)
2378cdf0e10cSrcweir {
2379cdf0e10cSrcweir     vos::OGuard g(Application::GetSolarMutex());
2380cdf0e10cSrcweir 
2381cdf0e10cSrcweir     uno::Reference< text::XText > const xText(xSource, uno::UNO_QUERY_THROW);
2382cdf0e10cSrcweir     uno::Reference< text::XTextCursor > const xCursor =
2383cdf0e10cSrcweir         xText->createTextCursor();
2384cdf0e10cSrcweir     xCursor->gotoEnd( sal_True );
2385cdf0e10cSrcweir 
2386cdf0e10cSrcweir     uno::Reference< lang::XUnoTunnel > const xCursorTunnel(xCursor,
2387cdf0e10cSrcweir         uno::UNO_QUERY_THROW);
2388cdf0e10cSrcweir 
2389cdf0e10cSrcweir     OTextCursorHelper *const pCursor =
2390cdf0e10cSrcweir         ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xCursorTunnel);
2391cdf0e10cSrcweir     if (!pCursor)
2392cdf0e10cSrcweir     {
2393cdf0e10cSrcweir         throw uno::RuntimeException();
2394cdf0e10cSrcweir     }
2395cdf0e10cSrcweir 
2396cdf0e10cSrcweir     SwNodeIndex rNdIndex( *GetStartNode( ), 1 );
2397cdf0e10cSrcweir     SwPosition rPos( rNdIndex );
2398cdf0e10cSrcweir     m_pImpl->m_pDoc->CopyRange( *pCursor->GetPaM(), rPos, false );
2399cdf0e10cSrcweir }
2400cdf0e10cSrcweir 
2401cdf0e10cSrcweir 
2402cdf0e10cSrcweir /******************************************************************
2403cdf0e10cSrcweir  * SwXBodyText
2404cdf0e10cSrcweir  ******************************************************************/
SwXBodyText(SwDoc * const pDoc)2405cdf0e10cSrcweir SwXBodyText::SwXBodyText(SwDoc *const pDoc)
2406cdf0e10cSrcweir     : SwXText(pDoc, CURSOR_BODY)
2407cdf0e10cSrcweir {
2408cdf0e10cSrcweir }
2409cdf0e10cSrcweir 
2410cdf0e10cSrcweir /*-- 10.12.98 11:17:27---------------------------------------------------
2411cdf0e10cSrcweir 
2412cdf0e10cSrcweir   -----------------------------------------------------------------------*/
~SwXBodyText()2413cdf0e10cSrcweir SwXBodyText::~SwXBodyText()
2414cdf0e10cSrcweir {
2415cdf0e10cSrcweir 
2416cdf0e10cSrcweir }
2417cdf0e10cSrcweir /* -----------------------------06.04.00 16:33--------------------------------
2418cdf0e10cSrcweir 
2419cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2420cdf0e10cSrcweir OUString SAL_CALL
getImplementationName()2421cdf0e10cSrcweir SwXBodyText::getImplementationName() throw (uno::RuntimeException)
2422cdf0e10cSrcweir {
2423cdf0e10cSrcweir     return C2U("SwXBodyText");
2424cdf0e10cSrcweir }
2425cdf0e10cSrcweir /* -----------------------------06.04.00 16:33--------------------------------
2426cdf0e10cSrcweir 
2427cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2428cdf0e10cSrcweir static char const*const g_ServicesBodyText[] =
2429cdf0e10cSrcweir {
2430cdf0e10cSrcweir     "com.sun.star.text.Text",
2431cdf0e10cSrcweir };
2432cdf0e10cSrcweir static const size_t g_nServicesBodyText(
2433cdf0e10cSrcweir     sizeof(g_ServicesBodyText)/sizeof(g_ServicesBodyText[0]));
2434cdf0e10cSrcweir 
supportsService(const OUString & rServiceName)2435cdf0e10cSrcweir sal_Bool SAL_CALL SwXBodyText::supportsService(const OUString& rServiceName)
2436cdf0e10cSrcweir throw (uno::RuntimeException)
2437cdf0e10cSrcweir {
2438cdf0e10cSrcweir     return ::sw::SupportsServiceImpl(
2439cdf0e10cSrcweir             g_nServicesBodyText, g_ServicesBodyText, rServiceName);
2440cdf0e10cSrcweir }
2441cdf0e10cSrcweir 
2442cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL
getSupportedServiceNames()2443cdf0e10cSrcweir SwXBodyText::getSupportedServiceNames() throw (uno::RuntimeException)
2444cdf0e10cSrcweir {
2445cdf0e10cSrcweir     return ::sw::GetSupportedServiceNamesImpl(
2446cdf0e10cSrcweir             g_nServicesBodyText, g_ServicesBodyText);
2447cdf0e10cSrcweir }
2448cdf0e10cSrcweir 
2449cdf0e10cSrcweir /*-- 10.12.98 11:17:27---------------------------------------------------
2450cdf0e10cSrcweir 
2451cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2452cdf0e10cSrcweir uno::Any SAL_CALL
queryAggregation(const uno::Type & rType)2453cdf0e10cSrcweir SwXBodyText::queryAggregation(const uno::Type& rType)
2454cdf0e10cSrcweir throw (uno::RuntimeException)
2455cdf0e10cSrcweir {
2456cdf0e10cSrcweir     uno::Any aRet;
2457cdf0e10cSrcweir     if (rType == container::XEnumerationAccess::static_type())
2458cdf0e10cSrcweir     {
2459cdf0e10cSrcweir         aRet <<= uno::Reference< container::XEnumerationAccess >(this);
2460cdf0e10cSrcweir     }
2461cdf0e10cSrcweir     else if (rType == container::XElementAccess::static_type())
2462cdf0e10cSrcweir     {
2463cdf0e10cSrcweir         aRet <<= uno::Reference< container::XElementAccess >(this);
2464cdf0e10cSrcweir     }
2465cdf0e10cSrcweir     else if (rType == lang::XServiceInfo::static_type())
2466cdf0e10cSrcweir     {
2467cdf0e10cSrcweir         aRet <<= uno::Reference< lang::XServiceInfo >(this);
2468cdf0e10cSrcweir     }
2469cdf0e10cSrcweir     else
2470cdf0e10cSrcweir     {
2471cdf0e10cSrcweir         aRet = SwXText::queryInterface( rType );
2472cdf0e10cSrcweir     }
2473cdf0e10cSrcweir     if(aRet.getValueType() == ::getCppuVoidType())
2474cdf0e10cSrcweir     {
2475cdf0e10cSrcweir         aRet = OWeakAggObject::queryAggregation( rType );
2476cdf0e10cSrcweir     }
2477cdf0e10cSrcweir     return aRet;
2478cdf0e10cSrcweir }
2479cdf0e10cSrcweir 
2480cdf0e10cSrcweir /*-- 10.12.98 11:17:28---------------------------------------------------
2481cdf0e10cSrcweir 
2482cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2483cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL
getTypes()2484cdf0e10cSrcweir SwXBodyText::getTypes() throw (uno::RuntimeException)
2485cdf0e10cSrcweir {
2486cdf0e10cSrcweir     const uno::Sequence< uno::Type > aTypes = SwXBodyText_Base::getTypes();
2487cdf0e10cSrcweir     const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
2488cdf0e10cSrcweir     return ::comphelper::concatSequences(aTypes, aTextTypes);
2489cdf0e10cSrcweir }
2490cdf0e10cSrcweir /* -----------------------------21.03.00 15:39--------------------------------
2491cdf0e10cSrcweir 
2492cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2493cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL
getImplementationId()2494cdf0e10cSrcweir SwXBodyText::getImplementationId() throw (uno::RuntimeException)
2495cdf0e10cSrcweir {
2496cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2497cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId( 16 );
2498cdf0e10cSrcweir     static sal_Bool bInit = sal_False;
2499cdf0e10cSrcweir     if(!bInit)
2500cdf0e10cSrcweir     {
2501cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
2502cdf0e10cSrcweir         bInit = sal_True;
2503cdf0e10cSrcweir     }
2504cdf0e10cSrcweir     return aId;
2505cdf0e10cSrcweir }
2506cdf0e10cSrcweir /*-- 10.12.98 11:17:28---------------------------------------------------
2507cdf0e10cSrcweir 
2508cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2509cdf0e10cSrcweir uno::Any SAL_CALL
queryInterface(const uno::Type & rType)2510cdf0e10cSrcweir SwXBodyText::queryInterface(const uno::Type& rType)
2511cdf0e10cSrcweir throw (uno::RuntimeException)
2512cdf0e10cSrcweir {
2513cdf0e10cSrcweir     const uno::Any ret = SwXText::queryInterface(rType);
2514cdf0e10cSrcweir     return (ret.getValueType() == ::getCppuVoidType())
2515cdf0e10cSrcweir         ?   SwXBodyText_Base::queryInterface(rType)
2516cdf0e10cSrcweir         :   ret;
2517cdf0e10cSrcweir }
2518cdf0e10cSrcweir /* -----------------------------05.01.00 11:07--------------------------------
2519cdf0e10cSrcweir 
2520cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
CreateTextCursor(const bool bIgnoreTables)2521cdf0e10cSrcweir SwXTextCursor * SwXBodyText::CreateTextCursor(const bool bIgnoreTables)
2522cdf0e10cSrcweir {
2523cdf0e10cSrcweir     if(!IsValid())
2524cdf0e10cSrcweir     {
2525cdf0e10cSrcweir         return 0;
2526cdf0e10cSrcweir     }
2527cdf0e10cSrcweir 
2528cdf0e10cSrcweir     // the cursor has to skip tables contained in this text
2529cdf0e10cSrcweir     SwPaM aPam(GetDoc()->GetNodes().GetEndOfContent());
2530cdf0e10cSrcweir     aPam.Move( fnMoveBackward, fnGoDoc );
2531cdf0e10cSrcweir     if (!bIgnoreTables)
2532cdf0e10cSrcweir     {
2533cdf0e10cSrcweir         SwTableNode * pTblNode = aPam.GetNode()->FindTableNode();
2534cdf0e10cSrcweir         SwCntntNode * pCont = 0;
2535cdf0e10cSrcweir         while (pTblNode)
2536cdf0e10cSrcweir         {
2537cdf0e10cSrcweir             aPam.GetPoint()->nNode = *pTblNode->EndOfSectionNode();
2538cdf0e10cSrcweir             pCont = GetDoc()->GetNodes().GoNext(&aPam.GetPoint()->nNode);
2539cdf0e10cSrcweir             pTblNode = pCont->FindTableNode();
2540cdf0e10cSrcweir         }
2541cdf0e10cSrcweir         if (pCont)
2542cdf0e10cSrcweir         {
2543cdf0e10cSrcweir             aPam.GetPoint()->nContent.Assign(pCont, 0);
2544cdf0e10cSrcweir         }
2545cdf0e10cSrcweir     }
2546cdf0e10cSrcweir     return new SwXTextCursor(*GetDoc(), this, CURSOR_BODY, *aPam.GetPoint());
2547cdf0e10cSrcweir }
2548cdf0e10cSrcweir 
2549cdf0e10cSrcweir /*-- 10.12.98 11:17:29---------------------------------------------------
2550cdf0e10cSrcweir 
2551cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2552cdf0e10cSrcweir uno::Reference< text::XTextCursor > SAL_CALL
createTextCursor()2553cdf0e10cSrcweir SwXBodyText::createTextCursor() throw (uno::RuntimeException)
2554cdf0e10cSrcweir {
2555cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2556cdf0e10cSrcweir 
2557cdf0e10cSrcweir     const uno::Reference< text::XTextCursor > xRef(
2558cdf0e10cSrcweir             static_cast<text::XWordCursor*>(CreateTextCursor(false)) );
2559cdf0e10cSrcweir     if (!xRef.is())
2560cdf0e10cSrcweir     {
2561cdf0e10cSrcweir         uno::RuntimeException aRuntime;
2562cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
2563cdf0e10cSrcweir         throw aRuntime;
2564cdf0e10cSrcweir     }
2565cdf0e10cSrcweir     return xRef;
2566cdf0e10cSrcweir }
2567cdf0e10cSrcweir /*-- 10.12.98 11:17:29---------------------------------------------------
2568cdf0e10cSrcweir 
2569cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2570cdf0e10cSrcweir uno::Reference< text::XTextCursor > SAL_CALL
createTextCursorByRange(const uno::Reference<text::XTextRange> & xTextPosition)2571cdf0e10cSrcweir SwXBodyText::createTextCursorByRange(
2572cdf0e10cSrcweir     const uno::Reference< text::XTextRange > & xTextPosition)
2573cdf0e10cSrcweir throw (uno::RuntimeException)
2574cdf0e10cSrcweir {
2575cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2576cdf0e10cSrcweir 
2577cdf0e10cSrcweir     if(!IsValid())
2578cdf0e10cSrcweir     {
2579cdf0e10cSrcweir         uno::RuntimeException aRuntime;
2580cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
2581cdf0e10cSrcweir         throw aRuntime;
2582cdf0e10cSrcweir     }
2583cdf0e10cSrcweir 
2584cdf0e10cSrcweir     uno::Reference< text::XTextCursor >  aRef;
2585cdf0e10cSrcweir     SwUnoInternalPaM aPam(*GetDoc());
2586cdf0e10cSrcweir     if (::sw::XTextRangeToSwPaM(aPam, xTextPosition))
2587cdf0e10cSrcweir     {
2588cdf0e10cSrcweir         SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
2589cdf0e10cSrcweir 
2590cdf0e10cSrcweir         SwStartNode* p1 = aPam.GetNode()->StartOfSectionNode();
2591cdf0e10cSrcweir         //document starts with a section?
2592cdf0e10cSrcweir         while(p1->IsSectionNode())
2593cdf0e10cSrcweir         {
2594cdf0e10cSrcweir             p1 = p1->StartOfSectionNode();
2595cdf0e10cSrcweir         }
2596cdf0e10cSrcweir         SwStartNode *const p2 = rNode.StartOfSectionNode();
2597cdf0e10cSrcweir 
2598cdf0e10cSrcweir         if(p1 == p2)
2599cdf0e10cSrcweir         {
2600cdf0e10cSrcweir             aRef = static_cast<text::XWordCursor*>(
2601cdf0e10cSrcweir                     new SwXTextCursor(*GetDoc(), this, CURSOR_BODY,
2602cdf0e10cSrcweir                         *aPam.GetPoint(), aPam.GetMark()));
2603cdf0e10cSrcweir         }
2604cdf0e10cSrcweir     }
2605cdf0e10cSrcweir     if(!aRef.is())
2606cdf0e10cSrcweir     {
2607cdf0e10cSrcweir         throw uno::RuntimeException();
2608cdf0e10cSrcweir     }
2609cdf0e10cSrcweir     return aRef;
2610cdf0e10cSrcweir }
2611cdf0e10cSrcweir 
2612cdf0e10cSrcweir /*-- 10.12.98 11:17:30---------------------------------------------------
2613cdf0e10cSrcweir 
2614cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2615cdf0e10cSrcweir uno::Reference< container::XEnumeration > SAL_CALL
createEnumeration()2616cdf0e10cSrcweir SwXBodyText::createEnumeration()
2617cdf0e10cSrcweir throw (uno::RuntimeException)
2618cdf0e10cSrcweir {
2619cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2620cdf0e10cSrcweir 
2621cdf0e10cSrcweir     if (!IsValid())
2622cdf0e10cSrcweir     {
2623cdf0e10cSrcweir         uno::RuntimeException aRuntime;
2624cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
2625cdf0e10cSrcweir         throw aRuntime;
2626cdf0e10cSrcweir     }
2627cdf0e10cSrcweir 
2628cdf0e10cSrcweir     SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
2629cdf0e10cSrcweir     SwPosition aPos(rNode);
2630cdf0e10cSrcweir     ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
2631cdf0e10cSrcweir         GetDoc()->CreateUnoCrsr(aPos, sal_False));
2632cdf0e10cSrcweir     pUnoCursor->Move(fnMoveBackward, fnGoDoc);
2633cdf0e10cSrcweir     const uno::Reference< container::XEnumeration > xRet
2634cdf0e10cSrcweir         = new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_BODY);
2635cdf0e10cSrcweir     return xRet;
2636cdf0e10cSrcweir }
2637cdf0e10cSrcweir 
2638cdf0e10cSrcweir /* -----------------18.12.98 13:36-------------------
2639cdf0e10cSrcweir  *
2640cdf0e10cSrcweir  * --------------------------------------------------*/
2641cdf0e10cSrcweir uno::Type SAL_CALL
getElementType()2642cdf0e10cSrcweir SwXBodyText::getElementType() throw (uno::RuntimeException)
2643cdf0e10cSrcweir {
2644cdf0e10cSrcweir     return text::XTextRange::static_type();
2645cdf0e10cSrcweir }
2646cdf0e10cSrcweir /* -----------------18.12.98 13:36-------------------
2647cdf0e10cSrcweir  *
2648cdf0e10cSrcweir  * --------------------------------------------------*/
2649cdf0e10cSrcweir sal_Bool SAL_CALL
hasElements()2650cdf0e10cSrcweir SwXBodyText::hasElements() throw (uno::RuntimeException)
2651cdf0e10cSrcweir {
2652cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2653cdf0e10cSrcweir 
2654cdf0e10cSrcweir     if (!IsValid())
2655cdf0e10cSrcweir     {
2656cdf0e10cSrcweir         uno::RuntimeException aRuntime;
2657cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
2658cdf0e10cSrcweir         throw aRuntime;
2659cdf0e10cSrcweir     }
2660cdf0e10cSrcweir 
2661cdf0e10cSrcweir     return sal_True;
2662cdf0e10cSrcweir }
2663cdf0e10cSrcweir 
2664cdf0e10cSrcweir /******************************************************************
2665cdf0e10cSrcweir  *  SwXHeadFootText
2666cdf0e10cSrcweir  ******************************************************************/
2667cdf0e10cSrcweir 
2668cdf0e10cSrcweir class SwXHeadFootText::Impl
2669cdf0e10cSrcweir     : public SwClient
2670cdf0e10cSrcweir {
2671cdf0e10cSrcweir 
2672cdf0e10cSrcweir public:
2673cdf0e10cSrcweir 
2674cdf0e10cSrcweir     bool                        m_bIsHeader;
2675cdf0e10cSrcweir 
Impl(SwXHeadFootText &,SwFrmFmt & rHeadFootFmt,const bool bIsHeader)2676cdf0e10cSrcweir     Impl(   SwXHeadFootText & /*rThis*/,
2677cdf0e10cSrcweir             SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
2678cdf0e10cSrcweir         : SwClient(& rHeadFootFmt)
2679cdf0e10cSrcweir         , m_bIsHeader(bIsHeader)
2680cdf0e10cSrcweir     {
2681cdf0e10cSrcweir     }
2682cdf0e10cSrcweir 
GetHeadFootFmt() const2683cdf0e10cSrcweir     SwFrmFmt * GetHeadFootFmt() const {
2684cdf0e10cSrcweir         return static_cast<SwFrmFmt*>(
2685cdf0e10cSrcweir                 const_cast<SwModify*>(GetRegisteredIn()));
2686cdf0e10cSrcweir     }
2687cdf0e10cSrcweir 
GetHeadFootFmtOrThrow()2688cdf0e10cSrcweir     SwFrmFmt & GetHeadFootFmtOrThrow() {
2689cdf0e10cSrcweir         SwFrmFmt *const pFmt( GetHeadFootFmt() );
2690cdf0e10cSrcweir         if (!pFmt) {
2691cdf0e10cSrcweir             throw uno::RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM(
2692cdf0e10cSrcweir                     "SwXHeadFootText: disposed or invalid")), 0);
2693cdf0e10cSrcweir         }
2694cdf0e10cSrcweir         return *pFmt;
2695cdf0e10cSrcweir     }
2696cdf0e10cSrcweir protected:
2697cdf0e10cSrcweir     // SwClient
2698cdf0e10cSrcweir     virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew);
2699cdf0e10cSrcweir 
2700cdf0e10cSrcweir };
2701cdf0e10cSrcweir 
2702cdf0e10cSrcweir /*-- 11.12.98 10:14:51---------------------------------------------------
2703cdf0e10cSrcweir 
2704cdf0e10cSrcweir   -----------------------------------------------------------------------*/
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)2705cdf0e10cSrcweir void SwXHeadFootText::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew)
2706cdf0e10cSrcweir {
2707cdf0e10cSrcweir     ClientModify(this, pOld, pNew);
2708cdf0e10cSrcweir }
2709cdf0e10cSrcweir 
IsXHeadFootText(SwClient * const pClient)2710cdf0e10cSrcweir bool SwXHeadFootText::IsXHeadFootText(SwClient *const pClient)
2711cdf0e10cSrcweir {
2712cdf0e10cSrcweir     return 0 != dynamic_cast<SwXHeadFootText::Impl*>(pClient);
2713cdf0e10cSrcweir }
2714cdf0e10cSrcweir 
2715cdf0e10cSrcweir uno::Reference< text::XText >
CreateXHeadFootText(SwFrmFmt & rHeadFootFmt,const bool bIsHeader)2716cdf0e10cSrcweir SwXHeadFootText::CreateXHeadFootText(
2717cdf0e10cSrcweir         SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
2718cdf0e10cSrcweir {
2719cdf0e10cSrcweir     // re-use existing SwXHeadFootText
2720cdf0e10cSrcweir     // #i105557#: do not iterate over the registered clients: race condition
2721cdf0e10cSrcweir     uno::Reference< text::XText > xText(rHeadFootFmt.GetXObject(),
2722cdf0e10cSrcweir             uno::UNO_QUERY);
2723cdf0e10cSrcweir     if (!xText.is())
2724cdf0e10cSrcweir     {
2725cdf0e10cSrcweir         SwXHeadFootText *const pXHFT(
2726cdf0e10cSrcweir                 new SwXHeadFootText(rHeadFootFmt, bIsHeader));
2727cdf0e10cSrcweir         xText.set(pXHFT);
2728cdf0e10cSrcweir         rHeadFootFmt.SetXObject(xText);
2729cdf0e10cSrcweir     }
2730cdf0e10cSrcweir     return xText;
2731cdf0e10cSrcweir }
2732cdf0e10cSrcweir 
2733cdf0e10cSrcweir /*-- 11.12.98 10:14:48---------------------------------------------------
2734cdf0e10cSrcweir 
2735cdf0e10cSrcweir   -----------------------------------------------------------------------*/
SwXHeadFootText(SwFrmFmt & rHeadFootFmt,const bool bIsHeader)2736cdf0e10cSrcweir SwXHeadFootText::SwXHeadFootText(SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
2737cdf0e10cSrcweir     : SwXText(rHeadFootFmt.GetDoc(),
2738cdf0e10cSrcweir             (bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER)
2739cdf0e10cSrcweir     , m_pImpl( new SwXHeadFootText::Impl(*this, rHeadFootFmt, bIsHeader) )
2740cdf0e10cSrcweir {
2741cdf0e10cSrcweir }
2742cdf0e10cSrcweir 
2743cdf0e10cSrcweir /*-- 11.12.98 10:14:48---------------------------------------------------
2744cdf0e10cSrcweir 
2745cdf0e10cSrcweir   -----------------------------------------------------------------------*/
~SwXHeadFootText()2746cdf0e10cSrcweir SwXHeadFootText::~SwXHeadFootText()
2747cdf0e10cSrcweir {
2748cdf0e10cSrcweir }
2749cdf0e10cSrcweir 
2750cdf0e10cSrcweir /* -----------------------------06.04.00 16:40--------------------------------
2751cdf0e10cSrcweir 
2752cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2753cdf0e10cSrcweir OUString SAL_CALL
getImplementationName()2754cdf0e10cSrcweir SwXHeadFootText::getImplementationName() throw (uno::RuntimeException)
2755cdf0e10cSrcweir {
2756cdf0e10cSrcweir     return C2U("SwXHeadFootText");
2757cdf0e10cSrcweir }
2758cdf0e10cSrcweir 
2759cdf0e10cSrcweir /* -----------------------------06.04.00 16:40--------------------------------
2760cdf0e10cSrcweir 
2761cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2762cdf0e10cSrcweir static char const*const g_ServicesHeadFootText[] =
2763cdf0e10cSrcweir {
2764cdf0e10cSrcweir     "com.sun.star.text.Text",
2765cdf0e10cSrcweir };
2766cdf0e10cSrcweir static const size_t g_nServicesHeadFootText(
2767cdf0e10cSrcweir     sizeof(g_ServicesHeadFootText)/sizeof(g_ServicesHeadFootText[0]));
2768cdf0e10cSrcweir 
supportsService(const OUString & rServiceName)2769cdf0e10cSrcweir sal_Bool SAL_CALL SwXHeadFootText::supportsService(const OUString& rServiceName)
2770cdf0e10cSrcweir throw (uno::RuntimeException)
2771cdf0e10cSrcweir {
2772cdf0e10cSrcweir     return ::sw::SupportsServiceImpl(
2773cdf0e10cSrcweir             g_nServicesHeadFootText, g_ServicesHeadFootText, rServiceName);
2774cdf0e10cSrcweir }
2775cdf0e10cSrcweir 
2776cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL
getSupportedServiceNames()2777cdf0e10cSrcweir SwXHeadFootText::getSupportedServiceNames() throw (uno::RuntimeException)
2778cdf0e10cSrcweir {
2779cdf0e10cSrcweir     return ::sw::GetSupportedServiceNamesImpl(
2780cdf0e10cSrcweir             g_nServicesHeadFootText, g_ServicesHeadFootText);
2781cdf0e10cSrcweir }
2782cdf0e10cSrcweir 
2783cdf0e10cSrcweir /*-- 11.12.98 10:14:49---------------------------------------------------
2784cdf0e10cSrcweir 
2785cdf0e10cSrcweir   -----------------------------------------------------------------------*/
GetStartNode() const2786cdf0e10cSrcweir const SwStartNode *SwXHeadFootText::GetStartNode() const
2787cdf0e10cSrcweir {
2788cdf0e10cSrcweir     const SwStartNode *pSttNd = 0;
2789cdf0e10cSrcweir     SwFrmFmt *const pHeadFootFmt = m_pImpl->GetHeadFootFmt();
2790cdf0e10cSrcweir     if(pHeadFootFmt)
2791cdf0e10cSrcweir     {
2792cdf0e10cSrcweir         const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
2793cdf0e10cSrcweir         if( rFlyCntnt.GetCntntIdx() )
2794cdf0e10cSrcweir         {
2795cdf0e10cSrcweir             pSttNd = rFlyCntnt.GetCntntIdx()->GetNode().GetStartNode();
2796cdf0e10cSrcweir         }
2797cdf0e10cSrcweir     }
2798cdf0e10cSrcweir     return pSttNd;
2799cdf0e10cSrcweir }
2800cdf0e10cSrcweir 
2801cdf0e10cSrcweir uno::Reference< text::XTextCursor >
CreateCursor()2802cdf0e10cSrcweir SwXHeadFootText::CreateCursor() throw (uno::RuntimeException)
2803cdf0e10cSrcweir {
2804cdf0e10cSrcweir     return createTextCursor();
2805cdf0e10cSrcweir }
2806cdf0e10cSrcweir /* -----------------------------21.03.00 15:39--------------------------------
2807cdf0e10cSrcweir 
2808cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2809cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL
getTypes()2810cdf0e10cSrcweir SwXHeadFootText::getTypes() throw (uno::RuntimeException)
2811cdf0e10cSrcweir {
2812cdf0e10cSrcweir     const uno::Sequence< uno::Type > aTypes = SwXHeadFootText_Base::getTypes();
2813cdf0e10cSrcweir     const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
2814cdf0e10cSrcweir     return ::comphelper::concatSequences(aTypes, aTextTypes);
2815cdf0e10cSrcweir }
2816cdf0e10cSrcweir 
2817cdf0e10cSrcweir /* -----------------------------21.03.00 15:39--------------------------------
2818cdf0e10cSrcweir 
2819cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2820cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL
getImplementationId()2821cdf0e10cSrcweir SwXHeadFootText::getImplementationId() throw (uno::RuntimeException)
2822cdf0e10cSrcweir {
2823cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2824cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId( 16 );
2825cdf0e10cSrcweir     static sal_Bool bInit = sal_False;
2826cdf0e10cSrcweir     if(!bInit)
2827cdf0e10cSrcweir     {
2828cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
2829cdf0e10cSrcweir         bInit = sal_True;
2830cdf0e10cSrcweir     }
2831cdf0e10cSrcweir     return aId;
2832cdf0e10cSrcweir }
2833cdf0e10cSrcweir /* -----------------------------21.03.00 15:46--------------------------------
2834cdf0e10cSrcweir 
2835cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
2836cdf0e10cSrcweir uno::Any SAL_CALL
queryInterface(const uno::Type & rType)2837cdf0e10cSrcweir SwXHeadFootText::queryInterface(const uno::Type& rType)
2838cdf0e10cSrcweir throw (uno::RuntimeException)
2839cdf0e10cSrcweir {
2840cdf0e10cSrcweir     const uno::Any ret = SwXHeadFootText_Base::queryInterface(rType);
2841cdf0e10cSrcweir     return (ret.getValueType() == ::getCppuVoidType())
2842cdf0e10cSrcweir         ?   SwXText::queryInterface(rType)
2843cdf0e10cSrcweir         :   ret;
2844cdf0e10cSrcweir }
2845cdf0e10cSrcweir 
2846cdf0e10cSrcweir /*-- 11.12.98 10:14:50---------------------------------------------------
2847cdf0e10cSrcweir 
2848cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2849cdf0e10cSrcweir uno::Reference< text::XTextCursor > SAL_CALL
createTextCursor()2850cdf0e10cSrcweir SwXHeadFootText::createTextCursor() throw (uno::RuntimeException)
2851cdf0e10cSrcweir {
2852cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2853cdf0e10cSrcweir 
2854cdf0e10cSrcweir     SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
2855cdf0e10cSrcweir 
2856cdf0e10cSrcweir     uno::Reference< text::XTextCursor > xRet;
2857cdf0e10cSrcweir     const SwFmtCntnt& rFlyCntnt = rHeadFootFmt.GetCntnt();
2858cdf0e10cSrcweir     const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
2859cdf0e10cSrcweir     SwPosition aPos(rNode);
2860cdf0e10cSrcweir     SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this,
2861cdf0e10cSrcweir             (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER, aPos);
2862cdf0e10cSrcweir     SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
2863cdf0e10cSrcweir     pUnoCrsr->Move(fnMoveForward, fnGoNode);
2864cdf0e10cSrcweir 
2865cdf0e10cSrcweir     // save current start node to be able to check if there is content
2866cdf0e10cSrcweir     // after the table - otherwise the cursor would be in the body text!
2867cdf0e10cSrcweir     SwStartNode const*const pOwnStartNode = rNode.FindSttNodeByType(
2868cdf0e10cSrcweir             (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
2869cdf0e10cSrcweir     // is there a table here?
2870cdf0e10cSrcweir     SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode();
2871cdf0e10cSrcweir     SwCntntNode* pCont = 0;
2872cdf0e10cSrcweir     while (pTblNode)
2873cdf0e10cSrcweir     {
2874cdf0e10cSrcweir         pUnoCrsr->GetPoint()->nNode = *pTblNode->EndOfSectionNode();
2875cdf0e10cSrcweir         pCont = GetDoc()->GetNodes().GoNext(&pUnoCrsr->GetPoint()->nNode);
2876cdf0e10cSrcweir         pTblNode = pCont->FindTableNode();
2877cdf0e10cSrcweir     }
2878cdf0e10cSrcweir     if (pCont)
2879cdf0e10cSrcweir     {
2880cdf0e10cSrcweir         pUnoCrsr->GetPoint()->nContent.Assign(pCont, 0);
2881cdf0e10cSrcweir     }
2882cdf0e10cSrcweir     SwStartNode const*const pNewStartNode =
2883cdf0e10cSrcweir         pUnoCrsr->GetNode()->FindSttNodeByType(
2884cdf0e10cSrcweir             (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
2885cdf0e10cSrcweir     if (!pNewStartNode || (pNewStartNode != pOwnStartNode))
2886cdf0e10cSrcweir     {
2887cdf0e10cSrcweir         uno::RuntimeException aExcept;
288824c56ab9SHerbert Dürr         aExcept.Message = C2U("no text available");
2889cdf0e10cSrcweir         throw aExcept;
2890cdf0e10cSrcweir     }
2891cdf0e10cSrcweir     xRet = static_cast<text::XWordCursor*>(pXCursor);
2892cdf0e10cSrcweir     return xRet;
2893cdf0e10cSrcweir }
2894cdf0e10cSrcweir 
2895cdf0e10cSrcweir /*-- 11.12.98 10:14:50---------------------------------------------------
2896cdf0e10cSrcweir 
2897cdf0e10cSrcweir   -----------------------------------------------------------------------*/
2898cdf0e10cSrcweir uno::Reference< text::XTextCursor > SAL_CALL
createTextCursorByRange(const uno::Reference<text::XTextRange> & xTextPosition)2899cdf0e10cSrcweir SwXHeadFootText::createTextCursorByRange(
2900cdf0e10cSrcweir     const uno::Reference< text::XTextRange > & xTextPosition)
2901cdf0e10cSrcweir throw (uno::RuntimeException)
2902cdf0e10cSrcweir {
2903cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2904cdf0e10cSrcweir 
2905cdf0e10cSrcweir     SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
2906cdf0e10cSrcweir 
2907cdf0e10cSrcweir     SwUnoInternalPaM aPam(*GetDoc());
2908cdf0e10cSrcweir     if (!::sw::XTextRangeToSwPaM(aPam, xTextPosition))
2909cdf0e10cSrcweir     {
2910cdf0e10cSrcweir         uno::RuntimeException aRuntime;
2911cdf0e10cSrcweir         aRuntime.Message = C2U(cInvalidObject);
2912cdf0e10cSrcweir         throw aRuntime;
2913cdf0e10cSrcweir     }
2914cdf0e10cSrcweir 
2915cdf0e10cSrcweir     uno::Reference< text::XTextCursor >  xRet;
2916cdf0e10cSrcweir     SwNode& rNode = rHeadFootFmt.GetCntnt().GetCntntIdx()->GetNode();
2917cdf0e10cSrcweir     SwPosition aPos(rNode);
2918cdf0e10cSrcweir     SwPaM aHFPam(aPos);
2919cdf0e10cSrcweir     aHFPam.Move(fnMoveForward, fnGoNode);
2920cdf0e10cSrcweir     SwStartNode *const pOwnStartNode = aHFPam.GetNode()->FindSttNodeByType(
2921cdf0e10cSrcweir             (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
2922cdf0e10cSrcweir     SwStartNode *const p1 = aPam.GetNode()->FindSttNodeByType(
2923cdf0e10cSrcweir             (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
2924cdf0e10cSrcweir     if (p1 == pOwnStartNode)
2925cdf0e10cSrcweir     {
2926cdf0e10cSrcweir         xRet = static_cast<text::XWordCursor*>(
2927cdf0e10cSrcweir                 new SwXTextCursor(*GetDoc(), this,
2928cdf0e10cSrcweir                     (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER,
2929cdf0e10cSrcweir                     *aPam.GetPoint(), aPam.GetMark()));
2930cdf0e10cSrcweir     }
2931cdf0e10cSrcweir     return xRet;
2932cdf0e10cSrcweir }
2933cdf0e10cSrcweir 
2934cdf0e10cSrcweir /* -----------------19.03.99 15:44-------------------
2935cdf0e10cSrcweir  *
2936cdf0e10cSrcweir  * --------------------------------------------------*/
2937cdf0e10cSrcweir uno::Reference< container::XEnumeration > SAL_CALL
createEnumeration()2938cdf0e10cSrcweir SwXHeadFootText::createEnumeration()
2939cdf0e10cSrcweir throw (uno::RuntimeException)
2940cdf0e10cSrcweir {
2941cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
2942cdf0e10cSrcweir 
2943cdf0e10cSrcweir     SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
2944cdf0e10cSrcweir 
2945cdf0e10cSrcweir     uno::Reference< container::XEnumeration >  aRef;
2946cdf0e10cSrcweir     const SwFmtCntnt& rFlyCntnt = rHeadFootFmt.GetCntnt();
2947cdf0e10cSrcweir     const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
2948cdf0e10cSrcweir     SwPosition aPos(rNode);
2949cdf0e10cSrcweir     ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
2950cdf0e10cSrcweir         GetDoc()->CreateUnoCrsr(aPos, sal_False));
2951cdf0e10cSrcweir     pUnoCursor->Move(fnMoveForward, fnGoNode);
2952cdf0e10cSrcweir     aRef = new SwXParagraphEnumeration(this, pUnoCursor,
2953cdf0e10cSrcweir                 (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER);
2954cdf0e10cSrcweir 
2955cdf0e10cSrcweir     return aRef;
2956cdf0e10cSrcweir }
2957cdf0e10cSrcweir 
2958cdf0e10cSrcweir /* -----------------19.03.99 15:50-------------------
2959cdf0e10cSrcweir  *
2960cdf0e10cSrcweir  * --------------------------------------------------*/
2961cdf0e10cSrcweir uno::Type SAL_CALL
getElementType()2962cdf0e10cSrcweir SwXHeadFootText::getElementType() throw (uno::RuntimeException)
2963cdf0e10cSrcweir {
2964cdf0e10cSrcweir     return text::XTextRange::static_type();
2965cdf0e10cSrcweir }
2966cdf0e10cSrcweir /* -----------------19.03.99 15:50-------------------
2967cdf0e10cSrcweir  *
2968cdf0e10cSrcweir  * --------------------------------------------------*/
hasElements()2969cdf0e10cSrcweir sal_Bool SAL_CALL SwXHeadFootText::hasElements() throw (uno::RuntimeException)
2970cdf0e10cSrcweir {
2971cdf0e10cSrcweir     return sal_True;
2972cdf0e10cSrcweir }
2973