cui/source/inc/chardlg.hxx | 2 cui/source/tabpages/chardlg.cxx | 24 ++++++++++ cui/uiconfig/ui/charnamepage.ui | 4 - include/svtools/langtab.hxx | 1 include/svx/langbox.hxx | 16 ++++++- svtools/source/misc/langtab.cxx | 14 ++++++ svx/source/dialog/langbox.cxx | 90 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 147 insertions(+), 4 deletions(-)
New commits: commit aca222ee87826eb99554dba8fcf22e0cf7c718e0 Author: Eike Rathke <er...@redhat.com> Date: Thu May 22 12:28:02 2014 +0200 switch the Western language list box to SvxLanguageComboBox This allows the user to assign an arbitrary (but valid) BCP 47 language tag to a portion of text, so that customized spell-checkers or other language-dependent tools can be used without the need to wait for LibreOffice to add yet another language to the list in the next release. +bool SvtLanguageTable::HasLanguageType() (cherry picked from commit 2a8eff589a53c8dd65e18d7a9d11cdb98a937e68) + SvxLanguageComboBox EditModifyHdl(), SaveEditedAsEntry() (cherry picked from commit 29c024afbe6a46459e37c5ceec510de1cd0ca7c8) handle SvxLanguageComboBox edit (cherry picked from commit 1aad7628dcd7fd14d48814d00c3d04e4ec0c59d5) finally switch the Western language list box to SvxLanguageComboBox (cherry picked from commit dbe8b3b6d4f2d2cc2e8c702b78034e9013f71e8f) advance start of edit selection on a matching entry ... to allow continuous typing. (cherry picked from commit fe2b8ef18b11b226fddd1cf3fc7f9133426a1b1a) Change-Id: Id57eb51b69e50be78f85d19a7b3623c1acdf6509 Reviewed-on: https://gerrit.libreoffice.org/9447 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Reviewed-by: Björn Michaelsen <bjoern.michael...@canonical.com> Reviewed-by: Kohei Yoshida <libreoff...@kohei.us> Tested-by: Kohei Yoshida <libreoff...@kohei.us> diff --git a/cui/source/inc/chardlg.hxx b/cui/source/inc/chardlg.hxx index d90c2cb..69b46c8 100644 --- a/cui/source/inc/chardlg.hxx +++ b/cui/source/inc/chardlg.hxx @@ -86,7 +86,7 @@ private: FixedText* m_pWestFontSizeFT; FontSizeBox* m_pWestFontSizeLB; FixedText* m_pWestFontLanguageFT; - SvxLanguageBox* m_pWestFontLanguageLB; + SvxLanguageComboBox* m_pWestFontLanguageLB; FixedText* m_pWestFontTypeFT; VclContainer* m_pEastFrame; diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx index 1f0e58560..f36ae8e 100644 --- a/cui/source/tabpages/chardlg.cxx +++ b/cui/source/tabpages/chardlg.cxx @@ -1086,6 +1086,30 @@ bool SvxCharNamePage::FillItemSet_Impl( SfxItemSet& rSet, LanguageGroup eLangGrp } nWhich = GetWhich( nSlot ); pOld = GetOldItem( rSet, nSlot ); + + // For language list boxes acting as ComboBox, check for, add and select an + // edited entry. + SvxLanguageComboBox* pLangComboBox = dynamic_cast<SvxLanguageComboBox*>(pLangBox); + if (pLangComboBox) + { + switch (pLangComboBox->GetEditedAndValid()) + { + case SvxLanguageComboBox::EDITED_NO: + ; // nothing to do + break; + case SvxLanguageComboBox::EDITED_VALID: + { + const sal_Int32 nPos = pLangComboBox->SaveEditedAsEntry(); + if (nPos != COMBOBOX_ENTRY_NOTFOUND) + pLangComboBox->SelectEntryPos( nPos); + } + break; + case SvxLanguageComboBox::EDITED_INVALID: + pLangComboBox->SelectEntryPos( pLangComboBox->GetSavedValueLBB()); + break; + } + } + sal_Int32 nLangPos = pLangBox->GetSelectEntryPosLBB(); LanguageType eLangType = (LanguageType)(sal_uLong)pLangBox->GetEntryDataLBB( nLangPos ); diff --git a/cui/uiconfig/ui/charnamepage.ui b/cui/uiconfig/ui/charnamepage.ui index 25c67f1..6205dfd 100644 --- a/cui/uiconfig/ui/charnamepage.ui +++ b/cui/uiconfig/ui/charnamepage.ui @@ -54,7 +54,7 @@ </packing> </child> <child> - <object class="svxcorelo-SvxLanguageBox" id="westlanglb-nocjk"> + <object class="svxcorelo-SvxLanguageComboBox" id="westlanglb-nocjk"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="halign">start</property> @@ -342,7 +342,7 @@ </packing> </child> <child> - <object class="svxcorelo-SvxLanguageBox" id="westlanglb-cjk"> + <object class="svxcorelo-SvxLanguageComboBox" id="westlanglb-cjk"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="hexpand">True</property> diff --git a/include/svtools/langtab.hxx b/include/svtools/langtab.hxx index 0034873..56d0618 100644 --- a/include/svtools/langtab.hxx +++ b/include/svtools/langtab.hxx @@ -29,6 +29,7 @@ class SVT_DLLPUBLIC SvtLanguageTable { public: + static bool HasLanguageType( const LanguageType eType ); static OUString GetLanguageString( const LanguageType eType ); static LanguageType GetLanguageType( const OUString& rStr ); static sal_uInt32 GetLanguageEntryCount(); diff --git a/include/svx/langbox.hxx b/include/svx/langbox.hxx index 410b240..91b788c 100644 --- a/include/svx/langbox.hxx +++ b/include/svx/langbox.hxx @@ -144,8 +144,20 @@ public: SvxLanguageComboBox( Window* pParent, WinBits nBits, bool bCheck = false ); virtual ~SvxLanguageComboBox(); + enum EditedAndValid + { + EDITED_NO, + EDITED_VALID, + EDITED_INVALID + }; + + EditedAndValid GetEditedAndValid() const; + sal_Int32 SaveEditedAsEntry(); + + private: - sal_Int32 mnSavedValuePos; + sal_Int32 mnSavedValuePos; + EditedAndValid meEditedAndValid; SVX_DLLPRIVATE virtual sal_Int32 ImplInsertImgEntry( const OUString& rEntry, sal_Int32 nPos, bool bChecked ) SAL_OVERRIDE; SVX_DLLPRIVATE virtual void ImplRemoveEntryAt( sal_Int32 nPos ) SAL_OVERRIDE; @@ -164,6 +176,8 @@ private: SVX_DLLPRIVATE virtual void ImplDisable() SAL_OVERRIDE; SVX_DLLPRIVATE virtual void ImplSaveValue() SAL_OVERRIDE; SVX_DLLPRIVATE virtual sal_Int32 ImplGetSavedValue() const SAL_OVERRIDE; + + DECL_LINK( EditModifyHdl, SvxLanguageComboBox* ); }; #endif diff --git a/svtools/source/misc/langtab.cxx b/svtools/source/misc/langtab.cxx index b8eeec0..3cd6b93 100644 --- a/svtools/source/misc/langtab.cxx +++ b/svtools/source/misc/langtab.cxx @@ -43,6 +43,7 @@ public: SvtLanguageTableImpl(); virtual ~SvtLanguageTableImpl(); + bool HasType( const LanguageType eType ) const; const OUString GetString( const LanguageType eType, bool bUserInterfaceSelection = false ) const; LanguageType GetType( const OUString& rStr ) const; sal_uInt32 GetEntryCount() const; @@ -148,6 +149,19 @@ SvtLanguageTableImpl::~SvtLanguageTableImpl() } +bool SvtLanguageTableImpl::HasType( const LanguageType eType ) const +{ + LanguageType eLang = MsLangId::getReplacementForObsoleteLanguage( eType, false); + sal_uInt32 nPos = FindIndex( eLang ); + + return RESARRAY_INDEX_NOTFOUND != nPos && nPos < Count(); +} + +bool SvtLanguageTable::HasLanguageType( const LanguageType eType ) +{ + return theLanguageTable::get().HasType( eType ); +} + const OUString SvtLanguageTableImpl::GetString( const LanguageType eType, bool bUserInterfaceSelection ) const { diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx index 92f5cb6..028e33d 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,90 @@ 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) + { + // Advance start of full selection by one so the next character + // will already continue the string instead of having to type the + // same character again to start a new string. The selection + // includes formatting characters and is reverse when obtained from + // the Edit control. + Selection aSel( GetSelection()); + if (aSel.Max() == 1) + { + OUString aText( GetText()); + if (aSel.Min() == aText.getLength()) + { + ++aSel.Max(); + SetSelection( aSel); + } + } + 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: */
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits