24 #include <osl/diagnose.h>
28 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
29 #include <com/sun/star/text/TextMarkupType.hpp>
30 #include <com/sun/star/text/TextMarkupDescriptor.hpp>
31 #include <com/sun/star/container/ElementExistException.hpp>
32 #include <com/sun/star/container/XStringKeyMap.hpp>
39 #include <com/sun/star/lang/XUnoTunnel.hpp>
40 #include <com/sun/star/text/XTextRange.hpp>
56 : m_pTextNode(pTextNode)
57 , m_ConversionMap(rMap)
89 return m_pImpl->m_ConversionMap;
98 const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
102 uno::Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY);
104 if(!xRangeTunnel.is())
return;
106 if (
auto pRange = comphelper::getFromUnoTunnel<SwXTextRange>(xRangeTunnel))
108 SwDoc& rDoc = pRange->GetDoc();
119 else if (
auto pCursor = comphelper::getFromUnoTunnel<OTextCursorHelper>(xRangeTunnel))
121 SwPaM & rPam(*pCursor->GetPaM());
132 const OUString & rIdentifier,
135 const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
140 if (!
m_pImpl->m_pTextNode || nLength <= 0)
143 if ( nType == text::TextMarkupType::SMARTTAG &&
149 bool bRepaint =
false;
150 if ( nType == text::TextMarkupType::SPELLCHECK )
152 pWList =
m_pImpl->m_pTextNode->GetWrong();
156 m_pImpl->m_pTextNode->SetWrong( std::unique_ptr<SwWrongList>(pWList) );
159 else if ( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
162 if( pGrammarContact )
165 OSL_ENSURE( pWList,
"GrammarContact _has_ to deliver a wrong list" );
169 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
172 m_pImpl->m_pTextNode->SetGrammarCheck( std::make_unique<SwGrammarMarkUp>() );
173 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
176 bRepaint = pWList ==
m_pImpl->m_pTextNode->GetGrammarCheck();
178 static_cast<SwGrammarMarkUp*>(pWList)->ClearGrammarList();
180 else if ( nType == text::TextMarkupType::SMARTTAG )
182 pWList =
m_pImpl->m_pTextNode->GetSmartTags();
186 m_pImpl->m_pTextNode->SetSmartTags( std::unique_ptr<SwWrongList>(pWList) );
191 OSL_FAIL(
"Unknown mark-up type" );
196 m_pImpl->m_ConversionMap.ConvertToModelPosition( nStart );
198 m_pImpl->m_ConversionMap.ConvertToModelPosition( nStart + nLength - 1);
200 const bool bStartInField = aStartPos.
mbIsField;
201 const bool bEndInField = aEndPos.
mbIsField;
202 bool bCommit =
false;
204 if ( bStartInField && bEndInField && aStartPos.
mnPos == aEndPos.
mnPos )
207 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
208 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
213 if( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
217 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
223 else if ( !bStartInField && !bEndInField )
225 nStart = aStartPos.
mnPos;
227 nLength = aEndPos.
mnPos + 1 - aStartPos.
mnPos;
229 else if( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE )
232 nStart = aStartPos.
mnPos;
233 sal_Int32 nEnd = aEndPos.
mnPos;
234 if( bStartInField && nType != text::TextMarkupType::SENTENCE )
236 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
237 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
242 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
244 const sal_Int32 nTmpStart =
245 m_pImpl->m_ConversionMap.ConvertToViewPosition(aStartPos.
mnPos);
246 const sal_Int32 nTmpLen =
247 m_pImpl->m_ConversionMap.ConvertToViewPosition(aStartPos.
mnPos + 1)
251 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, aStartPos.
mnSubPos, nTmpLen );
255 if( bEndInField && nType != text::TextMarkupType::SENTENCE )
257 const sal_Int32 nFieldPosModel = aEndPos.
mnPos;
258 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
263 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
265 const sal_Int32 nTmpLen = aEndPos.
mnSubPos + 1;
266 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, 0, nTmpLen );
271 nLength = nEnd - nStart;
278 if( nType == text::TextMarkupType::SENTENCE )
281 pWList->
Insert( rIdentifier, xMarkupInfoContainer, nStart, nLength );
292 const OUString & rIdentifier,
295 const uno::Reference< container::XStringKeyMap > & xMarkupInfoContainer)
297 OSL_ENSURE( nType == text::TextMarkupType::PROOFREADING || nType == text::TextMarkupType::SENTENCE,
"Wrong mark-up type" );
303 const bool bStartInField = aStartPos.
mbIsField;
304 const bool bEndInField = aEndPos.
mbIsField;
305 bool bCommit =
false;
307 if ( bStartInField && bEndInField && aStartPos.
mnPos == aEndPos.
mnPos )
310 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
311 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
317 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
323 else if ( !bStartInField && !bEndInField )
325 nStart = aStartPos.
mnPos;
327 nLength = aEndPos.
mnPos + 1 - aStartPos.
mnPos;
332 nStart = aStartPos.
mnPos;
333 sal_Int32 nEnd = aEndPos.
mnPos;
334 if( bStartInField && nType != text::TextMarkupType::SENTENCE )
336 const sal_Int32 nFieldPosModel = aStartPos.
mnPos;
337 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
342 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
348 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, aStartPos.
mnSubPos, nTmpLen );
351 if( bEndInField && nType != text::TextMarkupType::SENTENCE )
353 const sal_Int32 nFieldPosModel = aEndPos.
mnPos;
354 const sal_uInt16 nInsertPos = pWList->
GetWrongPos( nFieldPosModel );
359 pWList->
InsertSubList( nFieldPosModel, 1, nInsertPos, pSubList );
361 const sal_Int32 nTmpLen = aEndPos.
mnSubPos + 1;
362 pSubList->
Insert( rIdentifier, xMarkupInfoContainer, 0, nTmpLen );
367 nLength = nEnd - nStart;
374 if( nType == text::TextMarkupType::SENTENCE )
377 pWList->
Insert( rIdentifier, xMarkupInfoContainer, nStart, nLength );
382 const uno::Sequence< text::TextMarkupDescriptor > &rMarkups )
396 const text::TextMarkupDescriptor *pSentenceMarkUp =
nullptr;
397 for(
const text::TextMarkupDescriptor &rDesc : rMarkups )
399 if (rDesc.nType == text::TextMarkupType::SENTENCE)
401 if (pSentenceMarkUp !=
nullptr)
402 throw lang::IllegalArgumentException();
403 pSentenceMarkUp = &rDesc;
405 else if( rDesc.nType != text::TextMarkupType::PROOFREADING )
409 if( pSentenceMarkUp ==
nullptr )
414 bool bRepaint =
false;
416 if( pGrammarContact )
419 OSL_ENSURE( pWList,
"GrammarContact _has_ to deliver a wrong list" );
423 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
426 m_pImpl->m_pTextNode->SetGrammarCheck( std::make_unique<SwGrammarMarkUp>() );
427 pWList =
m_pImpl->m_pTextNode->GetGrammarCheck();
431 bRepaint = pWList ==
m_pImpl->m_pTextNode->GetGrammarCheck();
433 bool bAcceptGrammarError =
false;
437 m_pImpl->m_ConversionMap.ConvertToModelPosition(
438 pSentenceMarkUp->nOffset + pSentenceMarkUp->nLength );
443 if( bAcceptGrammarError )
445 for(
const text::TextMarkupDescriptor &rDesc : rMarkups )
448 rDesc.aIdentifier, rDesc.nOffset, rDesc.nLength, rDesc.xMarkupInfoContainer );
454 const text::TextMarkupDescriptor &rDesc = *pSentenceMarkUp;
456 rDesc.aIdentifier, rDesc.nOffset, rDesc.nLength, rDesc.xMarkupInfoContainer );
466 if(rHint.
GetId() == SfxHintId::Dying)
478 std::map< OUString, uno::Any >::const_iterator aIter = maMap.find( aKey );
479 if ( aIter == maMap.end() )
480 throw container::NoSuchElementException();
482 return (*aIter).second;
487 return maMap.find( aKey ) != maMap.end();
492 std::map< OUString, uno::Any >::const_iterator aIter = maMap.find( aKey );
493 if ( aIter != maMap.end() )
494 throw container::ElementExistException();
496 maMap[ aKey ] = aValue;
507 throw lang::IndexOutOfBoundsException();
515 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()
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
const SwPosition * End() const
ModelPosition ConvertToModelPosition(sal_Int32 nViewPos) const
Converts a view position into a model position.
constexpr sal_Int32 COMPLETE_STRING
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)
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