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