summaryrefslogtreecommitdiff
path: root/writerperfect/source
diff options
context:
space:
mode:
Diffstat (limited to 'writerperfect/source')
-rw-r--r--writerperfect/source/calc/MSWorksCalcImportFilter.cxx71
-rw-r--r--writerperfect/source/common/WPFTEncodingDialog.cxx177
-rw-r--r--writerperfect/source/writer/MSWorksImportFilter.cxx34
3 files changed, 275 insertions, 7 deletions
diff --git a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx
index d8976389ded0..f68b4a00eab6 100644
--- a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx
+++ b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx
@@ -14,6 +14,7 @@
#include <libwps/libwps.h>
+#include "writerperfect/WPFTEncodingDialog.hxx"
#include "MSWorksCalcImportFilter.hxx"
using com::sun::star::uno::Sequence;
@@ -26,18 +27,78 @@ using com::sun::star::uno::XComponentContext;
bool MSWorksCalcImportFilter::doImportDocument(librevenge::RVNGInputStream &rInput, OdsGenerator &rGenerator, utl::MediaDescriptor &)
{
- return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator);
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
+
+ std::string fileEncoding("");
+ if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT) && needEncoding)
+ {
+ OUString title, encoding;
+ if (creator == libwps::WPS_MSWORKS)
+ {
+ title="Import MsWorks files(libwps)";
+ encoding="CP850";
+ }
+ else if (creator == libwps::WPS_LOTUS)
+ {
+ title="Import Lotus files(libwps)";
+ encoding="CP437";
+ }
+ else if (creator == libwps::WPS_SYMPHONY)
+ {
+ title="Import Symphony files(libwps)";
+ encoding="CP437";
+ }
+ else
+ {
+ title="Import Quattro Pro files(libwps)";
+ encoding="CP437";
+ }
+ try
+ {
+ const ScopedVclPtrInstance<writerperfect::WPFTEncodingDialog> pDlg(nullptr, &title, &encoding);
+ if (pDlg->Execute() == RET_OK)
+ {
+ if (!pDlg->GetEncoding().isEmpty())
+ fileEncoding=pDlg->GetEncoding().toUtf8().getStr();
+ }
+ // we can fail because we are in headless mode, the user has cancelled conversion, ...
+ else if (pDlg->hasUserCalledCancel())
+ return false;
+ }
+ catch (...)
+ {
+ }
+ }
+ return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator, "", fileEncoding.c_str());
}
bool MSWorksCalcImportFilter::doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName)
{
libwps::WPSKind kind = libwps::WPS_TEXT;
- const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind);
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
- if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT))
+ if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && confidence == libwps::WPS_CONFIDENCE_EXCELLENT)
{
- rTypeName = "calc_MS_Works_Document";
- return true;
+ if (creator == libwps::WPS_MSWORKS)
+ {
+ rTypeName = "calc_MS_Works_Document";
+ return true;
+ }
+ if (creator == libwps::WPS_LOTUS || creator == libwps::WPS_SYMPHONY)
+ {
+ rTypeName = "calc_WPS_Lotus_Document";
+ return true;
+ }
+ if (creator == libwps::WPS_QUATTRO_PRO)
+ {
+ rTypeName = "calc_WPS_QPro_Document";
+ return true;
+ }
}
return false;
diff --git a/writerperfect/source/common/WPFTEncodingDialog.cxx b/writerperfect/source/common/WPFTEncodingDialog.cxx
new file mode 100644
index 000000000000..4e04304a5247
--- /dev/null
+++ b/writerperfect/source/common/WPFTEncodingDialog.cxx
@@ -0,0 +1,177 @@
+/* -*- 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 <writerperfect/WPFTEncodingDialog.hxx>
+
+namespace writerperfect
+{
+
+namespace
+{
+
+struct EncodingImplementation
+{
+
+ static OUString const(s_encodings[]);
+
+ static int numEncodings();
+ static void insertEncodings(ListBox *box);
+ static void selectEncoding(ListBox *box, const OUString *encoding);
+ static OUString getEncoding(ListBox *box);
+};
+
+OUString const(EncodingImplementation::s_encodings[])=
+{
+ "MacArabic", "Arabic (Apple Macintosh)",
+ "CP864", "Arabic (DOS/OS2-864)",
+ "CP1006", "Arabic (IBM-1006)",
+ "CP1256", "Arabic (Windows-1256)",
+ "CP775", "Baltic (DOS/OS2-775)",
+ "CP1257", "Baltic (Windows-1257)",
+ "MacCeltic", "Celtic (Apple Macintosh)",
+ "MacCyrillic", "Cyrillic (Apple Macintosh)",
+ "CP855", "Cyrillic (DOS/OS2-855)",
+ "CP866", "Cyrillic (DOS/OS2-866/Russian)",
+ "CP1251", "Cyrillic (Windows-1251)",
+ "MacCEurope", "Eastern Europe (Apple Macintosh)",
+ "MacCroatian", "Eastern Europe (Apple Macintosh/Croatian)",
+ "MacRomanian", "Eastern Europe (Apple Macintosh/Romanian)",
+ "CP852", "Eastern Europe (DOS/OS2-852)",
+ "CP1250", "Eastern Europe (Windows-1250/WinLatin 2)",
+ "MacGreek", "Greek (Apple Macintosh)",
+ "CP737", "Greek (DOS/OS2-737)",
+ "CP869", "Greek (DOS/OS2-869/Greek-2)",
+ "CP875", "Greek (DOS/OS2-875)",
+ "CP1253", "Greek (Windows-1253)",
+ "MacHebrew", "Hebrew (Apple Macintosh)",
+ "CP424", "Hebrew (DOS/OS2-424)",
+ "CP856", "Hebrew (DOS/OS2-856)",
+ "CP862", "Hebrew (DOS/OS2-862)",
+ "CP1255", "Hebrew (Windows-1255)",
+ "CP500", "International (DOS/OS2-500)",
+ "MacThai", "Thai (Apple Macintosh)",
+ "CP874", "Thai (DOS/OS2-874)",
+ "MacTurkish", "Turkish (Apple Macintosh)",
+ "CP857", "Turkish (DOS/OS2-857)",
+ "CP1026", "Turkish (DOS/OS2-1026)",
+ "CP1254", "Turkish (Windows-1254)",
+ "CP1258", "Vietnamese (Windows-1258)",
+ "MacRoman", "Western Europe (Apple Macintosh)",
+ "MacIceland", "Western Europe (Apple Macintosh/Icelandic)",
+ "CP037", "Western Europe (DOS/OS2-037/US-Canada)",
+ "CP437", "Western Europe (DOS/OS2-437/US)",
+ "CP850", "Western Europe (DOS/OS2-850)",
+ "CP860", "Western Europe (DOS/OS2-860/Portuguese)",
+ "CP861", "Western Europe (DOS/OS2-861/Icelandic)",
+ "CP863", "Western Europe (DOS/OS2-863/French)",
+ "CP865", "Western Europe (DOS/OS2-865/Nordic)",
+ "CP1252", "Western Europe (Windows-1252/WinLatin 1)"
+};
+
+int EncodingImplementation::numEncodings()
+{
+ return int(sizeof(s_encodings)/(2*sizeof(const OUString *)));
+}
+
+void EncodingImplementation::insertEncodings(ListBox *box)
+{
+ sal_IntPtr num=sal_IntPtr(numEncodings());
+ for (sal_IntPtr i=0; i<num; ++i)
+ {
+ sal_IntPtr nAt=box->InsertEntry(s_encodings[2*i+1]);
+ box->SetEntryData(nAt, reinterpret_cast<void *>(i));
+ }
+}
+
+void EncodingImplementation::selectEncoding(ListBox *box, const OUString *encoding)
+{
+ if (!encoding)
+ return;
+ sal_IntPtr num=sal_IntPtr(numEncodings());
+ for (sal_IntPtr i=0; i<num; ++i)
+ {
+ if (*encoding!=s_encodings[2*i]) continue;
+ box->SelectEntryPos(i);
+ return;
+ }
+}
+
+OUString EncodingImplementation::getEncoding(ListBox *box)
+{
+ sal_IntPtr pos=(sal_IntPtr) box->GetSelectEntryData();
+ if (pos<0||pos>=numEncodings())
+ return OUString();
+ return s_encodings[2*pos];
+}
+
+}
+
+WPFTEncodingDialog::WPFTEncodingDialog(
+ vcl::Window *pParent,
+ const OUString *pStrTitle,
+ const OUString *encoding)
+ : ModalDialog(pParent, "WPFTEncodingDialog", "writerperfect/ui/WPFTEncodingDialog.ui"),
+ m_pLbCharset(), m_pBtnOk(), m_pBtnCancel(), m_userHasCancelled(false)
+{
+ get(m_pLbCharset, "comboboxtext");
+ get(m_pBtnOk, "ok");
+ get(m_pBtnCancel, "cancel");
+
+ m_pBtnCancel->SetClickHdl(LINK(this, WPFTEncodingDialog, CancelHdl));
+
+ EncodingImplementation::insertEncodings(m_pLbCharset);
+ m_pLbCharset->SetStyle(m_pLbCharset->GetStyle() | WB_SORT);
+ // m_pLbCharset->set_height_request(6 * m_pLbCharset->GetTextHeight());
+ m_pLbCharset->SetDoubleClickHdl(LINK(this, WPFTEncodingDialog, DoubleClickHdl));
+ if (encoding)
+ EncodingImplementation::selectEncoding(m_pLbCharset, encoding);
+ m_pLbCharset->Show();
+
+ if (pStrTitle)
+ SetText(*pStrTitle);
+}
+
+WPFTEncodingDialog::~WPFTEncodingDialog()
+{
+}
+
+OUString WPFTEncodingDialog::GetEncoding() const
+{
+ return EncodingImplementation::getEncoding(m_pLbCharset);
+}
+
+IMPL_LINK_NOARG(WPFTEncodingDialog, CancelHdl)
+{
+ m_userHasCancelled=true;
+ Close();
+ return 0;
+}
+
+IMPL_LINK(WPFTEncodingDialog, DoubleClickHdl, ListBox *, pLb)
+{
+ if (pLb == m_pLbCharset)
+ {
+ m_pBtnOk->Click();
+ }
+ return 0;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/MSWorksImportFilter.cxx b/writerperfect/source/writer/MSWorksImportFilter.cxx
index 61c54f5779b4..f06a21a08ee6 100644
--- a/writerperfect/source/writer/MSWorksImportFilter.cxx
+++ b/writerperfect/source/writer/MSWorksImportFilter.cxx
@@ -9,11 +9,13 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+#include <boost/scoped_ptr.hpp>
#include <com/sun/star/uno/Reference.h>
#include <cppuhelper/supportsservice.hxx>
#include <libwps/libwps.h>
+#include "writerperfect/WPFTEncodingDialog.hxx"
#include "MSWorksImportFilter.hxx"
using com::sun::star::uno::Sequence;
@@ -33,13 +35,41 @@ static bool handleEmbeddedWKSObject(const librevenge::RVNGBinaryData &data, OdfD
bool MSWorksImportFilter::doImportDocument(librevenge::RVNGInputStream &rInput, OdtGenerator &rGenerator, utl::MediaDescriptor &)
{
- return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator);
+ libwps::WPSKind kind = libwps::WPS_TEXT;
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
+
+ std::string fileEncoding("");
+ try
+ {
+ if ((kind == libwps::WPS_TEXT) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT) && needEncoding)
+ {
+ OUString title("Import MsWorks files(libwps)");
+ OUString encoding("CP850");
+ const ScopedVclPtrInstance<writerperfect::WPFTEncodingDialog> pDlg(nullptr, &title, &encoding);
+ if (pDlg->Execute() == RET_OK)
+ {
+ if (!pDlg->GetEncoding().isEmpty())
+ fileEncoding=pDlg->GetEncoding().toUtf8().getStr();
+ }
+ // we can fail because we are in headless mode, the user has cancelled conversion, ...
+ else if (pDlg->hasUserCalledCancel())
+ return false;
+ }
+ }
+ catch (...)
+ {
+ }
+ return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator, "", fileEncoding.c_str());
}
bool MSWorksImportFilter::doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName)
{
libwps::WPSKind kind = libwps::WPS_TEXT;
- const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind);
+ libwps::WPSCreator creator;
+ bool needEncoding;
+ const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
if ((kind == libwps::WPS_TEXT) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT))
{