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 #include <unotextmarkup.hxx>
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include <vos/mutex.hxx>
29cdf0e10cSrcweir #include <vcl/svapp.hxx>
30cdf0e10cSrcweir #include <SwSmartTagMgr.hxx>
31cdf0e10cSrcweir #include <com/sun/star/text/TextMarkupType.hpp>
32cdf0e10cSrcweir #include <com/sun/star/text/TextMarkupDescriptor.hpp>
33cdf0e10cSrcweir #include <com/sun/star/container/XStringKeyMap.hpp>
34cdf0e10cSrcweir #include <ndtxt.hxx>
35cdf0e10cSrcweir #include <SwGrammarMarkUp.hxx>
36cdf0e10cSrcweir
37cdf0e10cSrcweir #include <IGrammarContact.hxx>
38cdf0e10cSrcweir
39*1ced0919SJürgen Schmidt #include <com/sun/star/lang/XUnoTunnel.hpp>
40*1ced0919SJürgen Schmidt #include <com/sun/star/text/XTextRange.hpp>
41*1ced0919SJürgen Schmidt
42*1ced0919SJürgen Schmidt #include <pam.hxx>
43*1ced0919SJürgen Schmidt
44*1ced0919SJürgen Schmidt #include <unotextrange.hxx>
45*1ced0919SJürgen Schmidt #include <unotextcursor.hxx>
46*1ced0919SJürgen Schmidt
47*1ced0919SJürgen Schmidt
48cdf0e10cSrcweir using namespace ::com::sun::star;
49cdf0e10cSrcweir
50cdf0e10cSrcweir /*
51cdf0e10cSrcweir * SwXTextMarkup
52cdf0e10cSrcweir */
SwXTextMarkup(SwTxtNode & rTxtNode,const ModelToViewHelper::ConversionMap * pMap)53cdf0e10cSrcweir SwXTextMarkup::SwXTextMarkup( SwTxtNode& rTxtNode, const ModelToViewHelper::ConversionMap* pMap )
54cdf0e10cSrcweir : mpTxtNode( &rTxtNode ), mpConversionMap( pMap )
55cdf0e10cSrcweir {
56cdf0e10cSrcweir // FME 2007-07-16 #i79641# SwXTextMarkup is allowed to be removed ...
57cdf0e10cSrcweir SetIsAllowedToBeRemovedInModifyCall(true);
58cdf0e10cSrcweir mpTxtNode->Add(this);
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
~SwXTextMarkup()61cdf0e10cSrcweir SwXTextMarkup::~SwXTextMarkup()
62cdf0e10cSrcweir {
63cdf0e10cSrcweir delete mpConversionMap;
64cdf0e10cSrcweir }
65cdf0e10cSrcweir
getMarkupInfoContainer()66cdf0e10cSrcweir uno::Reference< container::XStringKeyMap > SAL_CALL SwXTextMarkup::getMarkupInfoContainer() throw (uno::RuntimeException)
67cdf0e10cSrcweir {
68cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
69cdf0e10cSrcweir
70cdf0e10cSrcweir uno::Reference< container::XStringKeyMap > xProp = new SwXStringKeyMap;
71cdf0e10cSrcweir return xProp;
72cdf0e10cSrcweir }
73cdf0e10cSrcweir
commitTextRangeMarkup(::sal_Int32 nType,const::rtl::OUString & aIdentifier,const uno::Reference<text::XTextRange> & xRange,const uno::Reference<container::XStringKeyMap> & xMarkupInfoContainer)74*1ced0919SJürgen Schmidt void SAL_CALL SwXTextMarkup::commitTextRangeMarkup(::sal_Int32 nType, const ::rtl::OUString & aIdentifier, const uno::Reference< text::XTextRange> & xRange,
75*1ced0919SJürgen Schmidt const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer) throw (uno::RuntimeException)
76*1ced0919SJürgen Schmidt {
77*1ced0919SJürgen Schmidt vos::OGuard aGuard(Application::GetSolarMutex());
78*1ced0919SJürgen Schmidt
79*1ced0919SJürgen Schmidt uno::Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY);
80*1ced0919SJürgen Schmidt
81*1ced0919SJürgen Schmidt if(!xRangeTunnel.is()) return;
82*1ced0919SJürgen Schmidt
83*1ced0919SJürgen Schmidt SwXTextRange* pRange = 0;
84*1ced0919SJürgen Schmidt OTextCursorHelper* pCursor = 0;
85*1ced0919SJürgen Schmidt
86*1ced0919SJürgen Schmidt if(xRangeTunnel.is())
87*1ced0919SJürgen Schmidt {
88*1ced0919SJürgen Schmidt pRange = reinterpret_cast<SwXTextRange*>( sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething(SwXTextRange::getUnoTunnelId())));
89*1ced0919SJürgen Schmidt pCursor = reinterpret_cast<OTextCursorHelper*>( sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething(OTextCursorHelper::getUnoTunnelId())));
90*1ced0919SJürgen Schmidt }
91*1ced0919SJürgen Schmidt
92*1ced0919SJürgen Schmidt if (pRange)
93*1ced0919SJürgen Schmidt {
94*1ced0919SJürgen Schmidt SwDoc* pDoc = reinterpret_cast<SwDoc*>(pRange->GetDoc());
95*1ced0919SJürgen Schmidt
96*1ced0919SJürgen Schmidt if (!pDoc) return;
97*1ced0919SJürgen Schmidt
98*1ced0919SJürgen Schmidt SwUnoInternalPaM aPam(*pDoc);
99*1ced0919SJürgen Schmidt
100*1ced0919SJürgen Schmidt ::sw::XTextRangeToSwPaM(aPam, xRange);
101*1ced0919SJürgen Schmidt
102*1ced0919SJürgen Schmidt SwPosition* startPos = aPam.Start();
103*1ced0919SJürgen Schmidt SwPosition* endPos = aPam.End();
104*1ced0919SJürgen Schmidt
105*1ced0919SJürgen Schmidt commitStringMarkup (nType, aIdentifier, startPos->nContent.GetIndex(), endPos->nContent.GetIndex() - startPos->nContent.GetIndex(), xMarkupInfoContainer);
106*1ced0919SJürgen Schmidt }
107*1ced0919SJürgen Schmidt else if (pCursor)
108*1ced0919SJürgen Schmidt {
109*1ced0919SJürgen Schmidt SwPaM aPam(*pCursor->GetPaM());
110*1ced0919SJürgen Schmidt
111*1ced0919SJürgen Schmidt SwPosition* startPos = aPam.Start();
112*1ced0919SJürgen Schmidt SwPosition* endPos = aPam.End();
113*1ced0919SJürgen Schmidt
114*1ced0919SJürgen Schmidt commitStringMarkup (nType, aIdentifier, startPos->nContent.GetIndex(), endPos->nContent.GetIndex() - startPos->nContent.GetIndex(), xMarkupInfoContainer);
115*1ced0919SJürgen Schmidt }
116*1ced0919SJürgen Schmidt }
117*1ced0919SJürgen Schmidt
118*1ced0919SJürgen Schmidt
commitStringMarkup(::sal_Int32 nType,const::rtl::OUString & rIdentifier,::sal_Int32 nStart,::sal_Int32 nLength,const uno::Reference<container::XStringKeyMap> & xMarkupInfoContainer)119*1ced0919SJürgen Schmidt void SAL_CALL SwXTextMarkup::commitStringMarkup(
120cdf0e10cSrcweir ::sal_Int32 nType,
121cdf0e10cSrcweir const ::rtl::OUString & rIdentifier,
122cdf0e10cSrcweir ::sal_Int32 nStart,
123cdf0e10cSrcweir ::sal_Int32 nLength,
124cdf0e10cSrcweir const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
125cdf0e10cSrcweir throw (uno::RuntimeException)
126cdf0e10cSrcweir {
127cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
128cdf0e10cSrcweir
129cdf0e10cSrcweir // paragraph already dead or modified?
130cdf0e10cSrcweir if ( !mpTxtNode || nLength <= 0 )
131cdf0e10cSrcweir return;
132cdf0e10cSrcweir
133cdf0e10cSrcweir if ( nType == text::TextMarkupType::SMARTTAG &&
134cdf0e10cSrcweir !SwSmartTagMgr::Get().IsSmartTagTypeEnabled( rIdentifier ) )
135cdf0e10cSrcweir return;
136cdf0e10cSrcweir
137cdf0e10cSrcweir // get appropriate list to use...
138cdf0e10cSrcweir SwWrongList* pWList = 0;
139cdf0e10cSrcweir bool bRepaint = false;
140cdf0e10cSrcweir if ( nType == text::TextMarkupType::SPELLCHECK )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir pWList = mpTxtNode->GetWrong();
143cdf0e10cSrcweir if ( !pWList )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir pWList = new SwWrongList( WRONGLIST_SPELL );
146cdf0e10cSrcweir mpTxtNode->SetWrong( pWList );
147cdf0e10cSrcweir }
148cdf0e10cSrcweir }
149cdf0e10cSrcweir else if ( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir IGrammarContact *pGrammarContact = getGrammarContact( *mpTxtNode );
152cdf0e10cSrcweir if( pGrammarContact )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir pWList = pGrammarContact->getGrammarCheck( *mpTxtNode, true );
155cdf0e10cSrcweir ASSERT( pWList, "GrammarContact _has_ to deliver a wrong list" )
156cdf0e10cSrcweir }
157cdf0e10cSrcweir else
158cdf0e10cSrcweir {
159cdf0e10cSrcweir pWList = mpTxtNode->GetGrammarCheck();
160cdf0e10cSrcweir if ( !pWList )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir mpTxtNode->SetGrammarCheck( new SwGrammarMarkUp() );
163cdf0e10cSrcweir pWList = mpTxtNode->GetGrammarCheck();
164cdf0e10cSrcweir }
165cdf0e10cSrcweir }
166cdf0e10cSrcweir bRepaint = pWList == mpTxtNode->GetGrammarCheck();
167cdf0e10cSrcweir if( pWList->GetBeginInv() < STRING_LEN )
168cdf0e10cSrcweir ((SwGrammarMarkUp*)pWList)->ClearGrammarList();
169cdf0e10cSrcweir }
170cdf0e10cSrcweir else if ( nType == text::TextMarkupType::SMARTTAG )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir pWList = mpTxtNode->GetSmartTags();
173cdf0e10cSrcweir if ( !pWList )
174cdf0e10cSrcweir {
175cdf0e10cSrcweir pWList = new SwWrongList( WRONGLIST_SMARTTAG );
176cdf0e10cSrcweir mpTxtNode->SetSmartTags( pWList );
177cdf0e10cSrcweir }
178cdf0e10cSrcweir }
179cdf0e10cSrcweir else
180cdf0e10cSrcweir {
181cdf0e10cSrcweir ASSERT( false, "Unknown mark-up type" )
182cdf0e10cSrcweir return;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
185cdf0e10cSrcweir
186cdf0e10cSrcweir const ModelToViewHelper::ModelPosition aStartPos =
187cdf0e10cSrcweir ModelToViewHelper::ConvertToModelPosition( mpConversionMap, nStart );
188cdf0e10cSrcweir const ModelToViewHelper::ModelPosition aEndPos =
189cdf0e10cSrcweir ModelToViewHelper::ConvertToModelPosition( mpConversionMap, nStart + nLength - 1);
190cdf0e10cSrcweir
191cdf0e10cSrcweir const bool bStartInField = aStartPos.mbIsField;
192cdf0e10cSrcweir const bool bEndInField = aEndPos.mbIsField;
193cdf0e10cSrcweir bool bCommit = false;
194cdf0e10cSrcweir
195cdf0e10cSrcweir if ( bStartInField && bEndInField && aStartPos.mnPos == aEndPos.mnPos )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir nStart = aStartPos.mnSubPos;
198cdf0e10cSrcweir const xub_StrLen nFieldPosModel = static_cast< xub_StrLen >(aStartPos.mnPos);
199cdf0e10cSrcweir const sal_uInt16 nInsertPos = pWList->GetWrongPos( nFieldPosModel );
200cdf0e10cSrcweir
201cdf0e10cSrcweir SwWrongList* pSubList = pWList->SubList( nInsertPos );
202cdf0e10cSrcweir if ( !pSubList )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir if( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
205cdf0e10cSrcweir pSubList = new SwGrammarMarkUp();
206cdf0e10cSrcweir else
207cdf0e10cSrcweir pSubList = new SwWrongList( pWList->GetWrongListType() );
208cdf0e10cSrcweir pWList->InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
209cdf0e10cSrcweir }
210cdf0e10cSrcweir
211cdf0e10cSrcweir pWList = pSubList;
212cdf0e10cSrcweir bCommit = true;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir else if ( !bStartInField && !bEndInField )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir nStart = aStartPos.mnPos;
217cdf0e10cSrcweir bCommit = true;
218cdf0e10cSrcweir nLength = aEndPos.mnPos + 1 - aStartPos.mnPos;
219cdf0e10cSrcweir }
220cdf0e10cSrcweir else if( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir bCommit = true;
223cdf0e10cSrcweir nStart = aStartPos.mnPos;
224cdf0e10cSrcweir sal_Int32 nEnd = aEndPos.mnPos;
225cdf0e10cSrcweir if( bStartInField && nType != text::TextMarkupType::SENTENCE )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir const xub_StrLen nFieldPosModel = static_cast< xub_StrLen >(aStartPos.mnPos);
228cdf0e10cSrcweir const sal_uInt16 nInsertPos = pWList->GetWrongPos( nFieldPosModel );
229cdf0e10cSrcweir SwWrongList* pSubList = pWList->SubList( nInsertPos );
230cdf0e10cSrcweir if ( !pSubList )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir pSubList = new SwGrammarMarkUp();
233cdf0e10cSrcweir pWList->InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
234cdf0e10cSrcweir }
235cdf0e10cSrcweir const sal_uInt32 nTmpStart = ModelToViewHelper::ConvertToViewPosition( mpConversionMap, aStartPos.mnPos );
236cdf0e10cSrcweir const sal_uInt32 nTmpLen = ModelToViewHelper::ConvertToViewPosition( mpConversionMap, aStartPos.mnPos + 1 )
237cdf0e10cSrcweir - nTmpStart - aStartPos.mnSubPos;
238cdf0e10cSrcweir if( nTmpLen > 0 )
239cdf0e10cSrcweir {
240cdf0e10cSrcweir if( nType == text::TextMarkupType::SENTENCE )
241cdf0e10cSrcweir {
242cdf0e10cSrcweir ((SwGrammarMarkUp*)pSubList)->setSentence( static_cast< xub_StrLen >(aStartPos.mnSubPos) );
243cdf0e10cSrcweir bCommit = false;
244cdf0e10cSrcweir }
245cdf0e10cSrcweir else
246cdf0e10cSrcweir pSubList->Insert( rIdentifier, xMarkupInfoContainer,
247cdf0e10cSrcweir static_cast< xub_StrLen >(aStartPos.mnSubPos), static_cast< xub_StrLen >(nTmpLen) );
248cdf0e10cSrcweir }
249cdf0e10cSrcweir ++nStart;
250cdf0e10cSrcweir }
251cdf0e10cSrcweir if( bEndInField && nType != text::TextMarkupType::SENTENCE )
252cdf0e10cSrcweir {
253cdf0e10cSrcweir const xub_StrLen nFieldPosModel = static_cast< xub_StrLen >(aEndPos.mnPos);
254cdf0e10cSrcweir const sal_uInt16 nInsertPos = pWList->GetWrongPos( nFieldPosModel );
255cdf0e10cSrcweir SwWrongList* pSubList = pWList->SubList( nInsertPos );
256cdf0e10cSrcweir if ( !pSubList )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir pSubList = new SwGrammarMarkUp();
259cdf0e10cSrcweir pWList->InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
260cdf0e10cSrcweir }
261cdf0e10cSrcweir const sal_uInt32 nTmpLen = aEndPos.mnSubPos + 1;
262cdf0e10cSrcweir pSubList->Insert( rIdentifier, xMarkupInfoContainer, 0, static_cast< xub_StrLen >(nTmpLen) );
263cdf0e10cSrcweir }
264cdf0e10cSrcweir else
265cdf0e10cSrcweir ++nEnd;
266cdf0e10cSrcweir if( nEnd > nStart )
267cdf0e10cSrcweir nLength = nEnd - nStart;
268cdf0e10cSrcweir else
269cdf0e10cSrcweir bCommit = false;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
272cdf0e10cSrcweir if ( bCommit )
273cdf0e10cSrcweir {
274cdf0e10cSrcweir if( nType == text::TextMarkupType::SENTENCE )
275cdf0e10cSrcweir ((SwGrammarMarkUp*)pWList)->setSentence( static_cast< xub_StrLen >(nStart) );
276cdf0e10cSrcweir else
277cdf0e10cSrcweir pWList->Insert( rIdentifier, xMarkupInfoContainer,
278cdf0e10cSrcweir static_cast< xub_StrLen >(nStart), static_cast< xub_StrLen >(nLength) );
279cdf0e10cSrcweir }
280cdf0e10cSrcweir
281cdf0e10cSrcweir if( bRepaint )
282cdf0e10cSrcweir finishGrammarCheck( *mpTxtNode );
283cdf0e10cSrcweir }
284cdf0e10cSrcweir
285cdf0e10cSrcweir
lcl_commitGrammarMarkUp(const ModelToViewHelper::ConversionMap * pConversionMap,SwGrammarMarkUp * pWList,::sal_Int32 nType,const::rtl::OUString & rIdentifier,::sal_Int32 nStart,::sal_Int32 nLength,const uno::Reference<container::XStringKeyMap> & xMarkupInfoContainer)286cdf0e10cSrcweir void lcl_commitGrammarMarkUp(
287cdf0e10cSrcweir const ModelToViewHelper::ConversionMap* pConversionMap,
288cdf0e10cSrcweir SwGrammarMarkUp* pWList,
289cdf0e10cSrcweir ::sal_Int32 nType,
290cdf0e10cSrcweir const ::rtl::OUString & rIdentifier,
291cdf0e10cSrcweir ::sal_Int32 nStart,
292cdf0e10cSrcweir ::sal_Int32 nLength,
293cdf0e10cSrcweir const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
294cdf0e10cSrcweir {
295cdf0e10cSrcweir ASSERT( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE, "Wrong mark-up type" )
296cdf0e10cSrcweir const ModelToViewHelper::ModelPosition aStartPos =
297cdf0e10cSrcweir ModelToViewHelper::ConvertToModelPosition( pConversionMap, nStart );
298cdf0e10cSrcweir const ModelToViewHelper::ModelPosition aEndPos =
299cdf0e10cSrcweir ModelToViewHelper::ConvertToModelPosition( pConversionMap, nStart + nLength - 1);
300cdf0e10cSrcweir
301cdf0e10cSrcweir const bool bStartInField = aStartPos.mbIsField;
302cdf0e10cSrcweir const bool bEndInField = aEndPos.mbIsField;
303cdf0e10cSrcweir bool bCommit = false;
304cdf0e10cSrcweir
305cdf0e10cSrcweir if ( bStartInField && bEndInField && aStartPos.mnPos == aEndPos.mnPos )
306cdf0e10cSrcweir {
307cdf0e10cSrcweir nStart = aStartPos.mnSubPos;
308cdf0e10cSrcweir const xub_StrLen nFieldPosModel = static_cast< xub_StrLen >(aStartPos.mnPos);
309cdf0e10cSrcweir const sal_uInt16 nInsertPos = pWList->GetWrongPos( nFieldPosModel );
310cdf0e10cSrcweir
311cdf0e10cSrcweir SwGrammarMarkUp* pSubList = (SwGrammarMarkUp*)pWList->SubList( nInsertPos );
312cdf0e10cSrcweir if ( !pSubList )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir pSubList = new SwGrammarMarkUp();
315cdf0e10cSrcweir pWList->InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
318cdf0e10cSrcweir pWList = pSubList;
319cdf0e10cSrcweir bCommit = true;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir else if ( !bStartInField && !bEndInField )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir nStart = aStartPos.mnPos;
324cdf0e10cSrcweir bCommit = true;
325cdf0e10cSrcweir nLength = aEndPos.mnPos + 1 - aStartPos.mnPos;
326cdf0e10cSrcweir }
327cdf0e10cSrcweir else
328cdf0e10cSrcweir {
329cdf0e10cSrcweir bCommit = true;
330cdf0e10cSrcweir nStart = aStartPos.mnPos;
331cdf0e10cSrcweir sal_Int32 nEnd = aEndPos.mnPos;
332cdf0e10cSrcweir if( bStartInField && nType != text::TextMarkupType::SENTENCE )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir const xub_StrLen nFieldPosModel = static_cast< xub_StrLen >(aStartPos.mnPos);
335cdf0e10cSrcweir const sal_uInt16 nInsertPos = pWList->GetWrongPos( nFieldPosModel );
336cdf0e10cSrcweir SwGrammarMarkUp* pSubList = (SwGrammarMarkUp*)pWList->SubList( nInsertPos );
337cdf0e10cSrcweir if ( !pSubList )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir pSubList = new SwGrammarMarkUp();
340cdf0e10cSrcweir pWList->InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
341cdf0e10cSrcweir }
342cdf0e10cSrcweir const sal_uInt32 nTmpStart = ModelToViewHelper::ConvertToViewPosition( pConversionMap, aStartPos.mnPos );
343cdf0e10cSrcweir const sal_uInt32 nTmpLen = ModelToViewHelper::ConvertToViewPosition( pConversionMap, aStartPos.mnPos + 1 )
344cdf0e10cSrcweir - nTmpStart - aStartPos.mnSubPos;
345cdf0e10cSrcweir if( nTmpLen > 0 )
346cdf0e10cSrcweir pSubList->Insert( rIdentifier, xMarkupInfoContainer,
347cdf0e10cSrcweir static_cast< xub_StrLen >(aStartPos.mnSubPos), static_cast< xub_StrLen >(nTmpLen) );
348cdf0e10cSrcweir ++nStart;
349cdf0e10cSrcweir }
350cdf0e10cSrcweir if( bEndInField && nType != text::TextMarkupType::SENTENCE )
351cdf0e10cSrcweir {
352cdf0e10cSrcweir const xub_StrLen nFieldPosModel = static_cast< xub_StrLen >(aEndPos.mnPos);
353cdf0e10cSrcweir const sal_uInt16 nInsertPos = pWList->GetWrongPos( nFieldPosModel );
354cdf0e10cSrcweir SwGrammarMarkUp* pSubList = (SwGrammarMarkUp*)pWList->SubList( nInsertPos );
355cdf0e10cSrcweir if ( !pSubList )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir pSubList = new SwGrammarMarkUp();
358cdf0e10cSrcweir pWList->InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
359cdf0e10cSrcweir }
360cdf0e10cSrcweir const sal_uInt32 nTmpLen = aEndPos.mnSubPos + 1;
361cdf0e10cSrcweir pSubList->Insert( rIdentifier, xMarkupInfoContainer, 0, static_cast< xub_StrLen >(nTmpLen) );
362cdf0e10cSrcweir }
363cdf0e10cSrcweir else
364cdf0e10cSrcweir ++nEnd;
365cdf0e10cSrcweir if( nEnd > nStart )
366cdf0e10cSrcweir nLength = nEnd - nStart;
367cdf0e10cSrcweir else
368cdf0e10cSrcweir bCommit = false;
369cdf0e10cSrcweir }
370cdf0e10cSrcweir
371cdf0e10cSrcweir if ( bCommit )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir if( nType == text::TextMarkupType::SENTENCE )
374cdf0e10cSrcweir ((SwGrammarMarkUp*)pWList)->setSentence( static_cast< xub_StrLen >(nStart+nLength) );
375cdf0e10cSrcweir else
376cdf0e10cSrcweir pWList->Insert( rIdentifier, xMarkupInfoContainer,
377cdf0e10cSrcweir static_cast< xub_StrLen >(nStart), static_cast< xub_StrLen >(nLength) );
378cdf0e10cSrcweir }
379cdf0e10cSrcweir }
380cdf0e10cSrcweir
381cdf0e10cSrcweir
commitMultiTextMarkup(const uno::Sequence<text::TextMarkupDescriptor> & rMarkups)382cdf0e10cSrcweir void SAL_CALL SwXTextMarkup::commitMultiTextMarkup(
383cdf0e10cSrcweir const uno::Sequence< text::TextMarkupDescriptor > &rMarkups )
384cdf0e10cSrcweir throw (lang::IllegalArgumentException, uno::RuntimeException)
385cdf0e10cSrcweir {
386cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
387cdf0e10cSrcweir
388cdf0e10cSrcweir // paragraph already dead or modified?
389cdf0e10cSrcweir if ( !mpTxtNode )
390cdf0e10cSrcweir return;
391cdf0e10cSrcweir
392cdf0e10cSrcweir // check for equal length of all sequnces
393cdf0e10cSrcweir sal_Int32 nLen = rMarkups.getLength();
394cdf0e10cSrcweir
395cdf0e10cSrcweir // for grammar checking there should be exactly one sentence markup
396cdf0e10cSrcweir // and 0..n grammar markups.
397cdf0e10cSrcweir // Different markups are not expected but may be applied anyway since
398cdf0e10cSrcweir // that should be no problem...
399cdf0e10cSrcweir // but it has to be implemented, at the moment only this function is for
400cdf0e10cSrcweir // grammar markups and sentence markup only!
401cdf0e10cSrcweir sal_Int32 nSentenceMarkUpIndex = -1;
402cdf0e10cSrcweir const text::TextMarkupDescriptor *pMarkups = rMarkups.getConstArray();
403cdf0e10cSrcweir sal_Int32 i;
404cdf0e10cSrcweir for( i = 0; i < nLen; ++i )
405cdf0e10cSrcweir {
406cdf0e10cSrcweir if (pMarkups[i].nType == text::TextMarkupType::SENTENCE)
407cdf0e10cSrcweir {
408cdf0e10cSrcweir if (nSentenceMarkUpIndex == -1)
409cdf0e10cSrcweir nSentenceMarkUpIndex = i;
410cdf0e10cSrcweir else // there is already one sentence markup
411cdf0e10cSrcweir throw lang::IllegalArgumentException();
412cdf0e10cSrcweir }
413cdf0e10cSrcweir else if( pMarkups[i].nType != text::TextMarkupType::PROOFREADING )
414cdf0e10cSrcweir return;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir
417cdf0e10cSrcweir if( nSentenceMarkUpIndex == -1 )
418cdf0e10cSrcweir return;
419cdf0e10cSrcweir
420cdf0e10cSrcweir // get appropriate list to use...
421cdf0e10cSrcweir SwGrammarMarkUp* pWList = 0;
422cdf0e10cSrcweir bool bRepaint = false;
423cdf0e10cSrcweir IGrammarContact *pGrammarContact = getGrammarContact( *mpTxtNode );
424cdf0e10cSrcweir if( pGrammarContact )
425cdf0e10cSrcweir {
426cdf0e10cSrcweir pWList = pGrammarContact->getGrammarCheck( *mpTxtNode, true );
427cdf0e10cSrcweir ASSERT( pWList, "GrammarContact _has_ to deliver a wrong list" )
428cdf0e10cSrcweir }
429cdf0e10cSrcweir else
430cdf0e10cSrcweir {
431cdf0e10cSrcweir pWList = mpTxtNode->GetGrammarCheck();
432cdf0e10cSrcweir if ( !pWList )
433cdf0e10cSrcweir {
434cdf0e10cSrcweir mpTxtNode->SetGrammarCheck( new SwGrammarMarkUp() );
435cdf0e10cSrcweir pWList = mpTxtNode->GetGrammarCheck();
436cdf0e10cSrcweir pWList->SetInvalid( 0, STRING_LEN );
437cdf0e10cSrcweir }
438cdf0e10cSrcweir }
439cdf0e10cSrcweir bRepaint = pWList == mpTxtNode->GetGrammarCheck();
440cdf0e10cSrcweir
441cdf0e10cSrcweir bool bAcceptGrammarError = false;
442cdf0e10cSrcweir if( pWList->GetBeginInv() < STRING_LEN )
443cdf0e10cSrcweir {
444cdf0e10cSrcweir const ModelToViewHelper::ModelPosition aSentenceEnd =
445cdf0e10cSrcweir ModelToViewHelper::ConvertToModelPosition( mpConversionMap,
446cdf0e10cSrcweir pMarkups[nSentenceMarkUpIndex].nOffset + pMarkups[nSentenceMarkUpIndex].nLength );
447cdf0e10cSrcweir bAcceptGrammarError = (xub_StrLen)aSentenceEnd.mnPos > pWList->GetBeginInv();
448cdf0e10cSrcweir pWList->ClearGrammarList( (xub_StrLen)aSentenceEnd.mnPos );
449cdf0e10cSrcweir }
450cdf0e10cSrcweir
451cdf0e10cSrcweir if( bAcceptGrammarError )
452cdf0e10cSrcweir {
453cdf0e10cSrcweir for( i = 0; i < nLen; ++i )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir const text::TextMarkupDescriptor &rDesc = pMarkups[i];
456cdf0e10cSrcweir lcl_commitGrammarMarkUp( mpConversionMap, pWList, rDesc.nType,
457cdf0e10cSrcweir rDesc.aIdentifier, rDesc.nOffset, rDesc.nLength, rDesc.xMarkupInfoContainer );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir }
460cdf0e10cSrcweir else
461cdf0e10cSrcweir {
462cdf0e10cSrcweir bRepaint = false;
463cdf0e10cSrcweir i = nSentenceMarkUpIndex;
464cdf0e10cSrcweir const text::TextMarkupDescriptor &rDesc = pMarkups[i];
465cdf0e10cSrcweir lcl_commitGrammarMarkUp( mpConversionMap, pWList, rDesc.nType,
466cdf0e10cSrcweir rDesc.aIdentifier, rDesc.nOffset, rDesc.nLength, rDesc.xMarkupInfoContainer );
467cdf0e10cSrcweir }
468cdf0e10cSrcweir
469cdf0e10cSrcweir if( bRepaint )
470cdf0e10cSrcweir finishGrammarCheck( *mpTxtNode );
471cdf0e10cSrcweir
472cdf0e10cSrcweir return;
473cdf0e10cSrcweir }
474cdf0e10cSrcweir
475cdf0e10cSrcweir
Modify(const SfxPoolItem *,const SfxPoolItem *)476cdf0e10cSrcweir void SwXTextMarkup::Modify( const SfxPoolItem* /*pOld*/, const SfxPoolItem* /*pNew*/ )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir // FME 2007-07-16 #i79641# In my opinion this is perfectly legal,
479cdf0e10cSrcweir // therefore I remove the assertion in SwModify::_Remove()
480cdf0e10cSrcweir if ( GetRegisteredIn() )
481cdf0e10cSrcweir GetRegisteredInNonConst()->Remove( this );
482cdf0e10cSrcweir // <--
483cdf0e10cSrcweir
484cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
485cdf0e10cSrcweir mpTxtNode = 0;
486cdf0e10cSrcweir }
487cdf0e10cSrcweir
488cdf0e10cSrcweir /*
489cdf0e10cSrcweir * SwXStringKeyMap
490cdf0e10cSrcweir */
SwXStringKeyMap()491cdf0e10cSrcweir SwXStringKeyMap::SwXStringKeyMap()
492cdf0e10cSrcweir {
493cdf0e10cSrcweir }
494cdf0e10cSrcweir
getValue(const::rtl::OUString & aKey)495cdf0e10cSrcweir uno::Any SAL_CALL SwXStringKeyMap::getValue(const ::rtl::OUString & aKey) throw (uno::RuntimeException, container::NoSuchElementException)
496cdf0e10cSrcweir {
497cdf0e10cSrcweir std::map< rtl::OUString, uno::Any >::const_iterator aIter = maMap.find( aKey );
498cdf0e10cSrcweir if ( aIter == maMap.end() )
499cdf0e10cSrcweir throw container::NoSuchElementException();
500cdf0e10cSrcweir
501cdf0e10cSrcweir return (*aIter).second;
502cdf0e10cSrcweir }
503cdf0e10cSrcweir
hasValue(const::rtl::OUString & aKey)504cdf0e10cSrcweir ::sal_Bool SAL_CALL SwXStringKeyMap::hasValue(const ::rtl::OUString & aKey) throw (uno::RuntimeException)
505cdf0e10cSrcweir {
506cdf0e10cSrcweir return maMap.find( aKey ) != maMap.end();
507cdf0e10cSrcweir }
508cdf0e10cSrcweir
insertValue(const::rtl::OUString & aKey,const uno::Any & aValue)509cdf0e10cSrcweir void SAL_CALL SwXStringKeyMap::insertValue(const ::rtl::OUString & aKey, const uno::Any & aValue) throw (uno::RuntimeException, lang::IllegalArgumentException, container::ElementExistException)
510cdf0e10cSrcweir {
511cdf0e10cSrcweir std::map< rtl::OUString, uno::Any >::const_iterator aIter = maMap.find( aKey );
512cdf0e10cSrcweir if ( aIter != maMap.end() )
513cdf0e10cSrcweir throw container::ElementExistException();
514cdf0e10cSrcweir
515cdf0e10cSrcweir maMap[ aKey ] = aValue;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir
getCount()518cdf0e10cSrcweir ::sal_Int32 SAL_CALL SwXStringKeyMap::getCount() throw (uno::RuntimeException)
519cdf0e10cSrcweir {
520cdf0e10cSrcweir return maMap.size();
521cdf0e10cSrcweir }
522cdf0e10cSrcweir
getKeyByIndex(::sal_Int32 nIndex)523cdf0e10cSrcweir ::rtl::OUString SAL_CALL SwXStringKeyMap::getKeyByIndex(::sal_Int32 nIndex) throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
524cdf0e10cSrcweir {
525cdf0e10cSrcweir if ( (sal_uInt32)nIndex >= maMap.size() )
526cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
527cdf0e10cSrcweir
528cdf0e10cSrcweir return ::rtl::OUString();
529cdf0e10cSrcweir }
530cdf0e10cSrcweir
getValueByIndex(::sal_Int32 nIndex)531cdf0e10cSrcweir uno::Any SAL_CALL SwXStringKeyMap::getValueByIndex(::sal_Int32 nIndex) throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
532cdf0e10cSrcweir {
533cdf0e10cSrcweir if ( (sal_uInt32)nIndex >= maMap.size() )
534cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
535cdf0e10cSrcweir
536cdf0e10cSrcweir return uno::Any();
537cdf0e10cSrcweir }
538cdf0e10cSrcweir
539