[Libreoffice-commits] core.git: 4 commits - desktop/qa desktop/source include/LibreOfficeKit
Jan Holesovsky
kendy at collabora.com
Thu Feb 11 14:15:44 UTC 2016
desktop/qa/desktop_lib/test_desktop_lib.cxx | 42 +++++++++++++++++++++++++--
desktop/source/lib/init.cxx | 43 ++++++++++++++++++++++++++--
include/LibreOfficeKit/LibreOfficeKit.hxx | 5 +++
3 files changed, 85 insertions(+), 5 deletions(-)
New commits:
commit cfa9404319ac5310dc772b3b4a9a3d05721e6940
Author: Jan Holesovsky <kendy at collabora.com>
Date: Thu Feb 11 14:34:07 2016 +0100
lok: Extend the StatusModified unit test with Save As.
Change-Id: Ie9bbce6892fe1dcf55e23028e68037f996d7c71f
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 705fa24..1d6c562 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -644,10 +644,10 @@ void DesktopLOKTest::testModifiedStatus()
pDocument->pClass->initializeForRendering(pDocument, nullptr);
pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
- // Set the document as modified.
+ // Type "t" and check that the document was set as modified
+ m_bModified = false;
m_aStateChangedCondition.reset();
- uno::Reference<util::XModifiable> xModifiable(mxComponent, uno::UNO_QUERY);
- xModifiable->setModified(true);
+ pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 't', 0);
TimeValue aTimeValue = { 2 , 0 }; // 2 seconds max
m_aStateChangedCondition.wait(aTimeValue);
Scheduler::ProcessEventsToIdle();
@@ -655,6 +655,42 @@ void DesktopLOKTest::testModifiedStatus()
// This was false, there was no callback about the modified status change.
CPPUNIT_ASSERT(m_bModified);
+ // Perform SaveAs with "TakeOwnership" option set, and check that the
+ // modification state was reset
+ m_aStateChangedCondition.reset();
+ utl::TempFile aTempFile;
+ //aTempFile.EnableKillingFile();
+ CPPUNIT_ASSERT(pDocument->pClass->saveAs(pDocument, aTempFile.GetURL().toUtf8().getStr(), "odt", "TakeOwnership"));
+ m_aStateChangedCondition.wait(aTimeValue);
+ Scheduler::ProcessEventsToIdle();
+
+ // There was no callback about the modified status change.
+ CPPUNIT_ASSERT(!m_bModified);
+
+ // Modify the document again
+ m_bModified = false;
+ m_aStateChangedCondition.reset();
+ pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 't', 0);
+ m_aStateChangedCondition.wait(aTimeValue);
+ Scheduler::ProcessEventsToIdle();
+
+ // There was no callback about the modified status change.
+ CPPUNIT_ASSERT(m_bModified);
+
+ /*
+ // TODO: move this to a test where LOK is fully bootstrapped, so that we can
+ // get back the notification about ".uno:Save" too
+ // Now perform a normal "Save", and check the modified state was reset
+ // again
+ m_aStateChangedCondition.reset();
+ pDocument->pClass->postUnoCommand(pDocument, ".uno:Save", nullptr, false);
+ m_aStateChangedCondition.wait(aTimeValue);
+ Scheduler::ProcessEventsToIdle();
+
+ // There was no callback about the modified status change.
+ CPPUNIT_ASSERT(!m_bModified);
+ */
+
comphelper::LibreOfficeKit::setActive(false);
}
commit 645ec0a7498932d4f1767353a89576cdf33f9c23
Author: Jan Holesovsky <kendy at collabora.com>
Date: Thu Feb 11 10:35:37 2016 +0100
lok: Only add interaction handler when LOK fully initialized.
Necessary for unit testing.
Change-Id: I8db8b4c469864a915a00f8d8c4932634d74f11a7
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index c6e288e..e236595 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1128,7 +1128,7 @@ static void doc_postUnoCommand(LibreOfficeKitDocument* pThis, const char* pComma
std::vector<beans::PropertyValue> aPropertyValuesVector(jsonToPropertyValuesVector(pArguments));
// handle potential interaction
- if (aCommand == ".uno:Save")
+ if (gImpl && aCommand == ".uno:Save")
{
rtl::Reference<LOKInteractionHandler> const pInteraction(
new LOKInteractionHandler(::comphelper::getProcessComponentContext(), "save", gImpl, pDocument));
commit a121074cbd07939713e169586469b934aedbe594
Author: Jan Holesovsky <kendy at collabora.com>
Date: Wed Feb 10 13:26:50 2016 +0100
lok: Introduce a "TakeOwnership" filter option for saveAs().
It is consumed by the saveAs() itself, and when provided, the document
identity changes to the provided pUrl - meaning that '.uno:ModifiedStatus' is
triggered as with the "Save As..." in the UI.
This mode must not be used when saving to PNG or PDF.
Change-Id: I11b5aa814476a8dcab9eac5202bd052828ebbd96
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 4e75258..c6e288e 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -658,6 +658,30 @@ static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* sUrl, const cha
OUString aFilterOptions = getUString(pFilterOptions);
+ // 'TakeOwnership' == this is a 'real' SaveAs (that is, the document
+ // gets a new name). When this is not provided, the meaning of
+ // saveAs() is more like save-a-copy, which allows saving to any
+ // random format like PDF or PNG.
+ // It is not a real filter option, so we have to filter it out.
+ bool bTakeOwnership = false;
+ int nIndex = -1;
+ if (aFilterOptions == "TakeOwnership")
+ {
+ bTakeOwnership = true;
+ aFilterOptions = "";
+ }
+ else if ((nIndex = aFilterOptions.indexOf(",TakeOwnership")) >= 0 || (nIndex = aFilterOptions.indexOf("TakeOwnership,")) >= 0)
+ {
+ OUString aFiltered;
+ if (nIndex > 0)
+ aFiltered = aFilterOptions.copy(0, nIndex);
+ if (nIndex + 14 < aFilterOptions.getLength())
+ aFiltered = aFiltered + aFilterOptions.copy(nIndex + 14);
+
+ bTakeOwnership = true;
+ aFilterOptions = aFiltered;
+ }
+
MediaDescriptor aSaveMediaDescriptor;
aSaveMediaDescriptor["Overwrite"] <<= sal_True;
aSaveMediaDescriptor["FilterName"] <<= aFilterName;
@@ -675,7 +699,11 @@ static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* sUrl, const cha
}
uno::Reference<frame::XStorable> xStorable(pDocument->mxComponent, uno::UNO_QUERY_THROW);
- xStorable->storeToURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList());
+
+ if (bTakeOwnership)
+ xStorable->storeAsURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList());
+ else
+ xStorable->storeToURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList());
return true;
}
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index 7837904..9e18df0 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -48,6 +48,11 @@ public:
* @param pUrl the location where to store the document
* @param pFormat the format to use while exporting, when omitted, then deducted from pURL's extension
* @param pFilterOptions options for the export filter, e.g. SkipImages.
+ * Another useful FilterOption is "TakeOwnership". It is consumed
+ * by the saveAs() itself, and when provided, the document identity
+ * changes to the provided pUrl - meaning that '.uno:ModifiedStatus'
+ * is triggered as with the "Save As..." in the UI.
+ * "TakeOwnership" mode must not be used when saving to PNG or PDF.
*/
inline bool saveAs(const char* pUrl, const char* pFormat = NULL, const char* pFilterOptions = NULL)
{
commit d11bf83b3f28fccdaac4c90dfb283b47f3617a7d
Author: Jan Holesovsky <kendy at collabora.com>
Date: Mon Feb 8 20:09:37 2016 +0100
lok: Interaction handler for saveAs() too.
The LOK does not have to be fully initialized, eg. during the unit tests,
don't use the interaction handler in such a case.
Change-Id: I11bb8db37c92b05e2c1ad06e1a6632db7fb0ea60
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index eaac992..4e75258 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -663,6 +663,17 @@ static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* sUrl, const cha
aSaveMediaDescriptor["FilterName"] <<= aFilterName;
aSaveMediaDescriptor[MediaDescriptor::PROP_FILTEROPTIONS()] <<= aFilterOptions;
+ // add interaction handler too
+ if (gImpl)
+ {
+ // gImpl does not have to exist when running from a unit test
+ rtl::Reference<LOKInteractionHandler> const pInteraction(
+ new LOKInteractionHandler(::comphelper::getProcessComponentContext(), "saveas", gImpl, pDocument));
+ uno::Reference<task::XInteractionHandler2> const xInteraction(pInteraction.get());
+
+ aSaveMediaDescriptor[MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= xInteraction;
+ }
+
uno::Reference<frame::XStorable> xStorable(pDocument->mxComponent, uno::UNO_QUERY_THROW);
xStorable->storeToURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList());
More information about the Libreoffice-commits
mailing list