23 #include <osl/diagnose.h>
27 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
28 #include <com/sun/star/text/TextMarkupType.hpp>
29 #include <com/sun/star/text/TextMarkupDescriptor.hpp>
30 #include <com/sun/star/container/ElementExistException.hpp>
31 #include <com/sun/star/container/XStringKeyMap.hpp>
38 #include <com/sun/star/lang/XUnoTunnel.hpp>
39 #include <com/sun/star/text/XTextRange.hpp>
55 : m_pTextNode(pTextNode)
56 , m_ConversionMap(rMap)
88 return m_pImpl->m_ConversionMap;
100 const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
104 uno::Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY);
106 if(!xRangeTunnel.is())
return;
111 if(xRangeTunnel.is())
143 const OUString & rIdentifier,
146 const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
151 if (!
m_pImpl->m_pTextNode || nLength <= 0)
154 if ( nType == text::TextMarkupType::SMARTTAG &&
160 bool bRepaint =
false;
161 if ( nType == text::TextMarkupType::SPELLCHECK )
163 pWList =
m_pImpl->m_pTextNode->GetWrong();
167 m_pImpl->m_pTextNode->SetWrong( pWList );
170 else if ( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
173 if( pGrammarContact )
176 OSL_ENSURE( pWList,
"GrammarContact _has_ to deliver a wrong list" );
180 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
184 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
187 bRepaint = pWList ==
m_pImpl->m_pTextNode->GetGrammarCheck();
189 static_cast<SwGrammarMarkUp*>(pWList)->ClearGrammarList();
191 else if ( nType == text::TextMarkupType::SMARTTAG )
193 pWList =
m_pImpl->m_pTextNode->GetSmartTags();
197 m_pImpl->m_pTextNode->SetSmartTags( pWList );
202 OSL_FAIL(
"Unknown mark-up type" );
207 m_pImpl->m_ConversionMap.ConvertToModelPosition( nStart );
209 m_pImpl->m_ConversionMap.ConvertToModelPosition( nStart + nLength - 1);
211 const bool bStartInField = aStartPos.
mbIsField;
212 const bool bEndInField = aEndPos.
mbIsField;
213 bool bCommit =
false;
215 if ( bStartInField && bEndInField && aStartPos.
mnPos == aEndPos.
mnPos )
218 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
219 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
224 if( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
228 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
234 else if ( !bStartInField && !bEndInField )
236 nStart = aStartPos.
mnPos;
238 nLength = aEndPos.
mnPos + 1 - aStartPos.
mnPos;
240 else if( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
243 nStart = aStartPos.
mnPos;
244 sal_Int32 nEnd = aEndPos.
mnPos;
245 if( bStartInField && nType != text::TextMarkupType::SENTENCE )
247 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
248 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
253 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
255 const sal_Int32 nTmpStart =
256 m_pImpl->m_ConversionMap.ConvertToViewPosition(aStartPos.
mnPos);
257 const sal_Int32 nTmpLen =
258 m_pImpl->m_ConversionMap.ConvertToViewPosition(aStartPos.
mnPos + 1)
262 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, aStartPos.
mnSubPos, nTmpLen );
266 if( bEndInField && nType != text::TextMarkupType::SENTENCE )
268 const sal_Int32 nFieldPosModel = aEndPos.
mnPos;
269 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
274 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
276 const sal_Int32 nTmpLen = aEndPos.
mnSubPos + 1;
277 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, 0, nTmpLen );
282 nLength = nEnd - nStart;
289 if( nType == text::TextMarkupType::SENTENCE )
292 pWList->
Insert( rIdentifier, xMarkupInfoContainer, nStart, nLength );
303 const OUString & rIdentifier,
306 const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
308 OSL_ENSURE( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE,
"Wrong mark-up type" );
314 const bool bStartInField = aStartPos.
mbIsField;
315 const bool bEndInField = aEndPos.
mbIsField;
316 bool bCommit =
false;
318 if ( bStartInField && bEndInField && aStartPos.
mnPos == aEndPos.
mnPos )
321 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
322 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
328 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
334 else if ( !bStartInField && !bEndInField )
336 nStart = aStartPos.
mnPos;
338 nLength = aEndPos.
mnPos + 1 - aStartPos.
mnPos;
343 nStart = aStartPos.
mnPos;
344 sal_Int32 nEnd = aEndPos.
mnPos;
345 if( bStartInField && nType != text::TextMarkupType::SENTENCE )
347 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
348 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
353 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
359 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, aStartPos.
mnSubPos, nTmpLen );
362 if( bEndInField && nType != text::TextMarkupType::SENTENCE )
364 const sal_Int32 nFieldPosModel = aEndPos.
mnPos;
365 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
370 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
372 const sal_Int32 nTmpLen = aEndPos.
mnSubPos + 1;
373 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, 0, nTmpLen );
378 nLength = nEnd - nStart;
385 if( nType == text::TextMarkupType::SENTENCE )
388 pWList->
Insert( rIdentifier, xMarkupInfoContainer, nStart, nLength );
393 const uno::Sequence< text::TextMarkupDescriptor > &rMarkups )
407 const text::TextMarkupDescriptor *pSentenceMarkUp =
nullptr;
408 for(
const text::TextMarkupDescriptor &rDesc : rMarkups )
410 if (rDesc.nType == text::TextMarkupType::SENTENCE)
412 if (pSentenceMarkUp !=
nullptr)
413 throw lang::IllegalArgumentException();
414 pSentenceMarkUp = &rDesc;
416 else if( rDesc.nType != text::TextMarkupType::PROOFREADING )
420 if( pSentenceMarkUp ==
nullptr )
425 bool bRepaint =
false;
427 if( pGrammarContact )
430 OSL_ENSURE( pWList,
"GrammarContact _has_ to deliver a wrong list" );
434 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
438 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
442 bRepaint = pWList ==
m_pImpl->m_pTextNode->GetGrammarCheck();
444 bool bAcceptGrammarError =
false;
448 m_pImpl->m_ConversionMap.ConvertToModelPosition(
449 pSentenceMarkUp->nOffset + pSentenceMarkUp->nLength );
454 if( bAcceptGrammarError )
456 for(
const text::TextMarkupDescriptor &rDesc : rMarkups )
459 rDesc.aIdentifier, rDesc.nOffset, rDesc.nLength, rDesc.xMarkupInfoContainer );
465 const text::TextMarkupDescriptor &rDesc = *pSentenceMarkUp;
467 rDesc.aIdentifier, rDesc.nOffset, rDesc.nLength, rDesc.xMarkupInfoContainer );
477 if(rHint.
GetId() == SfxHintId::Dying)
489 std::map< OUString, uno::Any >::const_iterator aIter = maMap.find( aKey );
490 if ( aIter == maMap.end() )
491 throw container::NoSuchElementException();
493 return (*aIter).second;
498 return maMap.find( aKey ) != maMap.end();
503 std::map< OUString, uno::Any >::const_iterator aIter = maMap.find( aKey );
504 if ( aIter != maMap.end() )
505 throw container::ElementExistException();
507 maMap[ aKey ] = aValue;
518 throw lang::IndexOutOfBoundsException();
526 throw lang::IndexOutOfBoundsException();
Marks a position in the document model.
virtual css::uno::Any SAL_CALL getValue(const OUString &aKey) override
void Insert(const OUString &rType, css::uno::Reference< css::container::XStringKeyMap > const &xPropertyBag, sal_Int32 nNewPos, sal_Int32 nNewLen, sal_uInt16 nWhere)
virtual sal_Bool SAL_CALL hasValue(const OUString &aKey) override
virtual OUString SAL_CALL getKeyByIndex(::sal_Int32 nIndex) override
void InsertSubList(sal_Int32 nNewPos, sal_Int32 nNewLen, sal_uInt16 nWhere, SwWrongList *pSubList)
SwTextNode * GetTextNode()
virtual css::uno::Reference< css::container::XStringKeyMap > SAL_CALL getMarkupInfoContainer() override
This struct defines a position in the model string.
virtual ~SwXTextMarkup() override
IGrammarContact * getGrammarContact(const SwTextNode &rTextNode)
getGrammarContact() delivers the grammar contact of the document (for a given textnode) ...
SwWrongList * SubList(sal_uInt16 nIdx) const
sal_Int32 ConvertToViewPosition(sal_Int32 nModelPos) const
Converts a model position into a view position.
virtual void SAL_CALL commitMultiTextMarkup(const css::uno::Sequence< css::text::TextMarkupDescriptor > &aMarkups) override
virtual css::uno::Any SAL_CALL getValueByIndex(::sal_Int32 nIndex) override
PaM is Point and Mark: a selection of the document model.
virtual void SAL_CALL insertValue(const OUString &aKey, const css::uno::Any &aValue) override
virtual void SAL_CALL commitStringMarkup(::sal_Int32 nType, const OUString &aIdentifier,::sal_Int32 nStart,::sal_Int32 nLength, const css::uno::Reference< css::container::XStringKeyMap > &xMarkupInfoContainer) override
static SwSmartTagMgr & Get()
SwXTextMarkup(SwTextNode *const rTextNode, const ModelToViewHelper &rConversionMap)
Implementation of the css::container::XStringKeyMap interface.
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
Impl(SwTextNode *const pTextNode, const ModelToViewHelper &rMap)
::sw::UnoImplPtr< Impl > m_pImpl
bool StartListening(SvtBroadcaster &rBroadcaster)
const SwPosition * Start() const
bool XTextRangeToSwPaM(SwUnoInternalPaM &rToFill, const uno::Reference< text::XTextRange > &xTextRange,::sw::TextRangeMode const eMode)
SvtBroadcaster & GetNotifier()
virtual const SwPaM * GetPaM() const =0
SwTextNode is a paragraph in the document model.
WrongListType GetWrongListType() const
sal_Int32 GetBeginInv() const
virtual void SAL_CALL commitTextRangeMarkup(::sal_Int32 nType, const OUString &aIdentifier, const css::uno::Reference< css::text::XTextRange > &xRange, const css::uno::Reference< css::container::XStringKeyMap > &xMarkupInfoContainer) override
sal_uInt16 GetWrongPos(sal_Int32 nValue) const
Find the first position that is greater or equal to the given value.
sal_Int32 GetIndex() const
static const css::uno::Sequence< sal_Int8 > & getUnoTunnelId()
const SwPosition * End() const
ModelPosition ConvertToModelPosition(sal_Int32 nViewPos) const
Converts a view position into a model position.
void ClearGrammarList(sal_Int32 nSentenceEnd=COMPLETE_STRING)
void setSentence(sal_Int32 nStart)
#define DBG_TESTSOLARMUTEX()
static void lcl_commitGrammarMarkUp(const ModelToViewHelper &rConversionMap, SwGrammarMarkUp *pWList,::sal_Int32 nType, const OUString &rIdentifier,::sal_Int32 nStart,::sal_Int32 nLength, const uno::Reference< container::XStringKeyMap > &xMarkupInfoContainer)
ModelToViewHelper const m_ConversionMap
void Insert(sal_uInt16 nWhere, std::vector< SwWrongArea >::iterator startPos, std::vector< SwWrongArea >::iterator const &endPos)
const sal_Int32 COMPLETE_STRING
void SetInvalid(sal_Int32 nBegin, sal_Int32 nEnd)
virtual ::sal_Int32 SAL_CALL getCount() override
const ModelToViewHelper & GetConversionMap() const
virtual void Notify(const SfxHint &rHint) override