LibreOffice Module editeng (master) 1
textconv.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20
21#include "impedit.hxx"
22#include <editeng/editview.hxx>
23#include <editeng/editeng.hxx>
24#include <editeng/langitem.hxx>
25#include <editeng/fontitem.hxx>
26#include "textconv.hxx"
27#include <osl/diagnose.h>
28#include <vcl/weld.hxx>
29
30using namespace com::sun::star;
31using namespace com::sun::star::uno;
32using namespace com::sun::star::beans;
33using namespace com::sun::star::linguistic2;
34
36 const Reference< XComponentContext >& rxContext,
37 const lang::Locale& rSourceLocale,
38 const lang::Locale& rTargetLocale,
39 const vcl::Font* pTargetFont,
40 sal_Int32 nOptions,
41 bool bIsInteractive,
42 bool bIsStart,
43 EditView* pView ) :
44 HangulHanjaConversion( pWindow, rxContext, rSourceLocale, rTargetLocale, pTargetFont, nOptions, bIsInteractive )
45 , m_nConvTextLang(LANGUAGE_NONE)
46 , m_nUnitOffset(0)
47 , m_nLastPos(0)
48 , m_aConvSel(pView->GetSelection())
49 , m_pEditView(pView)
50 , m_pWin(pWindow)
51 , m_bStartChk(false)
52 , m_bStartDone(bIsStart)
53 , m_bEndDone(false)
54 , m_bAllowChange(false)
55{
56 DBG_ASSERT( pWindow, "TextConvWrapper: window missing" );
57
58 m_aConvSel.Adjust(); // make Start <= End
59}
60
61
63{
64}
65
66
68{
69 // modified version of SvxSpellWrapper::SpellNext
70
71 if( m_bStartChk )
72 m_bStartDone = true;
73 else
74 m_bEndDone = true;
75
76 if ( m_bStartDone && m_bEndDone )
77 {
78 if ( ConvMore_impl() ) // examine another document?
79 {
80 m_bStartDone = true;
81 m_bEndDone = false;
83 return true;
84 }
85 return false;
86
87 }
88
89 if ( m_bStartDone && m_bEndDone )
90 {
91 if ( ConvMore_impl() ) // examine another document?
92 {
93 m_bStartDone = true;
94 m_bEndDone = false;
96 return true;
97 }
98 }
99 else if (!m_aConvSel.HasRange())
100 {
103 return true;
104 }
105
106 return false;
107}
108
110{
111 // modified version of SvxSpellWrapper::FindSpellError
113 while ( true )
114 {
116 break;
117 }
118}
119
121{
122 // modified version of SvxSpellWrapper::SpellMore
123
124 bool bMore = false;
127 ConvInfo* pConvInfo = pImpEE->GetConvInfo();
128 if ( pConvInfo->bMultipleDoc )
129 {
130 bMore = pEE->ConvertNextDocument();
131 if ( bMore )
132 {
133 // The text has been entered in this engine ...
135 pEE->GetEditDoc().GetStartPaM() );
136 }
137 }
138 return bMore;
139}
140
141
143{
144 // modified version of EditSpellWrapper::SpellStart
145
148 ConvInfo* pConvInfo = pImpEE->GetConvInfo();
149
150 if ( eArea == SvxSpellArea::BodyStart )
151 {
152 // Is called when Spell-forward has reached the end, and to start over
153 if ( m_bEndDone )
154 {
155 pConvInfo->bConvToEnd = false;
156 pConvInfo->aConvTo = pConvInfo->aConvStart;
157 pConvInfo->aConvContinue = EPaM( 0, 0 );
159 pEE->GetEditDoc().GetStartPaM() );
160 }
161 else
162 {
163 pConvInfo->bConvToEnd = true;
164 pConvInfo->aConvTo = pImpEE->CreateEPaM(
165 pEE->GetEditDoc().GetStartPaM() );
166 }
167 }
168 else if ( eArea == SvxSpellArea::BodyEnd )
169 {
170 // Is called when Spell-forward starts
171 pConvInfo->bConvToEnd = true;
172 if (m_aConvSel.HasRange())
173 {
174 // user selection: convert to end of selection
175 pConvInfo->aConvTo.nPara = m_aConvSel.nEndPara;
176 pConvInfo->aConvTo.nIndex = m_aConvSel.nEndPos;
177 pConvInfo->bConvToEnd = false;
178 }
179 else
180 {
181 // nothing selected: convert to end of document
182 pConvInfo->aConvTo = pImpEE->CreateEPaM(
183 pEE->GetEditDoc().GetEndPaM() );
184 }
185 }
186 else if ( eArea == SvxSpellArea::Body )
187 {
188 // called by ConvNext_impl...
189 pConvInfo->aConvContinue = pConvInfo->aConvStart;
190 pConvInfo->aConvTo = pImpEE->CreateEPaM(
191 pEE->GetEditDoc().GetEndPaM() );
192 }
193 else
194 {
195 OSL_FAIL( "ConvStart_impl: Unknown Area!" );
196 }
197}
198
199
201{
202 // modified version of EditSpellWrapper::SpellContinue
203
204 // get next convertible text portion and its language
205 m_aConvText.clear();
210 return !m_aConvText.isEmpty();
211}
212
213
215 LanguageType nLang, sal_uInt16 nLangWhichId,
216 const vcl::Font *pFont, sal_uInt16 nFontWhichId )
217{
219 m_pEditView->SetSelection( rESel );
220
221 // set new language attribute
223 aNewSet.Put( SvxLanguageItem( nLang, nLangWhichId ) );
224
225 // new font to be set?
226 DBG_ASSERT( pFont, "target font missing?" );
227 if (pFont)
228 {
229 // set new font attribute
230 SvxFontItem aFontItem = static_cast<const SvxFontItem&>( aNewSet.Get( nFontWhichId ) );
231 aFontItem.SetFamilyName( pFont->GetFamilyName());
232 aFontItem.SetFamily( pFont->GetFamilyType());
233 aFontItem.SetStyleName( pFont->GetStyleName());
234 aFontItem.SetPitch( pFont->GetPitch());
235 aFontItem.SetCharSet(pFont->GetCharSet());
236 aNewSet.Put( aFontItem );
237 }
238
239 // apply new attributes
240 m_pEditView->SetAttribs( aNewSet );
241
242 m_pEditView->SetSelection( aOldSel );
243}
244
245
247 const sal_Int32 nUnitStart,
248 const sal_Int32 nUnitEnd )
249{
250 const bool bOK = 0 <= nUnitStart && 0 <= nUnitEnd && nUnitStart <= nUnitEnd;
251 DBG_ASSERT( bOK, "invalid arguments" );
252 if (!bOK)
253 return;
254
255 ESelection aSelection = m_pEditView->GetSelection();
256 DBG_ASSERT( aSelection.nStartPara == aSelection.nEndPara,
257 "paragraph mismatch in selection" );
258 aSelection.nStartPos = (m_nLastPos + m_nUnitOffset + nUnitStart);
259 aSelection.nEndPos = (m_nLastPos + m_nUnitOffset + nUnitEnd);
260 m_pEditView->SetSelection( aSelection );
261}
262
263
265 OUString& /* [out] */ rNextPortion,
266 LanguageType& /* [out] */ rLangOfPortion,
267 bool /* [in] */ _bAllowImplicitChangesForNotConvertibleText )
268{
269 m_bAllowChange = _bAllowImplicitChangesForNotConvertibleText;
270
272 rNextPortion = m_aConvText;
273 rLangOfPortion = m_nConvTextLang;
274 m_nUnitOffset = 0;
275
276 ESelection aSelection = m_pEditView->GetSelection();
277 DBG_ASSERT( aSelection.nStartPara == aSelection.nEndPara,
278 "paragraph mismatch in selection" );
279 DBG_ASSERT( aSelection.nStartPos <= aSelection.nEndPos,
280 "start pos > end pos" );
281 m_nLastPos = aSelection.nStartPos;
282}
283
284
286 const sal_Int32 nUnitStart,
287 const sal_Int32 nUnitEnd )
288{
289 SelectNewUnit_impl( nUnitStart, nUnitEnd );
290}
291
292#ifdef DBG_UTIL
293namespace
294{
295 bool IsSimilarChinese( LanguageType nLang1, LanguageType nLang2 )
296 {
297 using namespace editeng;
298 return (HangulHanjaConversion::IsTraditional(nLang1) && HangulHanjaConversion::IsTraditional(nLang2)) ||
299 (HangulHanjaConversion::IsSimplified(nLang1) && HangulHanjaConversion::IsSimplified(nLang2));
300 }
301}
302#endif
303
305 const sal_Int32 nUnitStart, const sal_Int32 nUnitEnd,
306 const OUString& rOrigText,
307 const OUString& rReplaceWith,
308 const css::uno::Sequence< sal_Int32 > &rOffsets,
309 ReplacementAction eAction,
310 LanguageType *pNewUnitLanguage )
311{
312 const bool bOK = 0 <= nUnitStart && 0 <= nUnitEnd && nUnitStart <= nUnitEnd;
313 DBG_ASSERT( bOK, "invalid arguments" );
314 if (!bOK)
315 return;
316
317 // select current unit
318 SelectNewUnit_impl( nUnitStart, nUnitEnd );
319
320 OUString aOrigTxt( m_pEditView->GetSelected() );
321 OUString aNewTxt( rReplaceWith );
322 switch (eAction)
323 {
324 case eExchange :
325 break;
327 aNewTxt = aOrigTxt + "(" + rReplaceWith + ")";
328 break;
329 case eOriginalBracketed :
330 aNewTxt = rReplaceWith + "(" + aOrigTxt + ")";
331 break;
332 case eReplacementAbove :
333 case eOriginalAbove :
334 case eReplacementBelow :
335 case eOriginalBelow :
336 OSL_FAIL( "Rubies not supported" );
337 break;
338 default:
339 OSL_FAIL( "unexpected case" );
340 }
341 m_nUnitOffset = m_nUnitOffset + nUnitStart + aNewTxt.getLength();
342
343 // remember current original language for later use
346 //EditSelection aOldEditSel = pEditView->GetImpEditView()->GetEditSelection();
347
348#ifdef DBG_UTIL
349 LanguageType nOldLang = pImpEditEng->GetLanguage( pImpEditEng->CreateSel( aOldSel ).Min() ).nLang;
350#endif
351
352 pImpEditEng->UndoActionStart( EDITUNDO_INSERT );
353
354 // according to FT we should currently not bother about keeping
355 // attributes in Hangul/Hanja conversion and leave that untouched.
356 // Thus we do this only for Chinese translation...
357 bool bIsChineseConversion = IsChinese( GetSourceLanguage() );
358 if (bIsChineseConversion)
359 ChangeText( aNewTxt, rOrigText, &rOffsets, &aOldSel );
360 else
361 ChangeText( aNewTxt, rOrigText, nullptr, nullptr );
362
363 // change language and font if necessary
364 if (bIsChineseConversion)
365 {
367 "TextConvWrapper::ReplaceUnit : unexpected target language" );
368
369 ESelection aNewSel( aOldSel );
370 aNewSel.nStartPos = aNewSel.nStartPos - aNewTxt.getLength();
371
372 if (pNewUnitLanguage)
373 {
374#ifdef DBG_UTIL
375 DBG_ASSERT(!IsSimilarChinese( *pNewUnitLanguage, nOldLang ),
376 "similar language should not be changed!");
377#endif
378 SetLanguageAndFont( aNewSel, *pNewUnitLanguage, EE_CHAR_LANGUAGE_CJK,
380 }
381 }
382
383 pImpEditEng->UndoActionEnd();
384
385 // adjust ConvContinue / ConvTo if necessary
387 ConvInfo* pConvInfo = pImpEE->GetConvInfo();
388 sal_Int32 nDelta = aNewTxt.getLength() - aOrigTxt.getLength();
389 if (nDelta != 0)
390 {
391 // Note: replacement is always done in the current paragraph
392 // which is the one ConvContinue points to
393 pConvInfo->aConvContinue.nIndex = pConvInfo->aConvContinue.nIndex + nDelta;
394
395 // if that is the same as the one where the conversions ends
396 // the end needs to be updated also
397 if (pConvInfo->aConvTo.nPara == pConvInfo->aConvContinue.nPara)
398 pConvInfo->aConvTo.nIndex = pConvInfo->aConvTo.nIndex + nDelta;
399 }
400}
401
402
403void TextConvWrapper::ChangeText( const OUString &rNewText,
404 std::u16string_view rOrigText,
405 const uno::Sequence< sal_Int32 > *pOffsets,
406 ESelection *pESelection )
407{
409
410 DBG_ASSERT( !rNewText.isEmpty(), "unexpected empty string" );
411 if (rNewText.isEmpty())
412 return;
413
414 if (pOffsets && pESelection) // try to keep as much attributation as possible ?
415 {
416 pESelection->Adjust();
417
418 // remember cursor start position for later setting of the cursor
419 const sal_Int32 nStartIndex = pESelection->nStartPos;
420
421 const sal_Int32 nIndices = pOffsets->getLength();
422 const sal_Int32 *pIndices = pOffsets->getConstArray();
423 const sal_Int32 nConvTextLen = rNewText.getLength();
424 sal_Int32 nPos = 0;
425 sal_Int32 nChgPos = -1;
426 sal_Int32 nConvChgPos = -1;
427
428 // offset to calculate the position in the text taking into
429 // account that text may have been replaced with new text of
430 // different length. Negative values allowed!
431 sal_Int32 nCorrectionOffset = 0;
432
433 DBG_ASSERT(nIndices == 0 || nIndices == nConvTextLen,
434 "mismatch between string length and sequence length!" );
435
436 // find all substrings that need to be replaced (and only those)
437 while (true)
438 {
439 // get index in original text that matches nPos in new text
440 sal_Int32 nIndex;
441 if (nPos < nConvTextLen)
442 nIndex = nPos < nIndices ? pIndices[nPos] : nPos;
443 else
444 {
445 nPos = nConvTextLen;
446 nIndex = rOrigText.size();
447 }
448
449 // end of string also terminates non-matching char sequence
450 if (nPos == nConvTextLen || rOrigText[nIndex] == rNewText[nPos])
451 {
452 // substring that needs to be replaced found?
453 if (nChgPos>=0 && nConvChgPos>=0)
454 {
455 const sal_Int32 nChgLen = nIndex - nChgPos;
456 const sal_Int32 nConvChgLen = nPos - nConvChgPos;
457 OUString aInNew( rNewText.copy( nConvChgPos, nConvChgLen ) );
458
459 // set selection to sub string to be replaced in original text
460 ESelection aSel( *pESelection );
461 sal_Int32 nChgInNodeStartIndex = nStartIndex + nCorrectionOffset + nChgPos;
462 aSel.nStartPos = nChgInNodeStartIndex;
463 aSel.nEndPos = nChgInNodeStartIndex + nChgLen;
464 m_pEditView->SetSelection( aSel );
465
466 // replace selected sub string with the corresponding
467 // sub string from the new text while keeping as
468 // much from the attributes as possible
469 ChangeText_impl( aInNew, true );
470
471 nCorrectionOffset += nConvChgLen - nChgLen;
472
473 nChgPos = -1;
474 nConvChgPos = -1;
475 }
476 }
477 else
478 {
479 // begin of non-matching char sequence found ?
480 if (nChgPos<0 && nConvChgPos<0)
481 {
482 nChgPos = nIndex;
483 nConvChgPos = nPos;
484 }
485 }
486 if (nPos >= nConvTextLen)
487 break;
488 ++nPos;
489 }
490
491 // set cursor to the end of the inserted text
492 // (as it would happen after ChangeText_impl (Delete and Insert)
493 // of the whole text in the 'else' branch below)
494 pESelection->nStartPos = pESelection->nEndPos = nStartIndex + nConvTextLen;
495 }
496 else
497 {
498 ChangeText_impl( rNewText, false );
499 }
500}
501
502
503void TextConvWrapper::ChangeText_impl( const OUString &rNewText, bool bKeepAttributes )
504{
505 if (bKeepAttributes)
506 {
507 // save attributes to be restored
509
510 // replace old text and select new text
511 m_pEditView->InsertText( rNewText, true );
512
513 // since 'SetAttribs' below function like merging with the attributes
514 // from the itemset with any existing ones we have to get rid of all
515 // all attributes now. (Those attributes that may take effect left
516 // to the position where the new text gets inserted after the old text
517 // was deleted)
519 // apply saved attributes to new inserted text
520 m_pEditView->SetAttribs( aSet );
521 }
522 else
523 {
524 m_pEditView->InsertText( rNewText );
525 }
526}
527
528
530{
531 m_bStartChk = false;
534}
535
536
538{
539 return false;
540}
541
542
543/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
EditPaM GetEndPaM() const
Definition: editdoc.cxx:2204
EditPaM GetStartPaM() const
Definition: editdoc.cxx:2198
virtual bool ConvertNextDocument()
Definition: editeng.cxx:2263
EditDoc & GetEditDoc()
Definition: editeng.cxx:905
EditPaM & Min()
Definition: editdoc.hxx:705
ImpEditView * GetImpEditView() const
Definition: editview.hxx:162
ESelection GetSelection() const
Definition: editview.cxx:301
void RemoveAttribs(bool bRemoveParaAttribs=false, sal_uInt16 nWhich=0)
Definition: editview.cxx:591
void SetSelection(const ESelection &rNewSel)
Definition: editview.cxx:256
void InsertText(const OUString &rNew, bool bSelect=false, bool bLOKShowSelect=true)
Definition: editview.cxx:436
SfxItemSet GetAttribs()
Definition: editview.cxx:616
const SfxItemSet & GetEmptyItemSet() const
Definition: editview.cxx:555
EditEngine * GetEditEngine() const
Definition: editview.cxx:178
ImpEditEngine * GetImpEditEngine() const
Definition: editview.cxx:173
OUString GetSelected() const
Definition: editview.cxx:695
void SetAttribs(const SfxItemSet &rSet)
Definition: editview.cxx:560
void UndoActionStart(sal_uInt16 nId)
Definition: impedit5.cxx:246
EPaM CreateEPaM(const EditPaM &rPaM) const
Definition: impedit.hxx:1233
editeng::LanguageSpan GetLanguage(const EditPaM &rPaM, sal_Int32 *pEndPos=nullptr) const
Definition: impedit4.cxx:1394
void UndoActionEnd()
Definition: impedit5.cxx:255
EditSelection CreateSel(const ESelection &rSel)
Definition: impedit.hxx:1258
ConvInfo * GetConvInfo() const
Definition: impedit.hxx:1073
void ImpConvert(OUString &rConvTxt, LanguageType &rConvTxtLang, EditView *pEditView, LanguageType nSrcLang, const ESelection &rConvRange, bool bAllowImplicitChangesForNotConvertibleText, LanguageType nTargetLang, const vcl::Font *pTargetFont)
Definition: impedit4.cxx:1645
void SetEditSelection(const EditSelection &rEditSelection)
Definition: impedit.cxx:245
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
This item describes a Font.
Definition: fontitem.hxx:30
void SetStyleName(const OUString &rStyleName)
Definition: fontitem.hxx:68
void SetFamily(FontFamily _eFamily)
Definition: fontitem.hxx:77
void SetPitch(FontPitch _ePitch)
Definition: fontitem.hxx:86
void SetFamilyName(const OUString &rFamilyName)
Definition: fontitem.hxx:59
void SetCharSet(rtl_TextEncoding _eEncoding)
Definition: fontitem.hxx:95
bool ConvContinue_impl()
Definition: textconv.cxx:200
sal_uInt16 m_nUnitOffset
Definition: textconv.hxx:33
void FindConvText_impl()
Definition: textconv.cxx:109
OUString m_aConvText
Definition: textconv.hxx:31
EditView * m_pEditView
Definition: textconv.hxx:40
virtual ~TextConvWrapper() override
Definition: textconv.cxx:62
virtual void ReplaceUnit(const sal_Int32 nUnitStart, const sal_Int32 nUnitEnd, const OUString &rOrigText, const OUString &rReplaceWith, const css::uno::Sequence< sal_Int32 > &rOffsets, ReplacementAction eAction, LanguageType *pNewUnitLanguage) override
replaces a text unit within a text portion with a new text
Definition: textconv.cxx:304
virtual bool HasRubySupport() const override
specifies if rubies are supported by the document implementing this class.
Definition: textconv.cxx:537
TextConvWrapper(const TextConvWrapper &)=delete
bool ConvNext_impl()
Definition: textconv.cxx:67
void ConvStart_impl(SvxSpellArea eSpell)
Definition: textconv.cxx:142
void SetLanguageAndFont(const ESelection &rESel, LanguageType nLang, sal_uInt16 nLangWhichId, const vcl::Font *pFont, sal_uInt16 nFontWhichId)
Definition: textconv.cxx:214
weld::Widget * m_pWin
Definition: textconv.hxx:41
void SelectNewUnit_impl(const sal_Int32 nUnitStart, const sal_Int32 nUnitEnd)
Definition: textconv.cxx:246
ESelection m_aConvSel
Definition: textconv.hxx:36
virtual void GetNextPortion(OUString &rNextPortion, LanguageType &rLangOfPortion, bool _bAllowImplicitChangesForNotConvertibleText) override
retrieves the next text portion which is to be analyzed
Definition: textconv.cxx:264
bool ConvMore_impl()
Definition: textconv.cxx:120
sal_uInt16 m_nLastPos
Definition: textconv.hxx:34
virtual void HandleNewUnit(const sal_Int32 nUnitStart, const sal_Int32 nUnitEnd) override
announces a new "current unit"
Definition: textconv.cxx:285
void ChangeText_impl(const OUString &rNewText, bool bKeepAttributes)
Definition: textconv.cxx:503
LanguageType m_nConvTextLang
Definition: textconv.hxx:32
bool m_bAllowChange
Definition: textconv.hxx:46
void ChangeText(const OUString &rNewText, std::u16string_view rOrigText, const css::uno::Sequence< sal_Int32 > *pOffsets, ESelection *pESelection)
Definition: textconv.cxx:403
const vcl::Font * GetTargetFont() const
LanguageType GetSourceLanguage() const
static bool IsChinese(LanguageType nLang)
LanguageType GetTargetLanguage() const
FontFamily GetFamilyType()
const OUString & GetStyleName() const
const OUString & GetFamilyName() const
FontPitch GetPitch()
rtl_TextEncoding GetCharSet() const
#define DBG_ASSERT(sCon, aError)
#define EDITUNDO_INSERT
Definition: editdata.hxx:72
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO_CJK(EE_CHAR_START+17)
constexpr TypedWhichId< SvxLanguageItem > EE_CHAR_LANGUAGE_CJK(EE_CHAR_START+15)
sal_Int32 nIndex
#define LANGUAGE_CHINESE_TRADITIONAL
#define LANGUAGE_NONE
#define LANGUAGE_CHINESE_SIMPLIFIED
sal_uInt16 nPos
EPaM aConvStart
Definition: impedit.hxx:173
bool bConvToEnd
Definition: impedit.hxx:176
EPaM aConvTo
Definition: impedit.hxx:174
bool bMultipleDoc
Definition: impedit.hxx:177
EPaM aConvContinue
Definition: impedit.hxx:175
Definition: editdoc.hxx:56
sal_Int32 nIndex
Definition: editdoc.hxx:58
sal_Int32 nPara
Definition: editdoc.hxx:57
bool HasRange() const
Definition: editdata.hxx:151
sal_Int32 nStartPara
Definition: editdata.hxx:113
sal_Int32 nEndPos
Definition: editdata.hxx:116
sal_Int32 nStartPos
Definition: editdata.hxx:114
void Adjust()
Definition: editdata.hxx:184
sal_Int32 nEndPara
Definition: editdata.hxx:115
LanguageType nLang
Definition: editdata.hxx:350
SvxSpellArea
Definition: svxenum.hxx:133
void GetSelection(struct ESelection &rSel, SvxTextForwarder const *pForwarder) noexcept
Definition: unotext.cxx:135