20#include <com/sun/star/linguistic2/XAvailableLocales.hpp>
21#include <com/sun/star/linguistic2/XLinguServiceManager2.hpp>
22#include <com/sun/star/linguistic2/XSpellChecker1.hpp>
24#include <rtl/ustring.hxx>
35#include <svx/strings.hrc>
36#include <bitmaps.hlst>
52 OUString aTmp( aURLObj.
GetBase() +
" " );
60 aTmp +=
SvxResId(RID_SVXSTR_LANGUAGE_ALL);
72 sal_Int32
nCount = rSeq.getLength();
74 std::vector< LanguageType > aLangs;
77 std::transform(rSeq.begin(), rSeq.end(), std::back_inserter(aLangs),
79 return LanguageTag::convertToLanguageType(rLocale); });
84static bool lcl_SeqHasLang(
const Sequence< sal_Int16 > & rLangSeq, sal_Int16 nLang )
86 return rLangSeq.hasElements()
87 && std::find(rLangSeq.begin(), rLangSeq.end(), nLang) != rLangSeq.end();
121 if (!sLang.isEmpty())
129 return m_xControl->find_id(OUString::number(
static_cast<sal_uInt16
>(eLangType)));
134 m_xControl->set_id(
pos, OUString::number(
static_cast<sal_uInt16
>(eLangType)));
144 m_xControl->remove_id(OUString::number(
static_cast<sal_uInt16
>(eLangType)));
149 m_xControl->append(OUString::number(
static_cast<sal_uInt16
>(eLangType)), rStr);
173 for (
auto const & nLangType : rLanguageTypes )
175 if (lcl_isPrerequisite( nLangType ))
178 if (lcl_isScriptTypeRequested( nLang, nLangList))
184 if (aNewEntry.
sString.isEmpty())
186 if (std::find_if(rEntries.begin(), rEntries.end(),
187 [=](
const weld::ComboBoxEntry& rEntry){ return rEntry.sId == aNewEntry.sId; }) != rEntries.end())
189 rEntries.push_back(aNewEntry);
196 bool bLangNoneIsLangAll,
bool bCheckSpellAvail,
198 sal_Int16 nDefaultType)
215 std::vector< LanguageType > aSpellAvailLang;
216 std::vector< LanguageType > aHyphAvailLang;
217 std::vector< LanguageType > aThesAvailLang;
218 Sequence< sal_Int16 > aSpellUsedLang;
222 Sequence< css::lang::Locale > aTmp;
240 aSpellUsedLang = xTmp1->getLanguages();
243 std::vector<LanguageType> aKnown;
255 std::vector<weld::ComboBoxEntry>
aEntries;
256 for ( sal_uInt32
i = 0;
i <
nCount;
i++ )
260 nLangType = aKnown[
i];
263 if ( lcl_isPrerequisite( nLangType ) &&
264 (lcl_isScriptTypeRequested( nLangType, nLangList) ||
268 lcl_SeqHasLang(aSpellUsedLang,
static_cast<sal_uInt16
>(nLangType)))
272 if (
aEntries.back().sString.isEmpty())
288 static const auto aSorter = comphelper::string::NaturalStringSorter(
289 ::comphelper::getProcessComponentContext(),
290 Application::GetSettings().GetLanguageTag().getLocale());
291 return aSorter.compare(e1.sString, e2.sString) < 0;
294 int nSeparatorPosition = 0;
295 if (bDefaultLangExist)
298 nSeparatorPosition++;
304 nSeparatorPosition++;
308 if (nSeparatorPosition > 0)
309 m_xControl->insert_separator(nSeparatorPosition,
"");
314 return m_xControl->find_id(OUString::number(
static_cast<sal_uInt16
>(
eType)));
322 if (aEntry.
sImage.isEmpty())
339 if (nLang != nLangType)
375 return weld::ComboBoxEntry(aStrEntry, OUString::number(
static_cast<sal_uInt16
>(nLangType)), bFound ? OUString(RID_SVXBMP_CHECKED) : OUString(RID_SVXBMP_NOTCHECKED));
378 return weld::ComboBoxEntry(aStrEntry, OUString::number(
static_cast<sal_uInt16
>(nLangType)));
383 if (rControl.has_entry())
385 EditedAndValid eOldState = m_eEditedAndValid;
386 OUString
aStr(rControl.get_active_text());
388 m_eEditedAndValid = EditedAndValid::Invalid;
391 const int nPos = rControl.find_text(
aStr);
394 int nStartSelectPos, nEndSelectPos;
395 rControl.get_entry_selection_bounds(nStartSelectPos, nEndSelectPos);
401 bool bSetEditSelection;
403 bSetEditSelection =
false;
407 bSetEditSelection =
true;
415 if (nEndSelectPos == 0)
417 OUString aText(
m_xControl->get_active_text());
418 if (nStartSelectPos == aText.getLength())
421 bSetEditSelection =
true;
425 if (bSetEditSelection)
426 rControl.select_entry_region(nStartSelectPos, nEndSelectPos);
428 m_eEditedAndValid = EditedAndValid::No;
432 OUString aCanonicalized;
434 m_eEditedAndValid = (bValid ? EditedAndValid::Valid : EditedAndValid::Invalid);
435 if (bValid && aCanonicalized !=
aStr)
438 const auto nCursorPos = aCanonicalized.getLength();
439 m_xControl->select_entry_region(nCursorPos, nCursorPos);
443 if (eOldState != m_eEditedAndValid)
445 if (m_eEditedAndValid == EditedAndValid::Invalid)
451 m_aChangeHdl.Call(rControl);
456 , m_aAllString(
SvxResId(RID_SVXSTR_LANGUAGE_ALL))
459 , m_bHasLangNone(false)
460 , m_bLangNoneIsLangAll(false)
461 , m_bWithCheckmark(false)
475 SAL_WARN(
"svx.dialog",
"SvxLanguageBox::SaveEditedAsEntry: unknown tag");
479 for (
size_t i = 0;
i < 3; ++
i)
498 SAL_WARN(
"svx.dialog",
"SvxLanguageBox::SaveEditedAsEntry: already in SvtLanguageTable: " <<
513 case css::i18n::ScriptType::LATIN:
516 case css::i18n::ScriptType::ASIAN:
519 case css::i18n::ScriptType::COMPLEX:
void SetSmartProtocol(INetProtocol eTheSmartScheme)
bool SetSmartURL(std::u16string_view rTheAbsURIRef, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)
LanguageType getLanguageType(bool bResolveSystem=true) const
LanguageTag & makeFallback()
bool isValidBcp47() const
static css::uno::Reference< css::linguistic2::XSpellChecker1 > GetSpellChecker()
static css::uno::Reference< css::linguistic2::XLinguServiceManager2 > GetLngSvcMgr()
static const std::vector< LanguageType > & getInstalledLanguageTypes()
static bool isLegacy(LanguageType nLang)
static LanguageType resolveSystemLanguageByScriptType(LanguageType nLang, sal_Int16 nType)
static LanguageType getSubLanguage(LanguageType nLangID)
static LanguageType getReplacementForObsoleteLanguage(LanguageType nLang)
static LanguageType getSystemLanguage()
static sal_Int16 getScriptType(LanguageType nLang)
static bool hasForbiddenCharacters(LanguageType nLang)
static void AddLanguageTag(const LanguageTag &rLanguageTag)
static sal_uInt32 GetLanguageEntryCount()
static OUString GetLanguageString(const LanguageType eType)
static LanguageType GetLanguageTypeAtIndex(sal_uInt32 nIndex)
static bool HasLanguageType(const LanguageType eType)
bool m_bLangNoneIsLangAll
SVX_DLLPRIVATE int ImplTypeToPos(LanguageType eType) const
void remove_id(const LanguageType eLangType)
LanguageType get_active_id() const
void set_id(int nPos, const LanguageType eLangType)
SvxLanguageBox * SaveEditedAsEntry(SvxLanguageBox *ppBoxes[3])
EditedAndValid m_eEditedAndValid
void SetLanguageList(SvxLanguageListFlags nLangList, bool bHasLangNone, bool bLangNoneIsLangAll=false, bool bCheckSpellAvail=false, bool bDefaultLangExist=false, LanguageType eDefaultLangType=LANGUAGE_NONE, sal_Int16 nDefaultType=0)
SvxLanguageBox(std::unique_ptr< weld::ComboBox > pControl)
std::unique_ptr< weld::ComboBox > m_xControl
LanguageType get_id(int nPos) const
void set_active_id(const LanguageType eLangType)
SVX_DLLPRIVATE void InsertLanguage(const LanguageType nLangType, sal_Int16 nType)
SVX_DLLPRIVATE void AddLanguages(const std::vector< LanguageType > &rLanguageTypes, SvxLanguageListFlags nLangList, std::vector< weld::ComboBoxEntry > &rEntries)
void append(const LanguageType eLangType, const OUString &rStr)
std::unique_ptr< css::uno::Sequence< sal_Int16 > > m_xSpellUsedLang
int find_id(const LanguageType eLangType) const
SVX_DLLPRIVATE weld::ComboBoxEntry BuildEntry(const LanguageType nLangType, sal_Int16 nType=css::i18n::ScriptType::WEAK)
OUString SvxResId(TranslateId aId)
ScXMLEditAttributeMap::Entry const aEntries[]
#define LANGUAGE_USER_SYSTEM_CONFIG
#define LANGUAGE_USER_KEYID
#define LANGUAGE_DONTKNOW
static bool lcl_SeqHasLang(const Sequence< sal_Int16 > &rLangSeq, sal_Int16 nLang)
static std::vector< LanguageType > lcl_LocaleSeqToLangSeq(Sequence< css::lang::Locale > const &rSeq)
OUString GetDicInfoStr(std::u16string_view rName, const LanguageType nLang, bool bNeg)
IMPL_LINK(SvxLanguageBox, ChangeHdl, weld::ComboBox &, rControl, void)
#define LINK(Instance, Class, Member)
#define SAL_WARN(area, stream)
constexpr OUStringLiteral SN_SPELLCHECKER
constexpr OUStringLiteral SN_HYPHENATOR
constexpr OUStringLiteral SN_THESAURUS
SvtScriptType GetScriptTypeOfLanguage(LanguageType nLang)