diff options
author | Eike Rathke <erack@redhat.com> | 2014-05-22 16:15:37 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2014-05-22 19:35:36 +0200 |
commit | 29c024afbe6a46459e37c5ceec510de1cd0ca7c8 (patch) | |
tree | 94ffdc525d4d7ef33a2be9e083e766387d61bb59 /svx/source/dialog | |
parent | 2a8eff589a53c8dd65e18d7a9d11cdb98a937e68 (diff) |
+ SvxLanguageComboBox EditModifyHdl(), SaveEditedAsEntry()
Change-Id: I6acc7538fcbf8aa7a5e50ba72b27409252cffa15
Diffstat (limited to 'svx/source/dialog')
-rw-r--r-- | svx/source/dialog/langbox.cxx | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx index 92f5cb6b0b8d..77ec1547b52d 100644 --- a/svx/source/dialog/langbox.cxx +++ b/svx/source/dialog/langbox.cxx @@ -33,6 +33,7 @@ #include <svx/dialmgr.hxx> #include <svx/dialogs.hrc> #include <vcl/builder.hxx> +#include <vcl/i18nhelp.hxx> using namespace ::com::sun::star::util; using namespace ::com::sun::star::lang; @@ -507,6 +508,7 @@ SvxLanguageComboBox::SvxLanguageComboBox( Window* pParent, WinBits nBits, bool b : ComboBox( pParent, nBits ) , SvxLanguageBoxBase( bCheck ) , mnSavedValuePos( COMBOBOX_ENTRY_NOTFOUND ) + , meEditedAndValid( EDITED_NO ) { // display entries sorted SetStyle( GetStyle() | WB_SORT ); @@ -514,6 +516,8 @@ SvxLanguageComboBox::SvxLanguageComboBox( Window* pParent, WinBits nBits, bool b EnableMultiSelection( false ); ImplLanguageBoxBaseInit(); + + SetModifyHdl( LINK( this, SvxLanguageComboBox, EditModifyHdl ) ); } SvxLanguageComboBox::~SvxLanguageComboBox() @@ -698,4 +702,73 @@ sal_Int32 SvxLanguageComboBox::ImplGetSavedValue() const } +IMPL_LINK( SvxLanguageComboBox, EditModifyHdl, SvxLanguageComboBox*, /*pEd*/ ) +{ + OUString aStr( vcl::I18nHelper::filterFormattingChars( GetText())); + if (aStr.isEmpty()) + meEditedAndValid = EDITED_INVALID; + else + { + const sal_Int32 nPos = GetEntryPos( aStr); + if (nPos != COMBOBOX_ENTRY_NOTFOUND) + meEditedAndValid = EDITED_NO; + else + { + OUString aCanonicalized; + bool bValid = LanguageTag::isValidBcp47( aStr, &aCanonicalized); + meEditedAndValid = (bValid ? EDITED_VALID : EDITED_INVALID); + if (bValid && aCanonicalized != aStr) + { + SetText( aCanonicalized); + SetSelection( Selection( aCanonicalized.getLength())); + } + } + } + return 0; +} + + +SvxLanguageComboBox::EditedAndValid SvxLanguageComboBox::GetEditedAndValid() const +{ + return meEditedAndValid; +} + + +sal_Int32 SvxLanguageComboBox::SaveEditedAsEntry() +{ + if (meEditedAndValid != EDITED_VALID) + return COMBOBOX_ENTRY_NOTFOUND; + + LanguageTag aLanguageTag( vcl::I18nHelper::filterFormattingChars( GetText())); + LanguageType nLang = aLanguageTag.getLanguageType(); + if (nLang == LANGUAGE_DONTKNOW) + { + SAL_WARN( "svx.dialog", "SvxLanguageComboBox::SaveEditedAsEntry: unknown tag"); + return COMBOBOX_ENTRY_NOTFOUND; + } + + sal_Int32 nPos = ImplTypeToPos( nLang); + if (nPos != COMBOBOX_ENTRY_NOTFOUND) + return nPos; // Already present but with a different string. + + if (SvtLanguageTable::HasLanguageType( nLang)) + { + // In SvtLanguageTable but not in SvxLanguageComboBox. On purpose? This + // may be an entry with different settings or CTL instead of Western or + // ... all things we don't handle yet. + SAL_WARN( "svx.dialog", "SvxLanguageComboBox::SaveEditedAsEntry: already in SvtLanguageTable: " << + SvtLanguageTable::GetLanguageString( nLang) << ", " << nLang); + } + else + { + // Add to both, SvtLanguageTable and SvxLanguageComboBox. + /* TODO: a descriptive user comment would be a nice to have here. */ + SvtLanguageTable::AddLanguageTag( aLanguageTag, OUString()); + } + + nPos = InsertLanguage( nLang); + + return nPos; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |