xref: /AOO41X/main/sw/source/core/unocore/unotextmarkup.cxx (revision ca62e2c2083b5d0995f1245bad6c2edfb455fbec)
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