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 fe2b8ef18b11b226fddd1cf3fc7f9133426a1b1a Author: Eike Rathke <er...@redhat.com> Date: Thu May 22 19:23:14 2014 +0200 advance start of edit selection on a matching entry ... to allow continuous typing. Change-Id: I4717e72e422037a441e582004bc87689ea7bc455 diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx index 77ec154..028e33d 100644 --- a/svx/source/dialog/langbox.cxx +++ b/svx/source/dialog/langbox.cxx @@ -711,7 +711,24 @@ IMPL_LINK( SvxLanguageComboBox, EditModifyHdl, SvxLanguageComboBox*, /*pEd*/ ) { 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; commit dbe8b3b6d4f2d2cc2e8c702b78034e9013f71e8f Author: Eike Rathke <er...@redhat.com> Date: Thu May 22 16:31:09 2014 +0200 finally switch the Western language list box to SvxLanguageComboBox Change-Id: Ibf0cb4c0fa951adcd0a7f185d7dd45b06913a40d 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/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> commit 1aad7628dcd7fd14d48814d00c3d04e4ec0c59d5 Author: Eike Rathke <er...@redhat.com> Date: Thu May 22 16:30:11 2014 +0200 handle SvxLanguageComboBox edit Change-Id: Icc2a4829b8a859756ed194f35df214f8bb55c7ae 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 ); commit 29c024afbe6a46459e37c5ceec510de1cd0ca7c8 Author: Eike Rathke <er...@redhat.com> Date: Thu May 22 16:15:37 2014 +0200 + SvxLanguageComboBox EditModifyHdl(), SaveEditedAsEntry() Change-Id: I6acc7538fcbf8aa7a5e50ba72b27409252cffa15 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/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx index 92f5cb6..77ec154 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: */ commit 2a8eff589a53c8dd65e18d7a9d11cdb98a937e68 Author: Eike Rathke <er...@redhat.com> Date: Thu May 22 12:28:02 2014 +0200 +bool SvtLanguageTable::HasLanguageType() Change-Id: Id57eb51b69e50be78f85d19a7b3623c1acdf6509 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/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 { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits