summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/dialog/ascfldlg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/dialog/ascfldlg.cxx')
-rw-r--r--sw/source/ui/dialog/ascfldlg.cxx447
1 files changed, 447 insertions, 0 deletions
diff --git a/sw/source/ui/dialog/ascfldlg.cxx b/sw/source/ui/dialog/ascfldlg.cxx
new file mode 100644
index 000000000..e37b9d213
--- /dev/null
+++ b/sw/source/ui/dialog/ascfldlg.cxx
@@ -0,0 +1,447 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sal/config.h>
+
+#include <utility>
+
+#include <hintids.hxx>
+#include <rtl/textenc.h>
+#include <i18nlangtag/mslangid.hxx>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <unotools/lingucfg.hxx>
+#include <unotools/viewoptions.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/printer.hxx>
+#include <sfx2/docfile.hxx>
+#include <svl/languageoptions.hxx>
+#include <editeng/langitem.hxx>
+#include <swtypes.hxx>
+#include <ascfldlg.hxx>
+#include <shellio.hxx>
+#include <docsh.hxx>
+#include <doc.hxx>
+#include <IDocumentDeviceAccess.hxx>
+
+#include <vcl/metric.hxx>
+
+using namespace ::com::sun::star;
+
+namespace
+{
+
+const sal_Unicode cDialogExtraDataClose = '}';
+const char sDialogImpExtraData[] = "EncImpDlg:{";
+const char sDialogExpExtraData[] = "EncExpDlg:{";
+const sal_Int32 nDialogExtraDataLen = 11; // 12345678901
+
+}
+
+SwAsciiFilterDlg::SwAsciiFilterDlg( weld::Window* pParent, SwDocShell& rDocSh,
+ SvStream* pStream )
+ : SfxDialogController(pParent, "modules/swriter/ui/asciifilterdialog.ui", "AsciiFilterDialog")
+ , m_bSaveLineStatus(true)
+ , m_xCharSetLB(new SvxTextEncodingBox(m_xBuilder->weld_combo_box("charset")))
+ , m_xFontFT(m_xBuilder->weld_label("fontft"))
+ , m_xFontLB(m_xBuilder->weld_combo_box("font"))
+ , m_xLanguageFT(m_xBuilder->weld_label("languageft"))
+ , m_xLanguageLB(new SvxLanguageBox(m_xBuilder->weld_combo_box("language")))
+ , m_xCRLF_RB(m_xBuilder->weld_radio_button("crlf"))
+ , m_xCR_RB(m_xBuilder->weld_radio_button("cr"))
+ , m_xLF_RB(m_xBuilder->weld_radio_button("lf"))
+ , m_xIncludeBOM_CB(m_xBuilder->weld_check_button("includebom"))
+{
+ m_xFontLB->make_sorted();
+
+ SwAsciiOptions aOpt;
+ {
+ SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8));
+ if (aDlgOpt.Exists())
+ {
+ css::uno::Any aUserItem = aDlgOpt.GetUserItem("UserItem");
+ aUserItem >>= m_sExtraData;
+ }
+
+ const SfxStringItem* pItem;
+ OUString sAsciiOptions;
+ if( rDocSh.GetMedium() != nullptr &&
+ rDocSh.GetMedium()->GetItemSet() != nullptr &&
+ (pItem = rDocSh.GetMedium()->GetItemSet()->GetItemIfSet( SID_FILE_FILTEROPTIONS )))
+ {
+ sAsciiOptions = pItem->GetValue();
+ }
+
+ const OUString sFindNm = OUString::createFromAscii(
+ pStream ? sDialogImpExtraData
+ : sDialogExpExtraData);
+ sal_Int32 nStt = m_sExtraData.indexOf( sFindNm );
+ if( -1 != nStt )
+ {
+ nStt += nDialogExtraDataLen;
+ sal_Int32 nEnd = m_sExtraData.indexOf( cDialogExtraDataClose, nStt );
+ if( -1 != nEnd )
+ {
+ if(sAsciiOptions.isEmpty())
+ sAsciiOptions = m_sExtraData.copy(nStt, nEnd - nStt);
+ nStt -= nDialogExtraDataLen;
+ m_sExtraData = m_sExtraData.replaceAt(nStt, nEnd - nStt + 1, u"");
+ }
+ }
+ if(!sAsciiOptions.isEmpty())
+ aOpt.ReadUserData(sAsciiOptions);
+ }
+
+ // read the first chars and check the charset, (language - with L&H)
+ if( pStream )
+ {
+ char aBuffer[ 4098 ];
+ const sal_uInt64 nOldPos = pStream->Tell();
+ const size_t nBytesRead = pStream->ReadBytes(aBuffer, 4096);
+ pStream->Seek( nOldPos );
+
+ if( nBytesRead <= 4096 )
+ {
+ aBuffer[ nBytesRead ] = '0';
+ aBuffer[ nBytesRead+1 ] = '0';
+ }
+
+ bool bCR = false, bLF = false, bNullChar = false;
+ for( sal_uInt64 nCnt = 0; nCnt < nBytesRead; ++nCnt )
+ switch( aBuffer[ nCnt ] )
+ {
+ case 0x0: bNullChar = true; break;
+ case 0xA: bLF = true; break;
+ case 0xD: bCR = true; break;
+ case 0xC:
+ case 0x1A:
+ case 0x9: break;
+ default: break;
+ }
+
+ if( !bNullChar )
+ {
+ if( bCR )
+ {
+ if( bLF )
+ {
+ aOpt.SetParaFlags( LINEEND_CRLF );
+ }
+ else
+ {
+ aOpt.SetParaFlags( LINEEND_CR );
+ }
+ }
+ else if( bLF )
+ {
+ aOpt.SetParaFlags( LINEEND_LF );
+ }
+ }
+
+ const sal_uInt16 nAppScriptType = SvtLanguageOptions::GetI18NScriptTypeOfLanguage( GetAppLanguage() );
+ SwDoc* pDoc = rDocSh.GetDoc();
+
+ // initialize language
+ {
+ if( !aOpt.GetLanguage() )
+ {
+ if(pDoc)
+ {
+ const sal_uInt16 nWhich = GetWhichOfScript( RES_CHRATR_LANGUAGE, nAppScriptType);
+ aOpt.SetLanguage( static_cast<const SvxLanguageItem&>(pDoc->
+ GetDefault( nWhich )).GetLanguage());
+ }
+ else
+ {
+ SvtLinguOptions aLinguOpt;
+ SvtLinguConfig().GetOptions( aLinguOpt );
+ switch(nAppScriptType)
+ {
+ case css::i18n::ScriptType::ASIAN:
+ aOpt.SetLanguage(MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage_CJK, css::i18n::ScriptType::ASIAN));
+ break;
+ case css::i18n::ScriptType::COMPLEX:
+ aOpt.SetLanguage(MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage_CTL, css::i18n::ScriptType::COMPLEX));
+ break;
+ //SvtScriptType::LATIN:
+ default:
+ aOpt.SetLanguage(MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage, css::i18n::ScriptType::LATIN));
+ }
+ }
+ }
+
+ m_xLanguageLB->SetLanguageList( SvxLanguageListFlags::ALL, true );
+ m_xLanguageLB->set_active_id(aOpt.GetLanguage());
+ }
+
+ {
+ bool bDelPrinter = false;
+ VclPtr<SfxPrinter> pPrt = pDoc ? pDoc->getIDocumentDeviceAccess().getPrinter(false) : nullptr;
+ if( !pPrt )
+ {
+ auto pSet = std::make_unique<SfxItemSetFixed
+ <SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
+ SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC>>( rDocSh.GetPool() );
+ pPrt = VclPtr<SfxPrinter>::Create( std::move(pSet) );
+ bDelPrinter = true;
+ }
+
+ // get the set of distinct available family names
+ std::set< OUString > aFontNames;
+ int nFontNames = pPrt->GetFontFaceCollectionCount();
+ for( int i = 0; i < nFontNames; i++ )
+ {
+ FontMetric aFontMetric( pPrt->GetFontMetricFromCollection( i ) );
+ aFontNames.insert( aFontMetric.GetFamilyName() );
+ }
+
+ // insert into listbox
+ for( const auto& rFontName : aFontNames )
+ {
+ m_xFontLB->append_text(rFontName);
+ }
+
+ if( aOpt.GetFontName().isEmpty() )
+ {
+ LanguageType eLang = aOpt.GetLanguage();
+ vcl::Font aTmpFont(OutputDevice::GetDefaultFont(DefaultFontType::FIXED, eLang, GetDefaultFontFlags::OnlyOne, pPrt));
+ aOpt.SetFontName(aTmpFont.GetFamilyName());
+ }
+
+ m_xFontLB->set_active_text(aOpt.GetFontName());
+
+ if( bDelPrinter )
+ pPrt.disposeAndClear();
+ }
+
+ // hide the unused Controls for Export
+ m_xIncludeBOM_CB->hide();
+ }
+ else
+ {
+ // hide the unused Controls for Export
+ m_xFontFT->hide();
+ m_xFontLB->hide();
+ m_xLanguageFT->hide();
+ m_xLanguageLB->hide();
+
+
+ SetIncludeBOM(aOpt.GetIncludeBOM());
+ m_xIncludeBOM_CB->save_state();
+ }
+
+ // initialize character set
+ m_xCharSetLB->FillFromTextEncodingTable( pStream != nullptr );
+ m_xCharSetLB->SelectTextEncoding( aOpt.GetCharSet() );
+
+ m_xCharSetLB->connect_changed( LINK( this, SwAsciiFilterDlg, CharSetSelHdl ));
+ m_xCRLF_RB->connect_toggled( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
+ m_xLF_RB->connect_toggled( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
+ m_xCR_RB->connect_toggled( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
+
+ SetCRLF( aOpt.GetParaFlags() );
+
+ m_xCRLF_RB->save_state();
+ m_xLF_RB->save_state();
+ m_xCR_RB->save_state();
+
+ UpdateIncludeBOMSensitiveState();
+}
+
+SwAsciiFilterDlg::~SwAsciiFilterDlg()
+{
+ SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8));
+ aDlgOpt.SetUserItem("UserItem", uno::Any(m_sExtraData));
+}
+
+void SwAsciiFilterDlg::FillOptions( SwAsciiOptions& rOptions )
+{
+ sal_uLong nCCode = m_xCharSetLB->GetSelectTextEncoding();
+ OUString sFont;
+ LanguageType nLng = LANGUAGE_SYSTEM;
+ if (m_xFontLB->get_visible())
+ {
+ sFont = m_xFontLB->get_active_text();
+ nLng = m_xLanguageLB->get_active_id();
+ }
+
+ rOptions.SetFontName( sFont );
+ rOptions.SetCharSet( rtl_TextEncoding( nCCode ) );
+ rOptions.SetLanguage( nLng );
+ rOptions.SetParaFlags( GetCRLF() );
+ rOptions.SetIncludeBOM( GetIncludeBOM() );
+
+ // save the user settings
+ OUString sData;
+ rOptions.WriteUserData( sData );
+ if (sData.isEmpty())
+ return;
+
+ const OUString sFindNm = OUString::createFromAscii(
+ m_xFontLB->get_visible() ? sDialogImpExtraData
+ : sDialogExpExtraData);
+ sal_Int32 nStt = m_sExtraData.indexOf( sFindNm );
+ if( -1 != nStt )
+ {
+ // called twice, so remove "old" settings
+ sal_Int32 nEnd = m_sExtraData.indexOf( cDialogExtraDataClose,
+ nStt + nDialogExtraDataLen );
+ if( -1 != nEnd )
+ m_sExtraData = m_sExtraData.replaceAt( nStt, nEnd - nStt + 1, u"" );
+ }
+ m_sExtraData += sFindNm + sData + OUStringChar(cDialogExtraDataClose);
+}
+
+void SwAsciiFilterDlg::SetCRLF( LineEnd eEnd )
+{
+ switch (eEnd)
+ {
+ case LINEEND_CR:
+ m_xCR_RB->set_active(true);
+ break;
+ case LINEEND_CRLF:
+ m_xCRLF_RB->set_active(true);
+ break;
+ case LINEEND_LF:
+ m_xLF_RB->set_active(true);
+ break;
+ }
+}
+
+LineEnd SwAsciiFilterDlg::GetCRLF() const
+{
+ LineEnd eEnd;
+ if(m_xCR_RB->get_active())
+ eEnd = LINEEND_CR;
+ else if (m_xLF_RB->get_active())
+ eEnd = LINEEND_LF;
+ else
+ eEnd = LINEEND_CRLF;
+ return eEnd;
+}
+
+void SwAsciiFilterDlg::SetIncludeBOM( bool bIncludeBOM )
+{
+ m_xIncludeBOM_CB->set_state(bIncludeBOM ? TRISTATE_TRUE : TRISTATE_FALSE);
+}
+
+bool SwAsciiFilterDlg::GetIncludeBOM() const
+{
+ return m_xIncludeBOM_CB->get_state() != TRISTATE_FALSE;
+}
+
+void SwAsciiFilterDlg::UpdateIncludeBOMSensitiveState()
+{
+ if (!m_xIncludeBOM_CB->get_visible())
+ return;
+
+ switch (m_xCharSetLB->GetSelectTextEncoding())
+ {
+ case RTL_TEXTENCODING_UTF8:
+ case RTL_TEXTENCODING_UCS2:
+ m_xIncludeBOM_CB->set_sensitive(true);
+ break;
+ default:
+ m_xIncludeBOM_CB->set_sensitive(false);
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SwAsciiFilterDlg, CharSetSelHdl, weld::ComboBox&, void)
+{
+ LineEnd eOldEnd = GetCRLF(), eEnd = LineEnd(-1);
+ LanguageType nLng = m_xFontLB->get_visible()
+ ? m_xLanguageLB->get_active_id()
+ : LANGUAGE_SYSTEM,
+ nOldLng = nLng;
+
+ rtl_TextEncoding nChrSet = m_xCharSetLB->GetSelectTextEncoding();
+ if( nChrSet == osl_getThreadTextEncoding() )
+ eEnd = GetSystemLineEnd();
+ else
+ {
+ switch( nChrSet )
+ {
+ case RTL_TEXTENCODING_MS_1252:
+#ifdef UNX
+ eEnd = LINEEND_LF;
+#else
+ eEnd = LINEEND_CRLF; // ANSI
+#endif
+ break;
+
+ case RTL_TEXTENCODING_APPLE_ROMAN: // MAC
+ eEnd = LINEEND_CR;
+ break;
+
+ case RTL_TEXTENCODING_IBM_850: // DOS
+ eEnd = LINEEND_CRLF;
+ break;
+
+ case RTL_TEXTENCODING_APPLE_ARABIC:
+ case RTL_TEXTENCODING_APPLE_CENTEURO:
+ case RTL_TEXTENCODING_APPLE_CROATIAN:
+ case RTL_TEXTENCODING_APPLE_CYRILLIC:
+ case RTL_TEXTENCODING_APPLE_DEVANAGARI:
+ case RTL_TEXTENCODING_APPLE_FARSI:
+ case RTL_TEXTENCODING_APPLE_GREEK:
+ case RTL_TEXTENCODING_APPLE_GUJARATI:
+ case RTL_TEXTENCODING_APPLE_GURMUKHI:
+ case RTL_TEXTENCODING_APPLE_HEBREW:
+ case RTL_TEXTENCODING_APPLE_ICELAND:
+ case RTL_TEXTENCODING_APPLE_ROMANIAN:
+ case RTL_TEXTENCODING_APPLE_THAI:
+ case RTL_TEXTENCODING_APPLE_TURKISH:
+ case RTL_TEXTENCODING_APPLE_UKRAINIAN:
+ case RTL_TEXTENCODING_APPLE_CHINSIMP:
+ case RTL_TEXTENCODING_APPLE_CHINTRAD:
+ case RTL_TEXTENCODING_APPLE_JAPANESE:
+ case RTL_TEXTENCODING_APPLE_KOREAN:
+ eEnd = LINEEND_CR;
+ break;
+ }
+ }
+
+ m_bSaveLineStatus = false;
+ if( eEnd != LineEnd(-1) ) // changed?
+ {
+ if( eOldEnd != eEnd )
+ SetCRLF( eEnd );
+ }
+ else
+ {
+ // restore old user choice (not the automatic!)
+ m_xCRLF_RB->set_state(m_xCRLF_RB->get_saved_state());
+ m_xCR_RB->set_state(m_xCR_RB->get_saved_state());
+ m_xLF_RB->set_state(m_xLF_RB->get_saved_state());
+ }
+ m_bSaveLineStatus = true;
+
+ if (nOldLng != nLng && m_xFontLB->get_visible())
+ m_xLanguageLB->set_active_id(nLng);
+
+ UpdateIncludeBOMSensitiveState();
+}
+
+IMPL_LINK(SwAsciiFilterDlg, LineEndHdl, weld::Toggleable&, rBtn, void)
+{
+ if (m_bSaveLineStatus)
+ rBtn.save_state();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */