officecfg/registry/schema/org/openoffice/Office/Calc.xcs | 18 +++++- sc/source/ui/dbgui/scuiasciiopt.cxx | 41 +++++++-------- 2 files changed, 37 insertions(+), 22 deletions(-)
New commits: commit d16535788721238a423408ba59805f4bcacc4e12 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed Jun 4 19:23:30 2025 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sat Jun 7 12:05:07 2025 +0200 [API CHANGE] tdf#166208: New "Encoding" property for text import / clipboard paste The problem appeared, because the existing CharSet property was storing the index of the selection in the encoding list box; and that meant, that any change in the list box content (different sorting; added elements) could suddenly make the selection wrong the next time. With introduction of the autodetection entry into the top of the list box in tdf#152336 (in commit 565b619d57a3b98b0826c4b49dee6606f9ae70e0), many people who had UTF-8 selected in the dialog previously, got UTF-7 instead; and many had not noticed the difference, thus seeing unexpected results after import. The said commit intended to force-select autodetection for the users who had not used the updated dialog yet; but the detection of that scenario was flawed, and didn't work (that was discussed, and respective code was dropped in commit ...). This change implements that idea. I decided to ignore the stored CharSet value; after the change, autodetection entry will be pre-selected at the first start of the dialog. This will be a minor annoyance for users who have already re-selected wanted encoding after previous upgrade; but it allows to resolve the bug for people upgrading from versions prior to 25.2. Also, since new versions will not write to CharSet, it's possible to use a shared profile between old and new versions without breaking the encoding selection in either. Change-Id: I59640b16f703077b6fda44a34eadf2edbe8e6bf5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186240 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs index 5023d3c9e78e..25b272f35c64 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs @@ -1091,11 +1091,18 @@ </prop> <prop oor:name="CharSet" oor:type="xs:int" oor:nillable="false"> <info> - <desc>Char Set</desc> + <desc>Char Set (index of selected item in the dialog's list box; obsoleted by Encoding)</desc> <label>CharSet</label> </info> <value>-1</value> </prop> + <prop oor:name="Encoding" oor:type="xs:short" oor:nillable="false"> + <info> + <desc>Encoding (an rtl_TextEncoding value; default is "don't know")</desc> + <label>Encoding</label> + </info> + <value>0</value> + </prop> <prop oor:name="FixedWidthList" oor:type="xs:string" oor:nillable="false"> <info> <desc>Fixed Width List of separators</desc> @@ -1201,11 +1208,18 @@ </prop> <prop oor:name="CharSet" oor:type="xs:int" oor:nillable="false"> <info> - <desc>Char Set</desc> + <desc>Char Set (index of selected item in the dialog's list box; obsoleted by Encoding)</desc> <label>CharSet</label> </info> <value>-1</value> </prop> + <prop oor:name="Encoding" oor:type="xs:short" oor:nillable="false"> + <info> + <desc>Encoding (an rtl_TextEncoding value; default is "don't know")</desc> + <label>Encoding</label> + </info> + <value>0</value> + </prop> <prop oor:name="FixedWidthList" oor:type="xs:string" oor:nillable="false"> <info> <desc>Fixed Width List of separators</desc> diff --git a/sc/source/ui/dbgui/scuiasciiopt.cxx b/sc/source/ui/dbgui/scuiasciiopt.cxx index 8370ee76fb12..95dcb676650e 100644 --- a/sc/source/ui/dbgui/scuiasciiopt.cxx +++ b/sc/source/ui/dbgui/scuiasciiopt.cxx @@ -81,7 +81,7 @@ constexpr OUString CSVIO_RemoveSpace = u"RemoveSpace"_ustr; constexpr OUString CSVIO_EvaluateFormulas = u"EvaluateFormulas"_ustr; constexpr OUString CSVIO_SeparatorType = u"SeparatorType"_ustr; constexpr OUString CSVIO_FromRow = u"FromRow"_ustr; -constexpr OUString CSVIO_CharSet = u"CharSet"_ustr; +constexpr OUString CSVIO_Encoding = u"Encoding"_ustr; constexpr OUString CSVIO_QuotedAsText = u"QuotedFieldAsText"_ustr; constexpr OUString CSVIO_DetectSpecialNum = u"DetectSpecialNumbers"_ustr; constexpr OUString CSVIO_DetectScientificNum = u"DetectScientificNumbers"_ustr; @@ -160,7 +160,7 @@ static OUString lcl_GetConfigPath(ScImportAsciiCall eCall) static void lcl_LoadSeparators(ScImportAsciiCall eCall, OUString& rFieldSeparators, OUString& rTextSeparators, bool& rMergeDelimiters, bool& rQuotedAsText, bool& rDetectSpecialNum, bool& rDetectScientificNum, - SeparatorType& rSepType, sal_Int32& rFromRow, sal_Int32& rCharSet, + SeparatorType& rSepType, sal_Int32& rFromRow, rtl_TextEncoding& rEncoding, sal_Int32& rLanguage, bool& rSkipEmptyCells, bool& rRemoveSpace, bool& rEvaluateFormulas) { @@ -168,6 +168,8 @@ static void lcl_LoadSeparators(ScImportAsciiCall eCall, OUString& rFieldSeparato const Sequence<OUString> aNames = aItem.GetNodeNames({}); const Sequence<Any> aValues = aItem.GetProperties(aNames); + rEncoding = RTL_TEXTENCODING_DONTKNOW; + for (sal_Int32 i = 0; i < aNames.getLength(); ++i) { const OUString& name = aNames[i]; @@ -188,8 +190,8 @@ static void lcl_LoadSeparators(ScImportAsciiCall eCall, OUString& rFieldSeparato rEvaluateFormulas = ScUnoHelpFunctions::GetBoolFromAny(value); else if (name == CSVIO_FromRow) value >>= rFromRow; - else if (name == CSVIO_CharSet) - value >>= rCharSet; + else if (name == CSVIO_Encoding) + value >>= rEncoding; else if (name == CSVIO_QuotedAsText) value >>= rQuotedAsText; else if (name == CSVIO_DetectSpecialNum) @@ -206,7 +208,7 @@ static void lcl_LoadSeparators(ScImportAsciiCall eCall, OUString& rFieldSeparato static void lcl_SaveSeparators(ScImportAsciiCall eCall, const OUString& sFieldSeparators, const OUString& sTextSeparators, bool bMergeDelimiters, bool bQuotedAsText, bool bDetectSpecialNum, bool bDetectScientificNum, SeparatorType rSepType, sal_Int32 nFromRow, - sal_Int32 nCharSet, sal_Int32 nLanguage, bool bSkipEmptyCells, bool bRemoveSpace, bool bEvaluateFormulas) + rtl_TextEncoding eEncoding, sal_Int32 nLanguage, bool bSkipEmptyCells, bool bRemoveSpace, bool bEvaluateFormulas) { ScLinkConfigItem aItem(lcl_GetConfigPath(eCall)); std::unordered_map<OUString, Any> properties; @@ -227,8 +229,8 @@ static void lcl_SaveSeparators(ScImportAsciiCall eCall, properties[name] <<= static_cast<sal_Int16>(rSepType); else if (name == CSVIO_FromRow) properties[name] <<= nFromRow; - else if (name == CSVIO_CharSet) - properties[name] <<= nCharSet; + else if (name == CSVIO_Encoding) + properties[name] <<= eEncoding; else if (name == CSVIO_QuotedAsText) properties[name] <<= bQuotedAsText; else if (name == CSVIO_DetectSpecialNum) @@ -325,12 +327,12 @@ ScImportAsciiDlg::ScImportAsciiDlg(weld::Window* pParent, std::u16string_view aD bool bSkipEmptyCells = true; bool bRemoveSpace = false; sal_Int32 nFromRow = 1; - sal_Int32 nCharSet = -1; + rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; sal_Int32 nLanguage = 0; lcl_LoadSeparators ( meCall, sFieldSeparators, sTextSeparators, bMergeDelimiters, bQuotedFieldAsText, bDetectSpecialNum, bDetectScientificNum, eSepType, nFromRow, - nCharSet, nLanguage, bSkipEmptyCells, bRemoveSpace, bEvaluateFormulas); + eEncoding, nLanguage, bSkipEmptyCells, bRemoveSpace, bEvaluateFormulas); maFieldSeparators = sFieldSeparators; @@ -367,10 +369,6 @@ ScImportAsciiDlg::ScImportAsciiDlg(weld::Window* pParent, std::u16string_view aD else mxRbDetectSep->set_active(true); - // Clipboard is always Unicode, else rely on default/config. - rtl_TextEncoding ePreselectUnicode = (meCall == SC_IMPORTFILE ? - RTL_TEXTENCODING_DONTKNOW : RTL_TEXTENCODING_UNICODE); - // Detect character set only once and then use it for "Detect" option. SvStreamEndian eEndian; SfxObjectShell::DetectCharSet(*mpDatStream, meDetectedCharSet, eEndian); @@ -425,12 +423,13 @@ ScImportAsciiDlg::ScImportAsciiDlg(weld::Window* pParent, std::u16string_view aD // Insert one for detecting charset. mxLbCharSet->InsertTextEncoding( RTL_TEXTENCODING_USER_DETECTED, "- " + ScResId( SCSTR_AUTOMATIC ) + " -" ); - if (ePreselectUnicode != RTL_TEXTENCODING_DONTKNOW) - mxLbCharSet->SelectTextEncoding( ePreselectUnicode ); - else if (nCharSet >= 0) - mxLbCharSet->set_active(nCharSet); - else - mxLbCharSet->SelectTextEncoding(RTL_TEXTENCODING_USER_DETECTED); + // Clipboard is always Unicode, and TextToColumns doesn't use encoding. + if (meCall != SC_IMPORTFILE) + eEncoding = RTL_TEXTENCODING_UNICODE; + else if (eEncoding == RTL_TEXTENCODING_DONTKNOW) + eEncoding = RTL_TEXTENCODING_USER_DETECTED; + + mxLbCharSet->SelectTextEncoding(eEncoding); SetSelectedCharSet(); mxLbCharSet->connect_changed( LINK( this, ScImportAsciiDlg, CharSetHdl ) ); @@ -476,6 +475,8 @@ ScImportAsciiDlg::ScImportAsciiDlg(weld::Window* pParent, std::u16string_view aD if (meCall == SC_TEXTTOCOLUMNS) { + m_xBuilder->weld_frame(u"frame1"_ustr)->hide(); // the whole "Import" section + mxFtCharSet->set_sensitive(false); mxLbCharSet->set_sensitive(false); mxFtCustomLang->set_sensitive(false); @@ -622,7 +623,7 @@ void ScImportAsciiDlg::SaveParameters() mxCkbQuotedAsText->get_active(), mxCkbDetectNumber->get_active(), mxCkbDetectScientificNumber->get_active(), mxRbFixed->get_active() ? FIXED : (mxRbDetectSep->get_active() ? DETECT_SEPARATOR : SEPARATOR), mxNfRow->get_value(), - mxLbCharSet->get_active(), + mxLbCharSet->GetSelectTextEncoding(), static_cast<sal_uInt16>(mxLbCustomLang->get_active_id()), mxCkbSkipEmptyCells->get_active(), mxCkbRemoveSpace->get_active(), mxCkbEvaluateFormulas->get_active());