[Libreoffice-commits] core.git: include/svx svx/source
Tomaž Vajngerl
tomaz.vajngerl at collabora.co.uk
Thu Nov 2 06:29:54 UTC 2017
include/svx/ClassificationDialog.hxx | 13 +
svx/source/dialog/ClassificationDialog.cxx | 206 +++++++++++++++++++++++++++++
2 files changed, 217 insertions(+), 2 deletions(-)
New commits:
commit a0a287f566e548177847bdb69cba230089b44e54
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Wed Nov 1 12:53:03 2017 +0900
TSCP: read/write recently used in advanced classification dialog
This implements the reading and writing of the recently used
content in the advanced classification dialog. The recently used
content is stored to a xml file in the user profile folder under
"classification" folder - filename "recentlyUsed.xml". The content
is just a reflection of the resulting ClassificationResult vector
in a simple xml form.
Change-Id: If148ae123a6c826874b86dc1f374cdaab6e8fea9
Reviewed-on: https://gerrit.libreoffice.org/44150
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/include/svx/ClassificationDialog.hxx b/include/svx/ClassificationDialog.hxx
index 19e869a5f74d..a7825fef4a53 100644
--- a/include/svx/ClassificationDialog.hxx
+++ b/include/svx/ClassificationDialog.hxx
@@ -51,10 +51,19 @@ private:
void insertField(ClassificationType eType, OUString const & rString, OUString const & rFullString);
+ std::vector<std::vector<ClassificationResult>> m_aRecentlyUsedValuesCollection;
+ std::vector<ClassificationResult> m_aInitialValues;
+
+ void readIn(std::vector<ClassificationResult> const & rInput);
+ void readRecentlyUsed();
+ void writeRecentlyUsed();
+
public:
ClassificationDialog(vcl::Window* pParent, bool bPerParagraph, const std::function<void()>& rParagraphSignHandler = [](){});
- virtual ~ClassificationDialog() override;
- virtual void dispose() override;
+ ~ClassificationDialog() override;
+
+ void dispose() override;
+ short Execute() override;
std::vector<ClassificationResult> getResult();
void setupValues(std::vector<ClassificationResult> const & rInput);
diff --git a/svx/source/dialog/ClassificationDialog.cxx b/svx/source/dialog/ClassificationDialog.cxx
index f99d4f97bd0c..db5e7639ef9c 100644
--- a/svx/source/dialog/ClassificationDialog.cxx
+++ b/svx/source/dialog/ClassificationDialog.cxx
@@ -16,6 +16,13 @@
#include <editeng/wghtitem.hxx>
#include <svl/itemset.hxx>
+#include <osl/file.hxx>
+#include <rtl/bootstrap.hxx>
+#include <rtl/uri.hxx>
+#include <config_folders.h>
+#include <tools/XmlWriter.hxx>
+#include <tools/XmlWalker.hxx>
+
namespace svx {
namespace {
@@ -30,6 +37,30 @@ const SvxFieldItem* findField(editeng::Section const & rSection)
return nullptr;
}
+bool fileExists(OUString const & sFilename)
+{
+ osl::File aFile(sFilename);
+ osl::FileBase::RC eRC = aFile.open(osl_File_OpenFlag_Read);
+ return osl::FileBase::E_None == eRC;
+}
+
+bool stringToclassificationType(OString const & rsType, svx::ClassificationType & reType)
+{
+ if (rsType == "CATEGORY")
+ reType = svx::ClassificationType::CATEGORY;
+ else if (rsType == "INTELLECTUAL_PROPERTY_PART")
+ reType = svx::ClassificationType::INTELLECTUAL_PROPERTY_PART;
+ else if (rsType == "MARKING")
+ reType = svx::ClassificationType::MARKING;
+ else if (rsType == "PARAGRAPH")
+ reType = svx::ClassificationType::PARAGRAPH;
+ else if (rsType == "TEXT")
+ reType = svx::ClassificationType::TEXT;
+ else
+ return false;
+ return true;
+}
+
} // end anonymous namespace
ClassificationDialog::ClassificationDialog(vcl::Window* pParent, const bool bPerParagraph, const std::function<void()>& rParagraphSignHandler)
@@ -103,6 +134,19 @@ void ClassificationDialog::dispose()
ModalDialog::dispose();
}
+short ClassificationDialog::Execute()
+{
+ readRecentlyUsed();
+ readIn(m_aInitialValues);
+
+ short nResult = ModalDialog::Execute();
+ if (nResult == RET_OK)
+ {
+ writeRecentlyUsed();
+ }
+ return nResult;
+}
+
void ClassificationDialog::insertField(ClassificationType eType, OUString const & rString, OUString const & rFullString)
{
ClassificationField aField(eType, rString, rFullString);
@@ -111,6 +155,168 @@ void ClassificationDialog::insertField(ClassificationType eType, OUString const
void ClassificationDialog::setupValues(std::vector<ClassificationResult> const & rInput)
{
+ m_aInitialValues = rInput;
+}
+
+void ClassificationDialog::readRecentlyUsed()
+{
+ OUString sPath("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/user/classification/");
+ rtl::Bootstrap::expandMacros(sPath);
+
+ OUString sFilePath(sPath + "recentlyUsed.xml");
+
+ if (!fileExists(sFilePath))
+ return;
+
+ SvFileStream aFileStream(sFilePath, StreamMode::READ);
+ tools::XmlWalker aWalker;
+ if (!aWalker.open(&aFileStream))
+ return;
+
+ if (aWalker.name() == "recentlyUsedClassifications")
+ {
+ aWalker.children();
+ while (aWalker.isValid())
+ {
+ if (aWalker.name() == "elementGroup")
+ {
+ std::vector<ClassificationResult> aResults;
+
+ aWalker.children();
+
+ while (aWalker.isValid())
+ {
+ if (aWalker.name() == "element")
+ {
+ svx::ClassificationType eType = svx::ClassificationType::TEXT;
+ OUString sString;
+ OUString sAbbreviatedString;
+
+ // Convert string to classification type, but continue only if
+ // conversion was successful.
+ if (stringToclassificationType(aWalker.attribute("type"), eType))
+ {
+ aWalker.children();
+
+ while (aWalker.isValid())
+ {
+ if (aWalker.name() == "string")
+ {
+ sString = OStringToOUString(aWalker.content(), RTL_TEXTENCODING_UTF8);
+ }
+ else if (aWalker.name() == "abbreviatedString")
+ {
+ sAbbreviatedString = OStringToOUString(aWalker.content(), RTL_TEXTENCODING_UTF8);
+ }
+ aWalker.next();
+ }
+ aWalker.parent();
+
+ aResults.push_back({ eType, sString, sAbbreviatedString });
+ }
+ }
+ aWalker.next();
+ }
+ aWalker.parent();
+ m_aRecentlyUsedValuesCollection.push_back(aResults);
+ }
+ aWalker.next();
+ }
+ aWalker.parent();
+ }
+}
+
+void ClassificationDialog::writeRecentlyUsed()
+{
+ OUString sPath("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/user/classification/");
+ rtl::Bootstrap::expandMacros(sPath);
+ osl::Directory::createPath(sPath);
+
+ OUString sFilePath(sPath + "recentlyUsed.xml");
+
+ std::unique_ptr<SvStream> pStream;
+ pStream.reset(new SvFileStream(sFilePath, StreamMode::STD_READWRITE | StreamMode::TRUNC));
+
+ tools::XmlWriter aXmlWriter(pStream.get());
+
+ if (!aXmlWriter.startDocument())
+ return;
+
+ aXmlWriter.startElement("recentlyUsedClassifications");
+
+ aXmlWriter.startElement("elementGroup");
+
+ for (ClassificationResult const & rResult : getResult())
+ {
+ aXmlWriter.startElement("element");
+ OUString sType;
+ switch(rResult.meType)
+ {
+ case svx::ClassificationType::CATEGORY:
+ sType = "CATEGORY"; break;
+ case svx::ClassificationType::MARKING:
+ sType = "MARKING"; break;
+ case svx::ClassificationType::TEXT:
+ sType = "TEXT"; break;
+ case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART:
+ sType = "INTELLECTUAL_PROPERTY_PART"; break;
+ case svx::ClassificationType::PARAGRAPH:
+ sType = "PARAGRAPH"; break;
+ }
+ aXmlWriter.attribute("type", sType);
+ aXmlWriter.startElement("string");
+ aXmlWriter.content(rResult.msString);
+ aXmlWriter.endElement();
+ aXmlWriter.startElement("abbreviatedString");
+ aXmlWriter.content(rResult.msAbbreviatedString);
+ aXmlWriter.endElement();
+ aXmlWriter.endElement();
+ }
+ aXmlWriter.endElement();
+
+ if (m_aRecentlyUsedValuesCollection.size() >= 5)
+ m_aRecentlyUsedValuesCollection.pop_back();
+
+ for (std::vector<ClassificationResult> const & rResultCollection : m_aRecentlyUsedValuesCollection)
+ {
+ aXmlWriter.startElement("elementGroup");
+
+ for (ClassificationResult const & rResult : rResultCollection)
+ {
+ aXmlWriter.startElement("element");
+ OUString sType;
+ switch(rResult.meType)
+ {
+ case svx::ClassificationType::CATEGORY:
+ sType = "CATEGORY"; break;
+ case svx::ClassificationType::MARKING:
+ sType = "MARKING"; break;
+ case svx::ClassificationType::TEXT:
+ sType = "TEXT"; break;
+ case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART:
+ sType = "INTELLECTUAL_PROPERTY_PART"; break;
+ case svx::ClassificationType::PARAGRAPH:
+ sType = "PARAGRAPH"; break;
+ }
+ aXmlWriter.attribute("type", sType);
+ aXmlWriter.startElement("string");
+ aXmlWriter.content(rResult.msString);
+ aXmlWriter.endElement();
+ aXmlWriter.startElement("abbreviatedString");
+ aXmlWriter.content(rResult.msAbbreviatedString);
+ aXmlWriter.endElement();
+ aXmlWriter.endElement();
+ }
+ aXmlWriter.endElement();
+ }
+
+ aXmlWriter.endElement();
+
+ aXmlWriter.endDocument();
+}
+
+void ClassificationDialog::readIn(std::vector<ClassificationResult> const & rInput)
+{
sal_Int32 nParagraph = -1;
for (ClassificationResult const & rClassificationResult : rInput)
{
More information about the Libreoffice-commits
mailing list