summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2014-05-22 16:15:37 +0200
committerEike Rathke <erack@redhat.com>2014-05-22 19:35:36 +0200
commit29c024afbe6a46459e37c5ceec510de1cd0ca7c8 (patch)
tree94ffdc525d4d7ef33a2be9e083e766387d61bb59
parent2a8eff589a53c8dd65e18d7a9d11cdb98a937e68 (diff)
+ SvxLanguageComboBox EditModifyHdl(), SaveEditedAsEntry()
Change-Id: I6acc7538fcbf8aa7a5e50ba72b27409252cffa15
-rw-r--r--include/svx/langbox.hxx16
-rw-r--r--svx/source/dialog/langbox.cxx73
2 files changed, 88 insertions, 1 deletions
diff --git a/include/svx/langbox.hxx b/include/svx/langbox.hxx
index 410b2405f30d..91b788cdf0c2 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 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: */