[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.3' - 42 commits - configmgr/source configure.ac desktop/qa desktop/source distro-configs/CPLinux.conf download.lst external/Module_external.mk external/more_fonts external/noto_font include/LibreOfficeKit libreofficekit/qa libreofficekit/README Makefile.fetch oox/source readlicense_oo/license scp2/source sc/qa sc/source sd/CppunitTest_sd_tiledrendering.mk sd/inc sd/qa sd/sdi sd/source setup_native/source sfx2/source svx/sdi sw/inc sw/source

Katarina Behrens Katarina.Behrens at cib.de
Tue Feb 28 10:46:02 UTC 2017


 Makefile.fetch                                        |    4 
 configmgr/source/components.cxx                       |    4 
 configure.ac                                          |   20 
 desktop/qa/data/blank_presentation.odp                |binary
 desktop/qa/data/sheets.ods                            |binary
 desktop/qa/desktop_lib/test_desktop_lib.cxx           |  144 
 desktop/source/lib/init.cxx                           |   89 
 distro-configs/CPLinux.conf                           |    1 
 download.lst                                          |    3 
 external/Module_external.mk                           |    1 
 external/more_fonts/ExternalPackage_karla.mk          |   19 
 external/more_fonts/Module_more_fonts.mk              |    2 
 external/more_fonts/UnpackedTarball_karla.mk          |   14 
 external/noto_font/ExternalPackage_noto.mk            |  230 
 external/noto_font/Makefile                           |    7 
 external/noto_font/Module_noto_font.mk                |   17 
 external/noto_font/README                             |    1 
 external/noto_font/UnpackedTarball_noto.mk            |   14 
 include/LibreOfficeKit/LibreOfficeKit.h               |    2 
 include/LibreOfficeKit/LibreOfficeKit.hxx             |   13 
 libreofficekit/README                                 |    7 
 libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx   |   52 
 oox/source/export/drawingml.cxx                       |   13 
 readlicense_oo/license/LICENSE                        |   26 
 readlicense_oo/license/LICENSE.fodt                   |  810 -
 readlicense_oo/license/LICENSE.html                   |10032 +++++++++++++++++-
 sc/qa/unit/tiledrendering/tiledrendering.cxx          |  100 
 sc/source/ui/unoobj/docuno.cxx                        |    2 
 sc/source/ui/view/gridwin4.cxx                        |   10 
 scp2/source/ooo/file_font_ooo.scp                     |    8 
 scp2/source/ooo/module_hidden_ooo.scp                 |   14 
 sd/CppunitTest_sd_tiledrendering.mk                   |    1 
 sd/inc/Annotation.hxx                                 |    4 
 sd/qa/unit/tiledrendering/data/tdf105502.odp          |binary
 sd/qa/unit/tiledrendering/data/tdf81754.pptx          |binary
 sd/qa/unit/tiledrendering/tiledrendering.cxx          |  251 
 sd/sdi/drviewsh.sdi                                   |    5 
 sd/source/core/annotations/Annotation.cxx             |   24 
 sd/source/filter/html/htmlex.cxx                      |   16 
 sd/source/ui/annotations/annotationmanager.cxx        |  234 
 sd/source/ui/annotations/annotationmanagerimpl.hxx    |    5 
 sd/source/ui/inc/View.hxx                             |    3 
 sd/source/ui/inc/unomodel.hxx                         |    2 
 sd/source/ui/remotecontrol/BluetoothServer.cxx        |    2 
 sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx |    2 
 sd/source/ui/unoidl/unomodel.cxx                      |   50 
 setup_native/source/packinfo/package_names.txt        |    1 
 setup_native/source/packinfo/packinfo_office.txt      |   15 
 sfx2/source/appl/macroloader.cxx                      |   18 
 sfx2/source/control/dispatch.cxx                      |    5 
 sfx2/source/control/unoctitm.cxx                      |    1 
 svx/sdi/svx.sdi                                       |    4 
 sw/inc/format.hxx                                     |    2 
 sw/inc/ftninfo.hxx                                    |    2 
 sw/inc/lineinfo.hxx                                   |    2 
 sw/inc/ndindex.hxx                                    |    2 
 sw/inc/pagedesc.hxx                                   |    2 
 sw/inc/section.hxx                                    |    2 
 sw/inc/tox.hxx                                        |    2 
 sw/inc/txtatr.hxx                                     |    2 
 sw/inc/unosett.hxx                                    |    4 
 sw/inc/unostyle.hxx                                   |    2 
 sw/inc/usrfld.hxx                                     |    2 
 sw/source/core/inc/frmtool.hxx                        |    8 
 sw/source/core/layout/frmtool.cxx                     |    6 
 sw/source/core/text/frmform.cxx                       |    4 
 sw/source/uibase/uno/unotxdoc.cxx                     |    2 
 67 files changed, 11700 insertions(+), 646 deletions(-)

New commits:
commit cf1b71694fc921195b572dd906d71d70b0608044
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Sun Feb 19 23:58:52 2017 +0100

    Run macro:// via LOKit
    
    Change-Id: I54d3c734d86d4b44e1dfe1ad7728e2f51cd26d53
    Reviewed-on: https://gerrit.libreoffice.org/34538
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit e7729f458409f7fef2b7dab752205e3b230acb65)

diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index eb8017e..0f2d41c 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -112,6 +112,7 @@ public:
     void testCommentsCalc();
     void testCommentsImpress();
     void testCommentsCallbacksWriter();
+    void testRunMacro();
 
     CPPUNIT_TEST_SUITE(DesktopLOKTest);
     CPPUNIT_TEST(testGetStyles);
@@ -151,6 +152,7 @@ public:
     CPPUNIT_TEST(testCommentsCalc);
     CPPUNIT_TEST(testCommentsImpress);
     CPPUNIT_TEST(testCommentsCallbacksWriter);
+    CPPUNIT_TEST(testRunMacro);
     CPPUNIT_TEST_SUITE_END();
 
     uno::Reference<lang::XComponent> mxComponent;
@@ -2145,6 +2147,19 @@ void DesktopLOKTest::testCommentsCallbacksWriter()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void DesktopLOKTest::testRunMacro()
+{
+    LibLibreOffice_Impl aOffice;
+    bool bGoodMacro, bNonExistentMacro;
+
+    // Tools macros come pre-installed in system share/basic folder,
+    bGoodMacro = aOffice.m_pOfficeClass->runMacro(&aOffice, OString("macro:///Tools.Debug.ActivateReadOnlyFlag()").getStr());
+    CPPUNIT_ASSERT(bGoodMacro);
+
+    bNonExistentMacro = aOffice.m_pOfficeClass->runMacro(&aOffice, OString("macro:///I.Am.Not(There)").getStr());
+    CPPUNIT_ASSERT(!bNonExistentMacro);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 46d5aa4..936ca6b 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -40,6 +40,8 @@
 #include <com/sun/star/frame/Desktop.hpp>
 #include <com/sun/star/frame/DispatchResultEvent.hpp>
 #include <com/sun/star/frame/DispatchResultState.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XSynchronousDispatch.hpp>
 #include <com/sun/star/frame/XStorable.hpp>
 #include <com/sun/star/lang/Locale.hpp>
 #include <com/sun/star/lang/XComponent.hpp>
@@ -1058,6 +1060,7 @@ static void doc_destroy(LibreOfficeKitDocument *pThis)
 static void                    lo_destroy       (LibreOfficeKit* pThis);
 static int                     lo_initialize    (LibreOfficeKit* pThis, const char* pInstallPath, const char* pUserProfilePath);
 static LibreOfficeKitDocument* lo_documentLoad  (LibreOfficeKit* pThis, const char* pURL);
+static bool                    lo_runMacro      (LibreOfficeKit* pThis, const char* pURL);
 static char *                  lo_getError      (LibreOfficeKit* pThis);
 static void                    lo_freeError     (char* pFree);
 static LibreOfficeKitDocument* lo_documentLoadWithOptions  (LibreOfficeKit* pThis,
@@ -1086,6 +1089,7 @@ LibLibreOffice_Impl::LibLibreOffice_Impl()
 
         m_pOfficeClass->destroy = lo_destroy;
         m_pOfficeClass->documentLoad = lo_documentLoad;
+        m_pOfficeClass->runMacro = lo_runMacro;
         m_pOfficeClass->getError = lo_getError;
         m_pOfficeClass->freeError = lo_freeError;
         m_pOfficeClass->documentLoadWithOptions = lo_documentLoadWithOptions;
@@ -1215,6 +1219,90 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis,
     return nullptr;
 }
 
+static bool lo_runMacro( LibreOfficeKit* pThis, const char *pURL)
+{
+    SolarMutexGuard aGuard;
+
+    LibLibreOffice_Impl* pLib = static_cast<LibLibreOffice_Impl*>(pThis);
+
+    OUString sURL( pURL, strlen(pURL), RTL_TEXTENCODING_UTF8 );
+    if (sURL.isEmpty())
+    {
+        pLib->maLastExceptionMsg = "Macro to run was not provided.";
+        SAL_INFO("lok", "Macro URL is empty");
+        return false;
+    }
+
+    if (!sURL.startsWith("macro://"))
+    {
+        pLib->maLastExceptionMsg = "This doesn't look like macro URL";
+        SAL_INFO("lok", "Macro URL is invalid");
+        return false;
+    }
+
+    pLib->maLastExceptionMsg.clear();
+
+    if (!xContext.is())
+    {
+        pLib->maLastExceptionMsg = "ComponentContext is not available";
+        SAL_INFO("lok", "ComponentContext is not available");
+        return false;
+    }
+
+    util::URL aURL;
+    aURL.Complete = sURL;
+
+    uno::Reference < util::XURLTransformer > xParser( util::URLTransformer::create( xContext ) );
+
+    if( xParser.is() )
+        xParser->parseStrict( aURL );
+
+    uno::Reference<frame::XDesktop2> xComponentLoader = frame::Desktop::create(xContext);
+
+    if (!xComponentLoader.is())
+    {
+        pLib->maLastExceptionMsg = "ComponentLoader is not available";
+        SAL_INFO("lok", "ComponentLoader is not available");
+        return false;
+    }
+
+    xFactory = xContext->getServiceManager();
+
+    if (xFactory.is())
+    {
+        uno::Reference<frame::XDispatchProvider> xDP;
+        xSFactory.set(xFactory, uno::UNO_QUERY_THROW);
+        xDP.set( xSFactory->createInstance("com.sun.star.comp.sfx2.SfxMacroLoader"), uno::UNO_QUERY );
+        uno::Reference<frame::XDispatch> xD = xDP->queryDispatch( aURL, OUString(), 0);
+
+        if (!xD.is())
+        {
+            pLib->maLastExceptionMsg = "Macro loader is not available";
+            SAL_INFO("lok", "Macro loader is not available");
+            return false;
+        }
+
+        uno::Reference < frame::XSynchronousDispatch > xSyncDisp( xD, uno::UNO_QUERY_THROW );
+        uno::Sequence<css::beans::PropertyValue> aEmpty;
+        css::beans::PropertyValue aErr;
+        uno::Any aRet;
+
+        aRet = xSyncDisp->dispatchWithReturnValue( aURL, aEmpty );
+        aRet >>= aErr;
+
+        if (aErr.Name == "ErrorCode")
+        {
+            pLib->maLastExceptionMsg = "An error occured running macro";
+            SAL_INFO("lok", "Macro execution terminated with errors");
+            return false;
+        }
+
+        return true;
+    }
+
+    return false;
+}
+
 static void lo_registerCallback (LibreOfficeKit* pThis,
                                  LibreOfficeKitCallback pCallback,
                                  void* pData)
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 55cff72..da6bba9 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -78,6 +78,8 @@ struct _LibreOfficeKitClass
 
     /// @see lok::Office::getVersionInfo().
     char* (*getVersionInfo) (LibreOfficeKit* pThis);
+
+    bool (*runMacro) (LibreOfficeKit *pThis, const char* pURL);
 #endif
 
 };
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index 46ecb5f..12c0428 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -601,6 +601,19 @@ public:
     {
         return mpThis->pClass->getVersionInfo(mpThis);
     }
+
+    /**
+     * Run a macro.
+     *
+     * Same syntax as on command line is permissible (ie. the macro:// URI forms)
+     *
+     * @param pURL macro url to run
+     */
+
+    inline bool runMacro( const char* pURL)
+    {
+        return mpThis->pClass->runMacro( mpThis, pURL );
+    }
 #endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY
 };
 
diff --git a/sfx2/source/appl/macroloader.cxx b/sfx2/source/appl/macroloader.cxx
index 3ab011f..1d6c8e0 100644
--- a/sfx2/source/appl/macroloader.cxx
+++ b/sfx2/source/appl/macroloader.cxx
@@ -154,7 +154,23 @@ uno::Any SAL_CALL SfxMacroLoader::dispatchWithReturnValue(
         throw (uno::RuntimeException, std::exception)
 {
     uno::Any aRet;
-    loadMacro( aURL.Complete, aRet, GetObjectShell_Impl() );
+    ErrCode nErr = loadMacro( aURL.Complete, aRet, GetObjectShell_Impl() );
+
+    // aRet gets set to a different value only if nErr == ERRCODE_NONE
+    // Return it in such case to preserve the original behaviour
+
+    // In all other cases (nErr != ERRCODE_NONE), the calling code gets
+    // the actual error code back
+    if ( nErr != ERRCODE_NONE )
+    {
+        beans::PropertyValue aErrorCode;
+
+        aErrorCode.Name = "ErrorCode";
+        aErrorCode.Value <<= nErr;
+
+        aRet <<= aErrorCode;
+    }
+
     return aRet;
 }
 
commit 41ed5f82271e61b1d08e3adf42f0995ac4516600
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Mon Feb 27 09:14:41 2017 +0100

    sw: prefix members of SwLayNotify
    
    Change-Id: I40df0def8da88ba2c5719508a9df390e1d391fac
    (cherry picked from commit 74f6850a8ecd839ef76b6eef704fff408d3e639e)

diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx
index 4c8de72..e015957 100644
--- a/sw/source/core/inc/frmtool.hxx
+++ b/sw/source/core/inc/frmtool.hxx
@@ -188,14 +188,14 @@ public:
 
 class SwLayNotify : public SwFrameNotify
 {
-    bool bLowersComplete;
+    bool m_bLowersComplete;
 
 public:
     SwLayNotify( SwLayoutFrame *pLayFrame );
     ~SwLayNotify();
 
-    void SetLowersComplete( bool b ) { bLowersComplete = b; }
-    bool IsLowersComplete()          { return bLowersComplete; }
+    void SetLowersComplete( bool b ) { m_bLowersComplete = b; }
+    bool IsLowersComplete()          { return m_bLowersComplete; }
 };
 
 class SwFlyNotify : public SwLayNotify
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index da17ec9..329c081 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -409,7 +409,7 @@ SwFrameNotify::~SwFrameNotify()
 
 SwLayNotify::SwLayNotify( SwLayoutFrame *pLayFrame ) :
     SwFrameNotify( pLayFrame ),
-    bLowersComplete( false )
+    m_bLowersComplete( false )
 {
 }
 
commit 431520fec6525dbc40d4961f3a13ccc7839613b1
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Feb 24 09:12:41 2017 +0100

    libreofficekit: adapt README to reality
    
    Change-Id: I7098e5c304a0fa945e3d3ba794be2b7932788c74
    (cherry picked from commit 28974126aa02d98b1808fd8fc01bc45f9a407a90)

diff --git a/libreofficekit/README b/libreofficekit/README
index a8396d4..8defd38 100644
--- a/libreofficekit/README
+++ b/libreofficekit/README
@@ -13,10 +13,9 @@ Integrating LOK into other software
 LOK functionality can be accessed by including LibreOfficeKit.h[xx] in your
 program.
 
-LOK initialisation (lok_init) requires the inclusion of LibreOfficeKitInit.h
-in your program. Should you be using the C++ LibreOfficeKit.hxx header you
-must first include LibreOfficeKitInit.h followed by LibreOfficeKit.hxx in any
-files where you need to use lok_cpp_init.
+LOK initialisation (lok_init) requires the inclusion of LibreOfficeKitInit.h in
+your program. If you use the C++ LibreOfficeKit.hxx header, it already includes
+LibreOfficeKitInit.h for you.
 
 (LibreOfficeKit.hxx is a simple and fully inlined C++ wrapper for the same
 functionality as in LibreOfficeKit.h.)
commit 3460e65b97bee4f32b79ccb56628dacdda71c4ae
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Wed Feb 22 19:26:28 2017 +0530

    lok: these are not always plain ascii
    
    Change-Id: I9783b6b2839805189015dbad8a97128c89e0a4a9
    (cherry picked from commit 46b5dff4db336df2ff6496d91b0a2c559c6a9592)

diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index f5149af..ba14902 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -1028,7 +1028,7 @@ OUString ScModelObj::getPostIts()
     std::stringstream aStream;
     boost::property_tree::write_json(aStream, aTree);
 
-    return OUString::createFromAscii(aStream.str().c_str());
+    return OUString::fromUtf8(aStream.str().c_str());
 }
 
 void ScModelObj::initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& /*rArguments*/)
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 67f4e33..3199294 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -2412,7 +2412,7 @@ OUString SdXImpressDocument::getPostIts()
     std::stringstream aStream;
     boost::property_tree::write_json(aStream, aTree);
 
-    return OUString::createFromAscii(aStream.str().c_str());
+    return OUString::fromUtf8(aStream.str().c_str());
 }
 
 void SdXImpressDocument::initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 84c286c..b89e6e8 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3277,7 +3277,7 @@ OUString SwXTextDocument::getPostIts()
     std::stringstream aStream;
     boost::property_tree::write_json(aStream, aTree);
 
-    return OUString::createFromAscii(aStream.str().c_str());
+    return OUString::fromUtf8(aStream.str().c_str());
 }
 
 int SwXTextDocument::getPart()
commit 627da0afeaa27f5f5c7227030dccf2e5c460ad32
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Tue Feb 21 16:05:02 2017 +0530

    sd lok: Support editing annotations by id + unit test
    
    Change-Id: Id4faf59eab8c72a2d78157bca15a5e07f9622dde
    Reviewed-on: https://gerrit.libreoffice.org/34512
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: pranavk <pranavk at collabora.co.uk>
    (cherry picked from commit 1b4ce7cd8e4c1e1732ee6434cadd29cb23583a54)

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index d142921..379f2fe 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -1647,6 +1647,25 @@ void SdTiledRenderingTest::testCommentCallbacks()
     CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
     CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
 
+    // Edit this annotation now
+    aArgs = comphelper::InitPropertySequence(
+    {
+        {"Id", uno::makeAny(OUString::number(nComment1))},
+        {"Text", uno::makeAny(OUString("Edited comment"))},
+    });
+    comphelper::dispatchCommand(".uno:EditAnnotation", aArgs);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get<int>("id"));
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+    CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+    CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+    CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+
     // Delete the comment
     aArgs = comphelper::InitPropertySequence(
     {
diff --git a/sd/sdi/drviewsh.sdi b/sd/sdi/drviewsh.sdi
index 0ae6eea..553843a 100644
--- a/sd/sdi/drviewsh.sdi
+++ b/sd/sdi/drviewsh.sdi
@@ -154,6 +154,11 @@ interface ImpressEditView : DrawView
         ExecMethod = ExecuteAnnotation;
         StateMethod = GetAnnotationState;
     ]
+    SID_EDIT_POSTIT
+    [
+        ExecMethod = ExecuteAnnotation;
+        StateMethod = GetAnnotationState;
+    ]
     SID_REPLYTO_POSTIT
     [
         ExecMethod = ExecuteAnnotation;
diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
index 2184e0c..d9847a1 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -354,6 +354,9 @@ void AnnotationManagerImpl::ExecuteAnnotation(SfxRequest& rReq )
     case SID_DELETEALLBYAUTHOR_POSTIT:
         ExecuteDeleteAnnotation( rReq );
         break;
+    case SID_EDIT_POSTIT:
+        ExecuteEditAnnotation( rReq );
+        break;
     case SID_PREVIOUS_POSTIT:
     case SID_NEXT_POSTIT:
         SelectNextAnnotation( rReq.GetSlot() == SID_NEXT_POSTIT );
@@ -434,6 +437,41 @@ void AnnotationManagerImpl::ExecuteDeleteAnnotation(SfxRequest& rReq)
     UpdateTags();
 }
 
+void AnnotationManagerImpl::ExecuteEditAnnotation(SfxRequest& rReq)
+{
+    const SfxItemSet* pArgs = rReq.GetArgs();
+    Reference< XAnnotation > xAnnotation;
+    sal_uInt32 nId = 0;
+    OUString sText;
+    if (pArgs)
+    {
+        const SfxPoolItem* pPoolItem = nullptr;
+        if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_POSTIT_ID, true, &pPoolItem))
+        {
+            nId = static_cast<const SvxPostItIdItem*>(pPoolItem)->GetValue().toUInt32();
+            xAnnotation = GetAnnotationById(nId);
+        }
+        if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_POSTIT_TEXT, true, &pPoolItem))
+            sText = static_cast<const SfxStringItem*>(pPoolItem)->GetValue();
+
+        if (xAnnotation.is() && !sText.isEmpty())
+        {
+            // TODO: Not allow other authors to change others' comments ?
+            Reference<XText> xText(xAnnotation->getTextRange());
+            xText->setString(sText);
+
+            const SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+            while (pViewShell)
+            {
+                lcl_CommentNotification(CommentNotificationType::Modify, pViewShell, xAnnotation);
+                pViewShell = SfxViewShell::GetNext(*pViewShell);
+            }
+        }
+    }
+
+    UpdateTags(true);
+}
+
 void AnnotationManagerImpl::InsertAnnotation(const OUString& rText)
 {
     SdPage* pPage = GetCurrentPage();
@@ -719,9 +757,13 @@ void AnnotationManagerImpl::GetAnnotationState(SfxItemSet& rSet)
     Reference< XAnnotation > xAnnotation;
     GetSelectedAnnotation( xAnnotation );
 
-    // Don't disable SID_DELETE_POSTIT slot in case of LOK
+    // Don't disable these slot in case of LOK, as postit doesn't need to
+    // selected before doing an operation on it in LOK
     if( (!xAnnotation.is() && !comphelper::LibreOfficeKit::isActive()) || bReadOnly )
+    {
         rSet.DisableItem( SID_DELETE_POSTIT );
+        rSet.DisableItem( SID_EDIT_POSTIT );
+    }
 
     SdPage* pPage = nullptr;
 
diff --git a/sd/source/ui/annotations/annotationmanagerimpl.hxx b/sd/source/ui/annotations/annotationmanagerimpl.hxx
index 5cba9ee..339af45 100644
--- a/sd/source/ui/annotations/annotationmanagerimpl.hxx
+++ b/sd/source/ui/annotations/annotationmanagerimpl.hxx
@@ -66,6 +66,7 @@ public:
 
     void ExecuteInsertAnnotation(SfxRequest& rReq);
     void ExecuteDeleteAnnotation(SfxRequest& rReq);
+    void ExecuteEditAnnotation(SfxRequest& rReq);
     void ExecuteReplyToAnnotation(SfxRequest& rReq);
 
     void SelectNextAnnotation(bool bForeward);
commit 2689793e31a7ab443f44883b17a0e371708066ff
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Tue Feb 21 15:20:45 2017 +0530

    sd lok: Include parthash in annotation list and callbacks
    
    ... and update the tests accordingly.
    
    Change-Id: Id11f2d19274e743b0e2a0bbeb0c21936f12b7777
    (cherry picked from commit ede35e5c693a287f31e3c02d8afd33580e827380)

diff --git a/sd/inc/Annotation.hxx b/sd/inc/Annotation.hxx
index 39e746c..27f1d51 100644
--- a/sd/inc/Annotation.hxx
+++ b/sd/inc/Annotation.hxx
@@ -37,6 +37,8 @@ SdrUndoAction* CreateUndoInsertOrRemoveAnnotation( const css::uno::Reference< cs
 
 sal_uInt32 getAnnotationId(const css::uno::Reference <css::office::XAnnotation>& xAnnotation);
 
+const SdPage* getAnnotationPage(const css::uno::Reference<css::office::XAnnotation>& xAnnotation);
+
 }
 
 #endif
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index c70bdd5..d142921 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -1618,6 +1618,8 @@ void SdTiledRenderingTest::testCommentCallbacks()
     CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView2.m_aCommentCallbackResult.get<std::string>("author"));
     CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
     CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+    CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+    CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
 
     // Reply to a just added comment
     SfxLokHelper::setView(nView2);
@@ -1642,6 +1644,8 @@ void SdTiledRenderingTest::testCommentCallbacks()
     CPPUNIT_ASSERT(aReplyTextView1.endsWith("Reply to comment"));
     CPPUNIT_ASSERT(aReplyTextView2.startsWith("Reply to LOK User1"));
     CPPUNIT_ASSERT(aReplyTextView2.endsWith("Reply to comment"));
+    CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+    CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
 
     // Delete the comment
     aArgs = comphelper::InitPropertySequence(
diff --git a/sd/source/core/annotations/Annotation.cxx b/sd/source/core/annotations/Annotation.cxx
index eb64dab..d82ba73 100644
--- a/sd/source/core/annotations/Annotation.cxx
+++ b/sd/source/core/annotations/Annotation.cxx
@@ -379,6 +379,14 @@ sal_uInt32 getAnnotationId(const Reference<XAnnotation>& xAnnotation)
     return nId;
 }
 
+const SdPage* getAnnotationPage(const Reference<XAnnotation>& xAnnotation)
+{
+    Annotation* pAnnotation = dynamic_cast<Annotation*>(xAnnotation.get());
+    if (pAnnotation)
+        return pAnnotation->GetPage();
+    return nullptr;
+}
+
 UndoInsertOrRemoveAnnotation::UndoInsertOrRemoveAnnotation( Annotation& rAnnotation, bool bInsert )
 : SdrUndoAction( *rAnnotation.GetModel() )
 , mxAnnotation( &rAnnotation )
diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
index d023770..2184e0c 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -122,13 +122,15 @@ namespace {
                                    (nType == CommentNotificationType::Remove ? "Remove" :
                                     (nType == CommentNotificationType::Modify ? "Modify" : "???"))));
         aAnnotation.put("id", sd::getAnnotationId(rxAnnotation));
-        if (nType != CommentNotificationType::Remove)
+        if (nType != CommentNotificationType::Remove && rxAnnotation.is())
         {
             aAnnotation.put("id", sd::getAnnotationId(rxAnnotation));
             aAnnotation.put("author", rxAnnotation->getAuthor());
             aAnnotation.put("dateTime", utl::toISO8601(rxAnnotation->getDateTime()));
             uno::Reference<text::XText> xText(rxAnnotation->getTextRange());
             aAnnotation.put("text", xText->getString());
+            const SdPage* pPage = sd::getAnnotationPage(rxAnnotation);
+            aAnnotation.put("parthash", pPage ? OString::number(pPage->GetHashCode()) : OString());
         }
 
         boost::property_tree::ptree aTree;
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 958fa25..67f4e33 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -2401,6 +2401,7 @@ OUString SdXImpressDocument::getPostIts()
             aAnnotation.put("dateTime", utl::toISO8601(xAnnotation->getDateTime()));
             uno::Reference<text::XText> xText(xAnnotation->getTextRange());
             aAnnotation.put("text", xText->getString());
+            aAnnotation.put("parthash", OUString::number(pPage->GetHashCode()));
 
             aAnnotations.push_back(std::make_pair("", aAnnotation));
         }
commit e75899ee3aaf8ab31787861d3bdd5376e45ca64e
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Mon Feb 20 12:55:19 2017 +0100

    Improve readability.
    
    Change-Id: Ibbbac458e3ef8b3d02f4d73cd8bf3ac880ff0522
    (cherry picked from commit ca5277c1ad181c15ce604077e07935b2de946c7c)

diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index b26ac76..43a7e56 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -819,7 +819,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
     if (bIsTiledRendering)
     {
         MapMode aNew = aOrig;
-        auto aOrigin = aOriginalMode.GetOrigin();
+        Point aOrigin = aOriginalMode.GetOrigin();
         aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX);
         aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY);
         static const double twipFactor = 15 * 1.76388889; // 26.45833335
@@ -893,7 +893,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
 
             if (bIsTiledRendering)
             {
-                auto aOrigin = aOriginalMode.GetOrigin();
+                Point aOrigin = aOriginalMode.GetOrigin();
                 aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + aOutputData.nScrX);
                 aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + aOutputData.nScrY);
                 const double twipFactor = 15 * 1.76388889; // 26.45833335
@@ -962,7 +962,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
                             Rectangle aBackground(aStart, aEnd);
 
                             // Need to draw the background in absolute coords.
-                            auto aOrigin = aOriginalMode.GetOrigin();
+                            Point aOrigin = aOriginalMode.GetOrigin();
                             aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScreenX);
                             aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScreenY);
                             aBackground += aOrigin;
@@ -1026,7 +1026,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
         if (bIsTiledRendering)
         {
             // Need to draw the background in absolute coords.
-            auto aOrigin = aOriginalMode.GetOrigin();
+            Point aOrigin = aOriginalMode.GetOrigin();
             aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX);
             aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY);
             aBackground += aOrigin;
@@ -1037,7 +1037,7 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
 
         if (bIsTiledRendering)
         {
-            auto aOrigin = aOriginalMode.GetOrigin();
+            Point aOrigin = aOriginalMode.GetOrigin();
             aOrigin.setX(aOrigin.getX() / TWIPS_PER_PIXEL + nScrX);
             aOrigin.setY(aOrigin.getY() / TWIPS_PER_PIXEL + nScrY);
             static const double twipFactor = 15 * 1.76388889; // 26.45833335
commit c460133d0f2cccc0ba6e2b60dda523e56f14d26e
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Tue Feb 21 11:05:47 2017 +0530

    Revert "sw lok: Move this test to sw/"
    
    This reverts commit b7640cbb4b34df2cb05c6fbe60346bca96846924.
    
    Not much idea yet but moving it to sw/ for some reason makes callback
    pertaining to last 'InsertAnnotation' uno command not firing and on
    ubsan tinderbox even the first 'InsertAnnotation' command is a noOp
    failing the tests there. Lets keep it in desktop/ for now where it was
    earlier.
    
    Conflicts:
    	desktop/qa/desktop_lib/test_desktop_lib.cxx
    
    Change-Id: I67f5bdeffa218ae2a7afe0896f7cdde5324a5f09
    (cherry picked from commit 0f6e813827fed1baefe6001b6e9655b0aeedcc46)

diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 896c90d..eb8017e 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -111,6 +111,7 @@ public:
     void testCommentsWriter();
     void testCommentsCalc();
     void testCommentsImpress();
+    void testCommentsCallbacksWriter();
 
     CPPUNIT_TEST_SUITE(DesktopLOKTest);
     CPPUNIT_TEST(testGetStyles);
@@ -149,6 +150,7 @@ public:
     CPPUNIT_TEST(testCommentsWriter);
     CPPUNIT_TEST(testCommentsCalc);
     CPPUNIT_TEST(testCommentsImpress);
+    CPPUNIT_TEST(testCommentsCallbacksWriter);
     CPPUNIT_TEST_SUITE_END();
 
     uno::Reference<lang::XComponent> mxComponent;
@@ -1736,6 +1738,7 @@ class ViewCallback
 public:
     bool m_bTilesInvalidated;
     Rectangle m_aOwnCursor;
+    boost::property_tree::ptree m_aCommentCallbackResult;
 
     ViewCallback()
         : m_bTilesInvalidated(false)
@@ -1769,6 +1772,14 @@ public:
             m_aOwnCursor.setHeight(aSeq[3].toInt32());
         }
         break;
+        case LOK_CALLBACK_COMMENT:
+        {
+            m_aCommentCallbackResult.clear();
+            std::stringstream aStream(pPayload);
+            boost::property_tree::read_json(aStream, m_aCommentCallbackResult);
+            m_aCommentCallbackResult = m_aCommentCallbackResult.get_child("comment");
+        }
+        break;
         }
     }
 };
@@ -2046,6 +2057,94 @@ void DesktopLOKTest::testCommentsImpress()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void DesktopLOKTest::testCommentsCallbacksWriter()
+{
+    comphelper::LibreOfficeKit::setActive();
+    // Comments callback are emitted only if tiled annotations are off
+    comphelper::LibreOfficeKit::setTiledAnnotations(false);
+    ViewCallback aView1;
+    ViewCallback aView2;
+    LibLODocument_Impl* pDocument = loadDoc("comments.odt");
+    pDocument->m_pDocumentClass->initializeForRendering(pDocument, "{}");
+    pDocument->m_pDocumentClass->registerCallback(pDocument, &ViewCallback::callback, &aView1);
+    pDocument->m_pDocumentClass->createView(pDocument);
+    pDocument->m_pDocumentClass->initializeForRendering(pDocument, "{}");
+    pDocument->m_pDocumentClass->registerCallback(pDocument, &ViewCallback::callback, &aView2);
+
+    // Add a new comment
+    OString aCommandArgs("{ \"Text\": { \"type\": \"string\", \"value\": \"Additional comment\" }, \"Author\": { \"type\": \"string\", \"value\": \"LOK User1\" } }");
+    pDocument->pClass->postUnoCommand(pDocument, ".uno:InsertAnnotation", aCommandArgs.getStr(), false);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    int nCommentId1 = aView1.m_aCommentCallbackResult.get<int>("id");
+
+    // Reply to a comment just added
+    aCommandArgs = "{ \"Id\": { \"type\": \"string\", \"value\": \"" + OString::number(nCommentId1) + "\" }, \"Text\": { \"type\": \"string\", \"value\": \"Reply comment\" } }";
+    pDocument->pClass->postUnoCommand(pDocument, ".uno:ReplyComment", aCommandArgs.getStr(), false);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action and linked to its parent comment
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView1.m_aCommentCallbackResult.get<int>("parent"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView2.m_aCommentCallbackResult.get<int>("parent"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Reply comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Reply comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+    int nCommentId2 = aView1.m_aCommentCallbackResult.get<int>("id");
+
+    // Edit the previously added comment
+    aCommandArgs = "{ \"Id\": { \"type\": \"string\", \"value\": \"" + OString::number(nCommentId2) + "\" }, \"Text\": { \"type\": \"string\", \"value\": \"Edited comment\" } }";
+    pDocument->pClass->postUnoCommand(pDocument, ".uno:EditAnnotation", aCommandArgs.getStr(), false);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    // parent is unchanged still
+    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView1.m_aCommentCallbackResult.get<int>("parent"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView2.m_aCommentCallbackResult.get<int>("parent"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+
+    // Delete the reply comment just added
+    aCommandArgs = "{ \"Id\": { \"type\": \"string\", \"value\":  \"" + OString::number(nCommentId2) + "\" } }";
+    pDocument->pClass->postUnoCommand(pDocument, ".uno:DeleteComment", aCommandArgs.getStr(), false);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Remove' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId2, aView1.m_aCommentCallbackResult.get<int>("id"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId2, aView2.m_aCommentCallbackResult.get<int>("id"));
+
+    // Reply to nCommentId1 again
+    aCommandArgs = "{ \"Id\": { \"type\": \"string\", \"value\": \"" + OString::number(nCommentId1) + "\" }, \"Text\": { \"type\": \"string\", \"value\": \"Reply comment again\" } }";
+    pDocument->pClass->postUnoCommand(pDocument, ".uno:ReplyComment", aCommandArgs.getStr(), false);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action and linked to its parent comment
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView1.m_aCommentCallbackResult.get<int>("parent"));
+    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView2.m_aCommentCallbackResult.get<int>("parent"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Reply comment again"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Reply comment again"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+
+    // .uno:ViewAnnotations returns total of 5 comments
+    boost::property_tree::ptree aTree;
+    char* pJSON = pDocument->m_pDocumentClass->getCommandValues(pDocument, ".uno:ViewAnnotations");
+    std::stringstream aStream(pJSON);
+    free(pJSON);
+    CPPUNIT_ASSERT(!aStream.str().empty());
+    boost::property_tree::read_json(aStream, aTree);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), aTree.get_child("comments").size());
+
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index f937fe4..c9829f2 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -81,7 +81,7 @@ public:
     void testPaintCallbacks();
     void testUndoRepairResult();
     void testRedoRepairResult();
-    void testCommentsCallbacks();
+
 
     CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -126,7 +126,6 @@ public:
     CPPUNIT_TEST(testPaintCallbacks);
     CPPUNIT_TEST(testUndoRepairResult);
     CPPUNIT_TEST(testRedoRepairResult);
-    CPPUNIT_TEST(testCommentsCallbacks);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -652,7 +651,6 @@ public:
     bool m_bViewLock;
     /// Set if any callback was invoked.
     bool m_bCalled;
-    boost::property_tree::ptree m_aCommentCallbackResult;
 
     ViewCallback()
         : m_bOwnCursorInvalidated(false),
@@ -759,14 +757,6 @@ public:
             m_bViewLock = aTree.get_child("rectangle").get_value<std::string>() != "EMPTY";
         }
         break;
-        case LOK_CALLBACK_COMMENT:
-        {
-            m_aCommentCallbackResult.clear();
-            std::stringstream aStream(pPayload);
-            boost::property_tree::read_json(aStream, m_aCommentCallbackResult);
-            m_aCommentCallbackResult = m_aCommentCallbackResult.get_child("comment");
-        }
-        break;
         }
     }
 };
@@ -1681,102 +1671,6 @@ void SwTiledRenderingTest::testRedoRepairResult()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
-void SwTiledRenderingTest::testCommentsCallbacks()
-{
-    comphelper::LibreOfficeKit::setActive();
-    // Comments callback are emitted only if tiled annotations are off
-    comphelper::LibreOfficeKit::setTiledAnnotations(false);
-
-    SwXTextDocument* pXTextDocument = createDoc();
-    ViewCallback aView1;
-    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1);
-    int nView1 = SfxLokHelper::getView();
-
-    // Crete a second view
-    SfxLokHelper::createView();
-    pXTextDocument->initializeForTiledRendering({});
-    ViewCallback aView2;
-    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView2);
-
-    SfxLokHelper::setView(nView1);
-
-    // Add a new comment
-    uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
-    {
-        {"Text", uno::makeAny(OUString("Comment"))},
-        {"Author", uno::makeAny(OUString("LOK User1"))},
-    }));
-    comphelper::dispatchCommand(".uno:InsertAnnotation", aPropertyValues);
-    Scheduler::ProcessEventsToIdle();
-
-    // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action
-    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
-    int nCommentId1 = aView1.m_aCommentCallbackResult.get<int>("id");
-
-    // Reply to a comment just added
-    aPropertyValues = comphelper::InitPropertySequence(
-    {
-        {"Id", uno::makeAny(OUString::number(nCommentId1))},
-        {"Text", uno::makeAny(OUString("Reply comment"))},
-    });
-    comphelper::dispatchCommand(".uno:ReplyComment", aPropertyValues);
-    Scheduler::ProcessEventsToIdle();
-
-    // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action and linked to its parent comment
-    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
-    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView1.m_aCommentCallbackResult.get<int>("parent"));
-    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView2.m_aCommentCallbackResult.get<int>("parent"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Reply comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Reply comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
-    int nCommentId2 = aView1.m_aCommentCallbackResult.get<int>("id");
-
-    // Edit the previously added comment
-    aPropertyValues = comphelper::InitPropertySequence(
-    {
-        {"Id", uno::makeAny(OUString::number(nCommentId2))},
-        {"Text", uno::makeAny(OUString("Edited comment"))},
-    });
-    comphelper::dispatchCommand(".uno:EditAnnotation", aPropertyValues);
-    Scheduler::ProcessEventsToIdle();
-
-    // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action
-    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
-    // parent is unchanged still
-    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView1.m_aCommentCallbackResult.get<int>("parent"));
-    CPPUNIT_ASSERT_EQUAL(nCommentId1, aView2.m_aCommentCallbackResult.get<int>("parent"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
-
-    // Delete the reply comment just added
-    aPropertyValues = comphelper::InitPropertySequence(
-    {
-        {"Id", uno::makeAny(OUString::number(nCommentId2))},
-    });
-    comphelper::dispatchCommand(".uno:DeleteComment", aPropertyValues);
-    Scheduler::ProcessEventsToIdle();
-
-    // We received a LOK_CALLBACK_COMMENT callback with comment 'Remove' action
-    CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
-    CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
-    CPPUNIT_ASSERT_EQUAL(nCommentId2, aView1.m_aCommentCallbackResult.get<int>("id"));
-    CPPUNIT_ASSERT_EQUAL(nCommentId2, aView2.m_aCommentCallbackResult.get<int>("id"));
-
-    // .uno:ViewAnnotations returns total of 1 comment
-    OUString aPostIts = pXTextDocument->getPostIts();
-    std::stringstream aStream(aPostIts.toUtf8().getStr());
-    boost::property_tree::ptree aTree;
-    boost::property_tree::read_json(aStream, aTree);
-    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aTree.get_child("comments").size());
-
-    mxComponent->dispose();
-    mxComponent.clear();
-    comphelper::LibreOfficeKit::setTiledAnnotations(true);
-    comphelper::LibreOfficeKit::setActive(false);
-}
-
 CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit 1ad56de1728c5180be97789532edaa2a12ff8dee
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Tue Feb 21 11:45:57 2017 +0530

    sfx2: fix incorrect debug output
    
    Fallback from 9351353b63886f494782f28f5400f5d71d22bcbd
    
    While at it, add one more such statement in Execute_
    
    Change-Id: Ibebc6f007542751718b53ed978ee52c300d14439
    (cherry picked from commit e4a0b50943921dcf6a914983cb693f9f6d20e145)

diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx
index 71cd48b..c22fe43 100644
--- a/sfx2/source/control/dispatch.cxx
+++ b/sfx2/source/control/dispatch.cxx
@@ -911,6 +911,7 @@ bool SfxDispatcher::GetShellAndSlot_Impl(sal_uInt16 nSlot, SfxShell** ppShell,
 void SfxDispatcher::Execute_(SfxShell& rShell, const SfxSlot& rSlot,
         SfxRequest& rReq, SfxCallMode eCallMode)
 {
+    SFX_STACK(SfxDispatcher::Execute_);
     DBG_ASSERT( !xImp->bFlushing, "recursive call to dispatcher" );
     DBG_ASSERT( xImp->aToDoStack.empty(), "unprepared InPlace _Execute" );
 
@@ -1738,7 +1739,7 @@ SfxSlotFilterState SfxDispatcher::IsSlotEnabledByFilter_Impl( sal_uInt16 nSID )
 */
 bool SfxDispatcher::FindServer_(sal_uInt16 nSlot, SfxSlotServer& rServer, bool bModal)
 {
-    SFX_STACK(SfxDispatcher::_FindServer);
+    SFX_STACK(SfxDispatcher::FindServer_);
 
     // Dispatcher locked? (nevertheless let SID_HELP_PI through)
     if ( IsLocked(nSlot) )
@@ -1872,7 +1873,7 @@ bool SfxDispatcher::FindServer_(sal_uInt16 nSlot, SfxSlotServer& rServer, bool b
 bool SfxDispatcher::FillState_(const SfxSlotServer& rSvr, SfxItemSet& rState,
         const SfxSlot* pRealSlot)
 {
-    SFX_STACK(SfxDispatcher::_FillState);
+    SFX_STACK(SfxDispatcher::FillState_);
 
     const SfxSlot *pSlot = rSvr.GetSlot();
     if ( pSlot && IsLocked( pSlot->GetSlotId() ) )
commit 8388724fbc5ff2cc29ad62b5ad5a57016aaafed3
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 15:12:40 2017 +0530

    sd lok: use per view author in annotations reply too
    
    Change-Id: Ibc727b54ebfcbdd1c95b679a35ddc8878ceecbfd
    (cherry picked from commit 7cc5aca1901ca7d67dffdcfc29537f32c31e0235)

diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
index 23500c4..d023770 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -597,10 +597,17 @@ void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest& rReq )
         std::unique_ptr< OutlinerParaObject > pOPO( pOutliner->CreateParaObject() );
         pTextApi->SetText( *pOPO.get() );
 
-        SvtUserOptions aUserOptions;
-        xAnnotation->setAuthor( aUserOptions.GetFullName() );
-        xAnnotation->setInitials( aUserOptions.GetID() );
+        OUString sReplyAuthor;
+        if (comphelper::LibreOfficeKit::isActive())
+            sReplyAuthor = mrBase.GetMainViewShell()->GetView()->GetAuthor();
+        else
+        {
+            SvtUserOptions aUserOptions;
+            sReplyAuthor = aUserOptions.GetFullName();
+            xAnnotation->setInitials( aUserOptions.GetID() );
+        }
 
+        xAnnotation->setAuthor( sReplyAuthor );
         // set current time to reply
         xAnnotation->setDateTime( getCurrentDateTime() );
 
commit 5926175aa87e8429a5615d9157f381c0c16927b2
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 16:12:11 2017 +0530

    sd lok: Don't rely on model notify events
    
    Place comment notification triggers at the end of the annotation
    insertion/modification function to accomplish the desired behavior.
    
    See inline comment for details.
    
    Change-Id: I0cbd51feb455d497826d6a4534a8bbd817be7b31
    (cherry picked from commit b02416ea4742873153227b6eaca00a15e7335987)

diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
index 99f61ff..23500c4 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -109,18 +109,20 @@ using namespace ::com::sun::star::office;
 
 namespace {
 
-    void lcl_CommentNotification(const OUString& rEventName, const sd::ViewShellBase& rViewShell, Reference<XAnnotation>& rxAnnotation)
+    enum class CommentNotificationType { Add, Modify, Remove };
+
+    void lcl_CommentNotification(CommentNotificationType nType, const SfxViewShell* pViewShell, Reference<XAnnotation>& rxAnnotation)
     {
         // callbacks only if tiled annotations are explicltly turned off by LOK client
         if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledAnnotations())
             return;
 
         boost::property_tree::ptree aAnnotation;
-        aAnnotation.put("action", (rEventName == "OnAnnotationInserted" ? "Add" :
-                                   (rEventName == "OnAnnotationRemoved" ? "Remove" :
-                                    (rEventName == "OnAnnotationChanged" ? "Modify" : "???"))));
+        aAnnotation.put("action", (nType == CommentNotificationType::Add ? "Add" :
+                                   (nType == CommentNotificationType::Remove ? "Remove" :
+                                    (nType == CommentNotificationType::Modify ? "Modify" : "???"))));
         aAnnotation.put("id", sd::getAnnotationId(rxAnnotation));
-        if (rEventName != "OnAnnotationRemoved")
+        if (nType != CommentNotificationType::Remove)
         {
             aAnnotation.put("id", sd::getAnnotationId(rxAnnotation));
             aAnnotation.put("author", rxAnnotation->getAuthor());
@@ -135,7 +137,7 @@ namespace {
         boost::property_tree::write_json(aStream, aTree);
         std::string aPayload = aStream.str();
 
-        rViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str());
+        pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str());
     }
 
 } // anonymous ns
@@ -276,12 +278,21 @@ void SAL_CALL AnnotationManagerImpl::notifyEvent( const css::document::EventObje
 {
     if( aEvent.EventName == "OnAnnotationInserted" || aEvent.EventName == "OnAnnotationRemoved" || aEvent.EventName == "OnAnnotationChanged" )
     {
-        Reference<XAnnotation> xAnnotation(aEvent.Source, uno::UNO_QUERY);
-        if (xAnnotation.is())
+        // AnnotationInsertion and modification is not handled here because when
+        // a new annotation is inserted, it consists of OnAnnotationInserted
+        // followed by a chain of OnAnnotationChanged (called for setting each
+        // of the annotation attributes - author, text etc.). This is not what a
+        // LOK client wants. So only handle removal here as annotation removal
+        // consists of only one event - 'OnAnnotationRemoved'
+        if ( aEvent.EventName == "OnAnnotationRemoved" )
         {
-            // Inform our LOK clients
-            lcl_CommentNotification(aEvent.EventName, mrBase, xAnnotation);
+            Reference< XAnnotation > xAnnotation( aEvent.Source, uno::UNO_QUERY );
+            if ( xAnnotation.is() )
+            {
+                lcl_CommentNotification(CommentNotificationType::Remove, &mrBase, xAnnotation);
+            }
         }
+
         UpdateTags();
     }
 }
@@ -507,6 +518,14 @@ void AnnotationManagerImpl::InsertAnnotation(const OUString& rText)
         if( mpDoc->IsUndoEnabled() )
             mpDoc->EndUndo();
 
+        // Tell our LOK clients about new comment added
+        const SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+        while (pViewShell)
+        {
+            lcl_CommentNotification(CommentNotificationType::Add, pViewShell, xAnnotation);
+            pViewShell = SfxViewShell::GetNext(*pViewShell);
+        }
+
         UpdateTags(true);
         SelectAnnotation( xAnnotation, true );
     }
@@ -585,6 +604,14 @@ void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest& rReq )
         // set current time to reply
         xAnnotation->setDateTime( getCurrentDateTime() );
 
+        // Tell our LOK clients about this (comment modification)
+        const SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+        while (pViewShell)
+        {
+            lcl_CommentNotification(CommentNotificationType::Modify, pViewShell, xAnnotation);
+            pViewShell = SfxViewShell::GetNext(*pViewShell);
+        }
+
         UpdateTags(true);
         SelectAnnotation( xAnnotation, true );
     }
commit 8a541f4a27526cf6277c86ca6634b5a6e38f4622
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 19:33:22 2017 +0530

    desktop: unit test to for sd ViewAnnotations command
    
    Change-Id: Ib830ff786f12d9edc791623dead74b3eeeabad71
    (cherry picked from commit 65cfa0eed38ceeb4e96c97b76772bb191129fd83)

diff --git a/desktop/qa/data/blank_presentation.odp b/desktop/qa/data/blank_presentation.odp
index 157901f..a7d57a4 100644
Binary files a/desktop/qa/data/blank_presentation.odp and b/desktop/qa/data/blank_presentation.odp differ
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index a2c5262..896c90d 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -110,6 +110,7 @@ public:
     void testGetFontSubset();
     void testCommentsWriter();
     void testCommentsCalc();
+    void testCommentsImpress();
 
     CPPUNIT_TEST_SUITE(DesktopLOKTest);
     CPPUNIT_TEST(testGetStyles);
@@ -147,6 +148,7 @@ public:
     CPPUNIT_TEST(testGetFontSubset);
     CPPUNIT_TEST(testCommentsWriter);
     CPPUNIT_TEST(testCommentsCalc);
+    CPPUNIT_TEST(testCommentsImpress);
     CPPUNIT_TEST_SUITE_END();
 
     uno::Reference<lang::XComponent> mxComponent;
@@ -1986,6 +1988,64 @@ void DesktopLOKTest::testCommentsCalc()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+
+void DesktopLOKTest::testCommentsImpress()
+{
+    comphelper::LibreOfficeKit::setActive();
+    // Disable tiled rendering for comments
+    comphelper::LibreOfficeKit::setTiledAnnotations(false);
+
+    LibLODocument_Impl* pDocument = loadDoc("blank_presentation.odp");
+    pDocument->m_pDocumentClass->initializeForRendering(pDocument, nullptr);
+
+    // Can we get all the comments using .uno:ViewAnnotations command ?
+    boost::property_tree::ptree aTree;
+    char* pJSON = pDocument->m_pDocumentClass->getCommandValues(pDocument, ".uno:ViewAnnotations");
+    std::stringstream aStream(pJSON);
+    free(pJSON);
+    CPPUNIT_ASSERT(!aStream.str().empty());
+    boost::property_tree::read_json(aStream, aTree);
+    // There are 2 comments in the document already
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aTree.get_child("comments").size());
+
+    // Check if all comment fields have valid data
+    int nIdx = 0;
+    for (const auto& rComment : aTree.get_child("comments"))
+    {
+        switch(nIdx)
+        {
+            case 0:
+            {
+                CPPUNIT_ASSERT(rComment.second.get<int>("id") > 0);
+                CPPUNIT_ASSERT_EQUAL(std::string("This is comment1"), rComment.second.get<std::string>("text"));
+                CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), rComment.second.get<std::string>("author"));
+                css::util::DateTime aDateTime;
+                OUString aDateTimeString = OUString::createFromAscii(rComment.second.get<std::string>("dateTime").c_str());
+                CPPUNIT_ASSERT(utl::ISO8601parseDateTime(aDateTimeString, aDateTime));
+            }
+            break;
+            case 1:
+            {
+                CPPUNIT_ASSERT(rComment.second.get<int>("id") > 0);
+                CPPUNIT_ASSERT_EQUAL(std::string("This is comment2"), rComment.second.get<std::string>("text"));
+                CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), rComment.second.get<std::string>("author"));
+                css::util::DateTime aDateTime;
+                OUString aDateTimeString = OUString::createFromAscii(rComment.second.get<std::string>("dateTime").c_str());
+                CPPUNIT_ASSERT(utl::ISO8601parseDateTime(aDateTimeString, aDateTime));
+            }
+            break;
+        }
+
+        ++nIdx;
+    }
+
+    // We checked all the comments
+    CPPUNIT_ASSERT_EQUAL(2, nIdx);
+
+    comphelper::LibreOfficeKit::setTiledAnnotations(true);
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit 6f050c4591400acbf860e99ae70da7a18fab5103
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 18:21:44 2017 +0530

    sd lok: Unit tests for comments api
    
    Change-Id: I88a5cbc952a1ddc2f8ccd5f34b86bf797916171c
    (cherry picked from commit 1654980341cff652de65d3b2aed52230e781e63a)

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 2013bfe..c70bdd5 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -34,6 +34,7 @@
 #include <comphelper/lok.hxx>
 #include <svx/svdotable.hxx>
 #include <svx/svdoutl.hxx>
+#include <unotools/datetime.hxx>
 
 #include <DrawDocShell.hxx>
 #include <ViewShellBase.hxx>
@@ -89,6 +90,7 @@ public:
     void testTdf104405();
     void testTdf81754();
     void testTdf105502();
+    void testCommentCallbacks();
 
     CPPUNIT_TEST_SUITE(SdTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -122,11 +124,12 @@ public:
     CPPUNIT_TEST(testTdf104405);
     CPPUNIT_TEST(testTdf81754);
     CPPUNIT_TEST(testTdf105502);
+    CPPUNIT_TEST(testCommentCallbacks);
 
     CPPUNIT_TEST_SUITE_END();
 
 private:
-    SdXImpressDocument* createDoc(const char* pName);
+    SdXImpressDocument* createDoc(const char* pName, const uno::Sequence<beans::PropertyValue>& rArguments = uno::Sequence<beans::PropertyValue>());
     static void callback(int nType, const char* pPayload, void* pData);
     void callbackImpl(int nType, const char* pPayload);
     xmlDocPtr parseXmlDump();
@@ -173,14 +176,14 @@ void SdTiledRenderingTest::tearDown()
     test::BootstrapFixture::tearDown();
 }
 
-SdXImpressDocument* SdTiledRenderingTest::createDoc(const char* pName)
+SdXImpressDocument* SdTiledRenderingTest::createDoc(const char* pName, const uno::Sequence<beans::PropertyValue>& rArguments)
 {
     if (mxComponent.is())
         mxComponent->dispose();
     mxComponent = loadFromDesktop(m_directories.getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(pName), "com.sun.star.presentation.PresentationDocument");
     SdXImpressDocument* pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
     CPPUNIT_ASSERT(pImpressDocument);
-    pImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+    pImpressDocument->initializeForTiledRendering(rArguments);
     return pImpressDocument;
 }
 
@@ -898,6 +901,7 @@ public:
     std::map<int, bool> m_aViewCursorInvalidations;
     std::map<int, bool> m_aViewCursorVisibilities;
     bool m_bViewSelectionSet;
+    boost::property_tree::ptree m_aCommentCallbackResult;
 
     ViewCallback()
         : m_bGraphicSelectionInvalidated(false),
@@ -975,6 +979,14 @@ public:
             m_bViewSelectionSet = true;
         }
         break;
+        case LOK_CALLBACK_COMMENT:
+        {
+            m_aCommentCallbackResult.clear();
+            std::stringstream aStream(pPayload);
+            boost::property_tree::read_json(aStream, m_aCommentCallbackResult);
+            m_aCommentCallbackResult = m_aCommentCallbackResult.get_child("comment");
+        }
+        break;
         }
     }
 };
@@ -1559,6 +1571,99 @@ void SdTiledRenderingTest::testTdf105502()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void SdTiledRenderingTest::testCommentCallbacks()
+{
+    // Load the document.
+    comphelper::LibreOfficeKit::setActive();
+    // Set the tield annotations off
+    comphelper::LibreOfficeKit::setTiledAnnotations(false);
+
+    SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp", comphelper::InitPropertySequence(
+    {
+        {".uno:Author", uno::makeAny(OUString("LOK User1"))},
+    }));
+    ViewCallback aView1;
+    int nView1 = SfxLokHelper::getView();
+    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1);
+
+    SfxLokHelper::createView();
+    uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+    {
+        {".uno:Author", uno::makeAny(OUString("LOK User2"))},
+    }));
+    pXImpressDocument->initializeForTiledRendering(aArgs);
+    ViewCallback aView2;
+    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView2);
+    int nView2 = SfxLokHelper::getView();
+
+    SfxLokHelper::setView(nView1);
+
+    // Add a new comment
+    aArgs = comphelper::InitPropertySequence(
+    {
+        {"Text", uno::makeAny(OUString("Comment"))},
+    });
+    comphelper::dispatchCommand(".uno:InsertAnnotation", aArgs);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    int nComment1 = aView1.m_aCommentCallbackResult.get<int>("id");
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+    css::util::DateTime aDateTime;
+    OUString aDateTimeString = OUString::createFromAscii(aView1.m_aCommentCallbackResult.get<std::string>("dateTime").c_str());
+    CPPUNIT_ASSERT(utl::ISO8601parseDateTime(aDateTimeString, aDateTime));
+    CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView1.m_aCommentCallbackResult.get<std::string>("author"));
+    CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView2.m_aCommentCallbackResult.get<std::string>("author"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+
+    // Reply to a just added comment
+    SfxLokHelper::setView(nView2);
+    aArgs = comphelper::InitPropertySequence(
+    {
+        {"Id", uno::makeAny(OUString::number(nComment1))},
+        {"Text", uno::makeAny(OUString("Reply to comment"))},
+    });
+    comphelper::dispatchCommand(".uno:ReplyToAnnotation", aArgs);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get<int>("id"));
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+    CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), aView1.m_aCommentCallbackResult.get<std::string>("author"));
+    CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), aView2.m_aCommentCallbackResult.get<std::string>("author"));
+    OUString aReplyTextView1 = OUString::createFromAscii(aView1.m_aCommentCallbackResult.get<std::string>("text").c_str());
+    OUString aReplyTextView2 = OUString::createFromAscii(aView2.m_aCommentCallbackResult.get<std::string>("text").c_str());
+    CPPUNIT_ASSERT(aReplyTextView1.startsWith("Reply to LOK User1"));
+    CPPUNIT_ASSERT(aReplyTextView1.endsWith("Reply to comment"));
+    CPPUNIT_ASSERT(aReplyTextView2.startsWith("Reply to LOK User1"));
+    CPPUNIT_ASSERT(aReplyTextView2.endsWith("Reply to comment"));
+
+    // Delete the comment
+    aArgs = comphelper::InitPropertySequence(
+    {
+        {"Id", uno::makeAny(OUString::number(nComment1))},
+    });
+    comphelper::dispatchCommand(".uno:DeleteAnnotation", aArgs);
+    Scheduler::ProcessEventsToIdle();
+
+    // We received a LOK_CALLBACK_COMMENT callback with comment 'Remove' action
+    CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get<int>("id"));
+    CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+
+    mxComponent->dispose();
+    mxComponent.clear();
+
+    comphelper::LibreOfficeKit::setTiledAnnotations(true);
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit a1e6cc8072d530a728a76ec0cdc847281bde4019
Author: Fakabbir Amin <fakabbir at gmail.com>
Date:   Fri Feb 17 19:48:40 2017 +0530

    tdf#84323: Make osl::Condition::wait more readable
    
    Improved readability of calls to osl::Condition::wait.
    
    Change-Id: I69fb9815561013f1eb9fd4a649e32902e09473c6
    Reviewed-on: https://gerrit.libreoffice.org/34399
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
    (cherry picked from commit 12fc1d5399a688a80eec2565a4b552377e428ab7)

diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx
index 7eb8796..dfd72dc 100644
--- a/configmgr/source/components.cxx
+++ b/configmgr/source/components.cxx
@@ -21,6 +21,7 @@
 
 #include <algorithm>
 #include <cassert>
+#include <chrono>
 #include <cstddef>
 #include <list>
 #include <set>
@@ -178,8 +179,7 @@ Components::WriteThread::WriteThread(
 }
 
 void Components::WriteThread::execute() {
-    TimeValue t = { 1, 0 }; // 1 sec
-    delay_.wait(&t); // must not throw; result_error is harmless and ignored
+    delay_.wait(std::chrono::seconds(1)); // must not throw; result_error is harmless and ignored
     osl::MutexGuard g(*lock_); // must not throw
     try {
         try {
diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx
index b9b2be5..3965684 100644
--- a/sc/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx
@@ -32,6 +32,7 @@
 #include <sfx2/lokhelper.hxx>
 #include <svx/svdpage.hxx>
 
+#include <chrono>
 #include <tabvwsh.hxx>
 #include <docsh.hxx>
 #include <document.hxx>
@@ -352,15 +353,13 @@ void ScTiledRenderingTest::testDocumentSize()
     // Set cursor column
     pViewShell->SetCursor(100, 0);
     // 2 seconds
-    TimeValue aTime = { 2 , 0 };
-    osl::Condition::Result aResult = m_aDocSizeCondition.wait(aTime);
+    osl::Condition::Result aResult = m_aDocSizeCondition.wait(std::chrono::seconds(2));
     CPPUNIT_ASSERT_EQUAL(aResult, osl::Condition::result_ok);
 
     // Set cursor row
     pViewShell->SetCursor(0, 100);
     // 2 seconds
-    aTime = { 2 , 0 };
-    aResult = m_aDocSizeCondition.wait(aTime);
+    aResult = m_aDocSizeCondition.wait(std::chrono::seconds(2));
     CPPUNIT_ASSERT_EQUAL(aResult, osl::Condition::result_ok);
 
     comphelper::LibreOfficeKit::setActive(false);
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index cbb8703..2013bfe 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -45,6 +45,8 @@
 #include <sfx2/request.hxx>
 #include <svx/svxids.hrc>
 
+#include <chrono>
+
 using namespace css;
 
 static const char* const DATA_DIRECTORY = "/sd/qa/unit/tiledrendering/data/";
@@ -668,8 +670,7 @@ void SdTiledRenderingTest::testInsertDeletePage()
     for (unsigned it = 1; it <= 10; it++)
         comphelper::dispatchCommand(".uno:InsertPage", aArgs);
 
-    TimeValue aTimeValue = { 2 , 0 }; // 2 seconds max
-    osl::Condition::Result aResult = m_aDocumentSizeCondition.wait(aTimeValue);
+    osl::Condition::Result aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
     CPPUNIT_ASSERT_EQUAL(aResult, osl::Condition::result_ok);
 
     // Verify inserted slides
@@ -686,7 +687,7 @@ void SdTiledRenderingTest::testInsertDeletePage()
     for (unsigned it = 1; it <= 10; it++)
         comphelper::dispatchCommand(".uno:DeletePage", aArgs);
 
-    aResult = m_aDocumentSizeCondition.wait(aTimeValue);
+    aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
     CPPUNIT_ASSERT_EQUAL(aResult, osl::Condition::result_ok);
 
     // Verify deleted slides
@@ -702,7 +703,7 @@ void SdTiledRenderingTest::testInsertDeletePage()
     for (unsigned it = 1; it <= 10; it++)
         comphelper::dispatchCommand(".uno:Undo", aArgs);
 
-    aResult = m_aDocumentSizeCondition.wait(aTimeValue);
+    aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
     CPPUNIT_ASSERT_EQUAL(aResult, osl::Condition::result_ok);
 
     // Verify inserted slides
@@ -718,7 +719,7 @@ void SdTiledRenderingTest::testInsertDeletePage()
     for (unsigned it = 1; it <= 10; it++)
         comphelper::dispatchCommand(".uno:Redo", aArgs);
 
-    aResult = m_aDocumentSizeCondition.wait(aTimeValue);
+    aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
     CPPUNIT_ASSERT_EQUAL(aResult, osl::Condition::result_ok);
 
     // Verify deleted slides
commit 6c2c2322fd18e627f3fa98f7de8092e0e526bc7e
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Jan 25 11:15:46 2017 +0100

    tdf#105502 sd increase font size: handle table selection
    
    In part of a table shape is selected, then only operate on the selected
    cells, not on all of them.
    
    Change-Id: I3a9ba2b99bcaa2e355b6fcdafdd142d4a809bce6
    Reviewed-on: https://gerrit.libreoffice.org/33524
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>
    (cherry picked from commit cbc84a6599c08e5c79e544212c69c6946d0cdbf0)

diff --git a/sd/qa/unit/tiledrendering/data/tdf105502.odp b/sd/qa/unit/tiledrendering/data/tdf105502.odp
new file mode 100644
index 0000000..6fe8180
Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf105502.odp differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 65079fc..cbb8703 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -42,6 +42,8 @@
 #include <unomodel.hxx>
 #include <drawdoc.hxx>
 #include <undo/undomanager.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svxids.hrc>
 
 using namespace css;
 
@@ -84,6 +86,7 @@ public:
     void testTdf103083();
     void testTdf104405();
     void testTdf81754();
+    void testTdf105502();
 
     CPPUNIT_TEST_SUITE(SdTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -116,6 +119,7 @@ public:
     CPPUNIT_TEST(testTdf103083);
     CPPUNIT_TEST(testTdf104405);
     CPPUNIT_TEST(testTdf81754);
+    CPPUNIT_TEST(testTdf105502);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -1505,6 +1509,55 @@ void SdTiledRenderingTest::testTdf81754()
     xDocShRef->DoClose();
 }
 
+void SdTiledRenderingTest::testTdf105502()
+{
+    // Load the document.
+    comphelper::LibreOfficeKit::setActive();
+    SdXImpressDocument* pXImpressDocument = createDoc("tdf105502.odp");
+    sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+    sd::Window* pWindow = pViewShell->GetActiveWindow();
+    CPPUNIT_ASSERT(pWindow);
+    SdPage* pActualPage = pViewShell->GetActualPage();
+    SdrObject* pObject = pActualPage->GetObj(0);
+    auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject);
+    CPPUNIT_ASSERT(pTableObject);
+
+    // Select the first row.
+    sd::View* pView = pViewShell->GetView();
+    pView->MarkObj(pObject, pView->GetSdrPageView());
+    pView->SdrBeginTextEdit(pObject);
+    rtl::Reference<sdr::SelectionController> xSelectionController(pView->getSelectionController());
+    CPPUNIT_ASSERT(xSelectionController.is());
+    SfxRequest aRequest(pViewShell->GetViewFrame(), SID_TABLE_SELECT_ROW);
+    xSelectionController->Execute(aRequest);
+
+    // Assert that the A1:B1 selection succeeded.
+    CPPUNIT_ASSERT(xSelectionController->hasSelectedCells());
+    sdr::table::CellPos aFirstCell;
+    sdr::table::CellPos aLastCell;
+    xSelectionController->getSelectedCells(aFirstCell, aLastCell);
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnCol);
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnRow);
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aLastCell.mnCol);
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aLastCell.mnRow);
+
+    // Grow font size for the selection.
+    comphelper::dispatchCommand(".uno:Grow", {});
+    Scheduler::ProcessEventsToIdle();
+
+    // Assert that the selected A1 has now a larger font than the unselected
+    // A2.
+    xmlDocPtr pXmlDoc = parseXmlDump();
+    sal_Int32 nA1Height = getXPath(pXmlDoc, "//Cell[1]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/attribs[1]/SvxFontHeightItem", "height").toInt32();
+    sal_Int32 nA2Height = getXPath(pXmlDoc, "//Cell[3]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/attribs[1]/SvxFontHeightItem", "height").toInt32();
+    // This failed when FuText::ChangeFontSize() never did "continue" in the
+    // text loop, instead of doing so depending on what IsInSelection() returns.
+    CPPUNIT_ASSERT(nA1Height > nA2Height);
+    xmlFreeDoc(pXmlDoc);
+
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit 8f4b26a280a2a1c074929922a513db47507187d1
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Jan 17 09:11:11 2017 +0100

    sw, sd: fix indentation
    
    The indentation in these files is consistent otherwise, let's keep it
    that way.
    
    Change-Id: I1d73caa03425cd4d1c98ff07935512b002fb2c72
    (cherry picked from commit d74e3b5bc43635c8c86988884b97929c3b086732)

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 58dc9e6..65079fc 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -1493,7 +1493,7 @@ void SdTiledRenderingTest::testTdf81754()
     // now save, reload, and assert that we did not lose the edit
     ::sd::DrawDocShellRef xDocShRef = saveAndReload(pXImpressDocument->GetDocShell(), PPTX);
 
-    const SdrPage *pPage = GetPage(1, xDocShRef);
+    const SdrPage* pPage = GetPage(1, xDocShRef);
     SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
     CPPUNIT_ASSERT(pTextObject);
 
diff --git a/sw/inc/lineinfo.hxx b/sw/inc/lineinfo.hxx
index 4cd232e..155a4c0 100644
--- a/sw/inc/lineinfo.hxx
+++ b/sw/inc/lineinfo.hxx
@@ -50,7 +50,7 @@ class SW_DLLPUBLIC SwLineNumberInfo : public SwClient /**< purpose of derivation
     bool                bRestartEachPage;       /**< Restart counting at the first paragraph of each page
                                                        (even on follows when paragraphs are splitted) */
 protected:
-   virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) override;
+    virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) override;
 
 public:
     SwLineNumberInfo();
diff --git a/sw/inc/tox.hxx b/sw/inc/tox.hxx
index eb6a28f..005ab57 100644
--- a/sw/inc/tox.hxx
+++ b/sw/inc/tox.hxx
@@ -80,7 +80,7 @@ class SW_DLLPUBLIC SwTOXMark
 
 protected:
     // SwClient
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
 
 public:
 
diff --git a/sw/inc/txtatr.hxx b/sw/inc/txtatr.hxx
index 02ee37d..ddb3f1b 100644
--- a/sw/inc/txtatr.hxx
+++ b/sw/inc/txtatr.hxx
@@ -74,7 +74,7 @@ class SW_DLLPUBLIC SwTextRuby : public SwTextAttrNesting, public SwClient
 {
     SwTextNode* m_pTextNode;
 protected:
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) override;
 public:
     SwTextRuby( SwFormatRuby& rAttr, sal_Int32 nStart, sal_Int32 nEnd );
     virtual ~SwTextRuby() override;
diff --git a/sw/inc/unosett.hxx b/sw/inc/unosett.hxx
index 6386f4f..73ce65c 100644
--- a/sw/inc/unosett.hxx
+++ b/sw/inc/unosett.hxx
@@ -140,8 +140,8 @@ class SwXNumberingRules : public cppu::WeakAggImplHelper5
 >
 {
 private:
-   class Impl;
-   ::sw::UnoImplPtr<Impl> m_pImpl;
+    class Impl;
+    ::sw::UnoImplPtr<Impl> m_pImpl;
 
     OUString                    m_sNewCharStyleNames[MAXLEVEL];
     OUString                    m_sNewBulletFontNames[MAXLEVEL];
diff --git a/sw/inc/unostyle.hxx b/sw/inc/unostyle.hxx
index eda8646..9806d2f 100644
--- a/sw/inc/unostyle.hxx
+++ b/sw/inc/unostyle.hxx
@@ -151,7 +151,7 @@ class SwXAutoStyleFamily : public cppu::WeakImplHelper< css::style::XAutoStyleFa
     IStyleAccess::SwAutoStyleFamily m_eFamily;
 
 protected:
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) override;
 
 public:
     SwXAutoStyleFamily(SwDocShell* pDocShell, IStyleAccess::SwAutoStyleFamily eFamily);
diff --git a/sw/inc/usrfld.hxx b/sw/inc/usrfld.hxx
index 45de281..e2490f9 100644
--- a/sw/inc/usrfld.hxx
+++ b/sw/inc/usrfld.hxx
@@ -62,7 +62,7 @@ public:
     virtual bool        PutValue( const css::uno::Any& rVal, sal_uInt16 nMId ) override;
 
 protected:
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
 };
 
 inline bool SwUserFieldType::IsValid() const
commit 15db136ab1311c24b9220d8ed65392df3685027d
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Jan 10 08:10:42 2017 +0100

    New loplugin:conststringvar: sd
    
    Change-Id: I7aa74260f1456a22bae368738e3947ead1ecc7be
    (cherry picked from commit 5637e56cc68b36c9a9484580e9053cca5c04a771)

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 7eb13a8..58dc9e6 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -45,7 +45,7 @@
 
 using namespace css;
 
-static const char* DATA_DIRECTORY = "/sd/qa/unit/tiledrendering/data/";
+static const char* const DATA_DIRECTORY = "/sd/qa/unit/tiledrendering/data/";
 
 class SdTiledRenderingTest : public SdModelTestBase, public XmlTestTools
 {
diff --git a/sd/source/filter/html/htmlex.cxx b/sd/source/filter/html/htmlex.cxx
index 8bc792b..4443c42 100644
--- a/sd/source/filter/html/htmlex.cxx
+++ b/sd/source/filter/html/htmlex.cxx
@@ -2239,7 +2239,7 @@ OUString const & HtmlExport::getDocumentTitle()
     return mDocTitle;
 }
 
-static const char* JS_NavigateAbs =
+static const char JS_NavigateAbs[] =
     "function NavigateAbs( nPage )\r\n"
     "{\r\n"
     "  frames[\"show\"].location.href = \"img\" + nPage + \".$EXT\";\r\n"
@@ -2259,7 +2259,7 @@ static const char* JS_NavigateAbs =
     "  }\r\n"
     "}\r\n\r\n";
 
-static const char* JS_NavigateRel =
+static const char JS_NavigateRel[] =
     "function NavigateRel( nDelta )\r\n"
     "{\r\n"
     "  var nPage = parseInt(nCurrentPage) + parseInt(nDelta);\r\n"
@@ -2269,14 +2269,14 @@ static const char* JS_NavigateRel =
     "  }\r\n"
     "}\r\n\r\n";
 
-static const char* JS_ExpandOutline =
+static const char JS_ExpandOutline[] =
     "function ExpandOutline()\r\n"
     "{\r\n"
     "  frames[\"navbar2\"].location.href = \"navbar4.$EXT\";\r\n"
     "  frames[\"outline\"].location.href = \"outline1.$EXT\";\r\n"
     "}\r\n\r\n";
 
-static const char * JS_CollapseOutline =
+static const char JS_CollapseOutline[] =
     "function CollapseOutline()\r\n"
     "{\r\n"
     "  frames[\"navbar2\"].location.href = \"navbar3.$EXT\";\r\n"
@@ -2304,7 +2304,7 @@ bool HtmlExport::CreateFrames()
     aStr.append(OUString::number(mnSdPageCount));
     aStr.append(";\r\n\r\n");
 
-    OUString aFunction = OUString::createFromAscii(JS_NavigateAbs);
+    OUString aFunction = JS_NavigateAbs;
 
     if(mbNotes)
     {
@@ -2316,17 +2316,17 @@ bool HtmlExport::CreateFrames()
     aFunction = aFunction.replaceAll(aPlaceHolder, maHTMLExtension);
     aStr.append(aFunction);
 
-    aTmp = OUString::createFromAscii(JS_NavigateRel);
+    aTmp = JS_NavigateRel;
     aTmp = aTmp.replaceAll(aPlaceHolder, maHTMLExtension);
     aStr.append(aTmp);
 
     if(mbImpress)
     {
-        aTmp = OUString::createFromAscii(JS_ExpandOutline);
+        aTmp = JS_ExpandOutline;
         aTmp = aTmp.replaceAll(aPlaceHolder, maHTMLExtension);
         aStr.append(aTmp);
 
-        aTmp = OUString::createFromAscii(JS_CollapseOutline);
+        aTmp = JS_CollapseOutline;
         aTmp = aTmp.replaceAll(aPlaceHolder, maHTMLExtension);
         aStr.append(aTmp);
     }
diff --git a/sd/source/ui/remotecontrol/BluetoothServer.cxx b/sd/source/ui/remotecontrol/BluetoothServer.cxx
index 3002160..d515911 100644
--- a/sd/source/ui/remotecontrol/BluetoothServer.cxx
+++ b/sd/source/ui/remotecontrol/BluetoothServer.cxx
@@ -219,7 +219,7 @@ getBluez5Adapter(DBusConnection *pConnection)
     if (!pMsg)
         return nullptr;
 
-    const gchar* pInterfaceType = "org.bluez.Adapter1";
+    const gchar* const pInterfaceType = "org.bluez.Adapter1";
 
     pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
 
diff --git a/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx b/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx
index d85f257..722f4f9 100644
--- a/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx
+++ b/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx
@@ -21,7 +21,7 @@
 // for numbers see:
 // https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm
 
-static const char *bluetooth_service_record =
+static const char * const bluetooth_service_record =
   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
     "<record>"
       "<attribute id=\"0x0001\">"       // Service class ID list
commit 64490112969e31be5694343c3259dcba863f2fe5
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Wed Jan 4 20:40:28 2017 +0100

    tdf#81754: Unit test for the loss of text on save of pptx.
    
    The problem itself was fixed by commit
    2ad50c9a8c8411a57bbbd7a52734e72ffc4cc0ee.
    
    Change-Id: Ie7f0781e1f5a4d6c5297882a5f64a68b85558515
    (cherry picked from commit 6106fea591f685bc1fd5b65ade86e2e45dbc58e1)

diff --git a/sd/CppunitTest_sd_tiledrendering.mk b/sd/CppunitTest_sd_tiledrendering.mk
index 60790c4..711f6eb 100644
--- a/sd/CppunitTest_sd_tiledrendering.mk
+++ b/sd/CppunitTest_sd_tiledrendering.mk
@@ -19,6 +19,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sd_tiledrendering, \
     comphelper \
     cppu \
     cppuhelper \
+    drawinglayer \
     editeng \
     sal \
     sfx \
diff --git a/sd/qa/unit/tiledrendering/data/tdf81754.pptx b/sd/qa/unit/tiledrendering/data/tdf81754.pptx
new file mode 100644
index 0000000..8a1fa1d
Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf81754.pptx differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index e031d06..7eb13a8 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -7,6 +7,7 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
+#include "../sdmodeltestbase.hxx"
 #include <test/bootstrapfixture.hxx>
 #include <unotest/macros_test.hxx>
 #include <test/xmltesttools.hxx>
@@ -19,6 +20,7 @@
 #include <comphelper/propertysequence.hxx>
 #include <comphelper/string.hxx>
 #include <editeng/editids.hrc>
+#include <editeng/editobj.hxx>
 #include <editeng/editview.hxx>
 #include <editeng/editobj.hxx>
 #include <editeng/outliner.hxx>
@@ -45,7 +47,7 @@ using namespace css;
 
 static const char* DATA_DIRECTORY = "/sd/qa/unit/tiledrendering/data/";
 
-class SdTiledRenderingTest : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
+class SdTiledRenderingTest : public SdModelTestBase, public XmlTestTools
 {
 public:
     SdTiledRenderingTest();
@@ -81,6 +83,7 @@ public:
     void testPostKeyEventInvalidation();
     void testTdf103083();
     void testTdf104405();
+    void testTdf81754();
 
     CPPUNIT_TEST_SUITE(SdTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -112,6 +115,8 @@ public:
     CPPUNIT_TEST(testPostKeyEventInvalidation);
     CPPUNIT_TEST(testTdf103083);
     CPPUNIT_TEST(testTdf104405);
+    CPPUNIT_TEST(testTdf81754);
+
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -1466,6 +1471,40 @@ void SdTiledRenderingTest::testTdf104405()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void SdTiledRenderingTest::testTdf81754()
+{
+    SdXImpressDocument* pXImpressDocument = createDoc("tdf81754.pptx");
+    sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+    SdPage* pActualPage = pViewShell->GetActualPage();
+    SdrObject* pObject = pActualPage->GetObj(1);
+
+    SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject);
+    SdrView* pView = pViewShell->GetView();
+    pView->MarkObj(pTextObj, pView->GetSdrPageView());
+    SfxStringItem aInputString(SID_ATTR_CHAR, "x");
+    pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR,
+            SfxCallMode::SYNCHRON, { &aInputString });
+
+    pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+    pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+
+    Scheduler::ProcessEventsToIdle();
+
+    // now save, reload, and assert that we did not lose the edit
+    ::sd::DrawDocShellRef xDocShRef = saveAndReload(pXImpressDocument->GetDocShell(), PPTX);
+
+    const SdrPage *pPage = GetPage(1, xDocShRef);
+    SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+    CPPUNIT_ASSERT(pTextObject);
+
+    OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject();
+    const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject();
+
+    CPPUNIT_ASSERT_EQUAL(OUString("Somethingxx"), aEdit.GetText(0));
+
+    xDocShRef->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit ce3ce69b2f1dd7f8c032389b8979865bbdcc5dfa
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Dec 8 09:25:32 2016 +0100

    Indentation fixes
    
    Change-Id: I35de0c30a3f4f82bc923e467d5f0acf0ed90684f
    (cherry picked from commit a215174eba5962abcef10a5a1a852fdc9364105b)

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index d8f7f23..e031d06 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -1432,9 +1432,9 @@ void SdTiledRenderingTest::testTdf104405()
     rEditView.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char.
 
     // trigger the clone-formatting/paintbrush command to copy formatting contents of cell
-    uno::Sequence< beans::PropertyValue > aArgs( 1 );
+    uno::Sequence< beans::PropertyValue > aArgs(1);
     aArgs[0].Name  = "PersistentCopy";
-    aArgs[0].Value = uno::makeAny( true );
+    aArgs[0].Value = uno::makeAny(true);
     comphelper::dispatchCommand(".uno:FormatPaintbrush", aArgs);
 
     Scheduler::ProcessEventsToIdle();
@@ -1447,10 +1447,10 @@ void SdTiledRenderingTest::testTdf104405()
     rEditView2.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char.
     Rectangle aRect = pTableObject->GetCurrentBoundRect();
     pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
-                                      convertMm100ToTwip(aRect.getX() ), convertMm100ToTwip(aRect.getY() ),
+                                      convertMm100ToTwip(aRect.getX()), convertMm100ToTwip(aRect.getY()),
                                       1, MOUSE_LEFT, 0);
     pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
-                                      convertMm100ToTwip(aRect.getX() ), convertMm100ToTwip(aRect.getY() ),
+                                      convertMm100ToTwip(aRect.getX()), convertMm100ToTwip(aRect.getY()),
                                       1, MOUSE_LEFT, 0);
 
     Scheduler::ProcessEventsToIdle();
@@ -1460,7 +1460,7 @@ void SdTiledRenderingTest::testTdf104405()
     OString aPrefix = "/SdDrawDocument/SdrModel/SdPage/SdrObjList/SdrTableObj/SdrTableObjImpl"
                       "/TableModel/Cell[1]/DefaultProperties/SfxItemSet/SdrTextVertAdjustItem";
     // the following name has a compiler-dependant part
-    CPPUNIT_ASSERT_EQUAL( getXPath(pXmlDoc, aPrefix, "value"), OUString("2") );
+    CPPUNIT_ASSERT_EQUAL(getXPath(pXmlDoc, aPrefix, "value"), OUString("2"));
     xmlFreeDoc(pXmlDoc);
 
     comphelper::LibreOfficeKit::setActive(false);
diff --git a/sw/inc/format.hxx b/sw/inc/format.hxx
index 21f8db5..a30af53 100644
--- a/sw/inc/format.hxx
+++ b/sw/inc/format.hxx
@@ -69,7 +69,7 @@ protected:
     SwFormat( SwAttrPool& rPool, const OUString &rFormatNm, const sal_uInt16* pWhichRanges,
             SwFormat *pDrvdFrame, sal_uInt16 nFormatWhich );
     SwFormat( const SwFormat& rFormat );
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ) override;
 
 public:
 
diff --git a/sw/inc/ftninfo.hxx b/sw/inc/ftninfo.hxx
index 3c5af52..d10ab32 100644
--- a/sw/inc/ftninfo.hxx
+++ b/sw/inc/ftninfo.hxx
@@ -38,7 +38,7 @@ class SW_DLLPUBLIC SwEndNoteInfo : public SwClient
     OUString sSuffix;
 protected:
     bool        m_bEndNote;
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
 
 public:
     SvxNumberType aFormat;
diff --git a/sw/inc/ndindex.hxx b/sw/inc/ndindex.hxx
index 435a313..66cac16 100644
--- a/sw/inc/ndindex.hxx
+++ b/sw/inc/ndindex.hxx
@@ -79,7 +79,7 @@ public:
         RegisterIndex( m_pNode->GetNodes() );
     }
 
-   virtual  ~SwNodeIndex() override
+    virtual  ~SwNodeIndex() override
         { DeRegisterIndex( m_pNode->GetNodes() ); }
 
     inline sal_uLong operator++();
diff --git a/sw/inc/pagedesc.hxx b/sw/inc/pagedesc.hxx
index 592886d..fec4ad5 100644
--- a/sw/inc/pagedesc.hxx
+++ b/sw/inc/pagedesc.hxx
@@ -184,7 +184,7 @@ class SW_DLLPUBLIC SwPageDesc : public SwModify
     };
 
 protected:
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNewValue ) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNewValue ) override;
 
 public:
     const OUString& GetName() const { return m_StyleName; }
diff --git a/sw/inc/section.hxx b/sw/inc/section.hxx
index 920ef8c..78a65d6 100644
--- a/sw/inc/section.hxx
+++ b/sw/inc/section.hxx
@@ -286,7 +286,7 @@ class SW_DLLPUBLIC SwSectionFormat
 
 protected:
     SwSectionFormat( SwFrameFormat* pDrvdFrame, SwDoc *pDoc );
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
 
 public:
     virtual ~SwSectionFormat() override;
commit 47a330e790a958c5260700af04e9606501624e98
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 13:30:48 2017 +0530

    sd lok: Implement comment callback notifications
    
    Change-Id: Ibd3d2467a4bbac520987fa71a6d14994f58dd055
    Reviewed-on: https://gerrit.libreoffice.org/34460
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: pranavk <pranavk at collabora.co.uk>
    (cherry picked from commit 3d10c608b05f648c5ff09f68a76b88090572b831)

diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
index e1d3d37..99f61ff 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -19,6 +19,8 @@
 
 #include "sddll.hxx"
 
+#include <boost/property_tree/json_parser.hpp>
+
 #include <com/sun/star/beans/XMultiPropertyStates.hpp>
 #include <com/sun/star/frame/XController.hpp>
 #include <com/sun/star/frame/XModel.hpp>
@@ -37,6 +39,7 @@
 #include <sal/macros.h>
 #include <svl/style.hxx>
 #include <svl/itempool.hxx>
+#include <unotools/datetime.hxx>
 #include <unotools/useroptions.hxx>
 #include <unotools/syslocale.hxx>
 #include <unotools/saveopt.hxx>
@@ -61,6 +64,8 @@
 #include <editeng/udlnitem.hxx>
 #include <editeng/crossedoutitem.hxx>
 
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+
 #include <svx/postattr.hxx>
 #include <svx/svdetc.hxx>
 
@@ -102,6 +107,39 @@ using namespace ::com::sun::star::ui;
 using namespace ::com::sun::star::task;
 using namespace ::com::sun::star::office;
 
+namespace {
+
+    void lcl_CommentNotification(const OUString& rEventName, const sd::ViewShellBase& rViewShell, Reference<XAnnotation>& rxAnnotation)
+    {
+        // callbacks only if tiled annotations are explicltly turned off by LOK client
+        if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledAnnotations())
+            return;
+
+        boost::property_tree::ptree aAnnotation;
+        aAnnotation.put("action", (rEventName == "OnAnnotationInserted" ? "Add" :
+                                   (rEventName == "OnAnnotationRemoved" ? "Remove" :
+                                    (rEventName == "OnAnnotationChanged" ? "Modify" : "???"))));
+        aAnnotation.put("id", sd::getAnnotationId(rxAnnotation));
+        if (rEventName != "OnAnnotationRemoved")
+        {
+            aAnnotation.put("id", sd::getAnnotationId(rxAnnotation));
+            aAnnotation.put("author", rxAnnotation->getAuthor());
+            aAnnotation.put("dateTime", utl::toISO8601(rxAnnotation->getDateTime()));
+            uno::Reference<text::XText> xText(rxAnnotation->getTextRange());
+            aAnnotation.put("text", xText->getString());
+        }
+
+        boost::property_tree::ptree aTree;
+        aTree.add_child("comment", aAnnotation);
+        std::stringstream aStream;
+        boost::property_tree::write_json(aStream, aTree);
+        std::string aPayload = aStream.str();
+
+        rViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str());
+    }
+
+} // anonymous ns
+
 namespace sd {
 
 SfxItemPool* GetAnnotationPool()
@@ -238,6 +276,12 @@ void SAL_CALL AnnotationManagerImpl::notifyEvent( const css::document::EventObje
 {
     if( aEvent.EventName == "OnAnnotationInserted" || aEvent.EventName == "OnAnnotationRemoved" || aEvent.EventName == "OnAnnotationChanged" )
     {
+        Reference<XAnnotation> xAnnotation(aEvent.Source, uno::UNO_QUERY);
+        if (xAnnotation.is())
+        {
+            // Inform our LOK clients
+            lcl_CommentNotification(aEvent.EventName, mrBase, xAnnotation);
+        }
         UpdateTags();
     }
 }
commit 08cdff16dc60065ef519743f19ba458b8d207f33
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 11:29:46 2017 +0530

    sd lok: Support for replying to annotations by id
    
    Change-Id: I9e6416b87300c20969669ee9592f0b560959e160
    Reviewed-on: https://gerrit.libreoffice.org/34459
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: pranavk <pranavk at collabora.co.uk>
    (cherry picked from commit 357fae01a15b88a53873278cccb1040b4d46bdba)

diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
index dd5f78d..e1d3d37 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -472,11 +472,21 @@ void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest& rReq )
 {
     Reference< XAnnotation > xAnnotation;
     const SfxItemSet* pArgs = rReq.GetArgs();
+    sal_uInt32 nReplyId = 0; // Id of the comment to reply to
+    OUString sReplyText;
     if( pArgs )
     {
         const SfxPoolItem*  pPoolItem = nullptr;
-        if( SfxItemState::SET == pArgs->GetItemState( rReq.GetSlot(), true, &pPoolItem ) )
+        if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_ID, true, &pPoolItem ) )
+        {
+            nReplyId = static_cast<const SvxPostItIdItem*>(pPoolItem)->GetValue().toUInt32();
+            xAnnotation = GetAnnotationById(nReplyId);
+        }
+        else if( SfxItemState::SET == pArgs->GetItemState( rReq.GetSlot(), true, &pPoolItem ) )
             static_cast<const SfxUnoAnyItem*>( pPoolItem )->GetValue() >>= xAnnotation;
+
+        if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_TEXT, true, &pPoolItem ) )
+            sReplyText = static_cast<const SvxPostItTextItem*>( pPoolItem )->GetValue();
     }
 
     TextApiObject* pTextApi = getTextApiObject( xAnnotation );
@@ -518,6 +528,9 @@ void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest& rReq )
             pOutliner->QuickSetAttribs( aAnswerSet, aSel );
         }
 
+        if (!sReplyText.isEmpty())
+            pOutliner->Insert(sReplyText);
+
         std::unique_ptr< OutlinerParaObject > pOPO( pOutliner->CreateParaObject() );
         pTextApi->SetText( *pOPO.get() );
 
diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi
index aa0f036..91265a3 100644
--- a/svx/sdi/svx.sdi
+++ b/svx/sdi/svx.sdi
@@ -4575,7 +4575,7 @@ SfxBoolItem ShowAnnotations SID_SHOW_POSTIT
 
 
 SfxVoidItem ReplyToAnnotation SID_REPLYTO_POSTIT
-()
+(SvxPostItIdItem Id SID_ATTR_POSTIT_ID,SvxPostItTextItem Text SID_ATTR_POSTIT_TEXT)
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
commit 2c5e93e4bb4e5c3cc40935460cfe90ab591b9019
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Mon Feb 20 09:27:09 2017 +0100

    sw: prefix members of SwBorderAttrAccess
    
    Change-Id: Iff8bf7d5d2b5b50e21726429c8b836ae560400e1
    Reviewed-on: https://gerrit.libreoffice.org/34458
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>
    (cherry picked from commit fd27564ecbdf0a85b05e2578759dca9ad6efcd05)

diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx
index c99bf11..4c8de72 100644
--- a/sw/source/core/inc/frmtool.hxx
+++ b/sw/source/core/inc/frmtool.hxx
@@ -365,7 +365,7 @@ public:
 
 class SwBorderAttrAccess : public SwCacheAccess
 {
-    const SwFrame *pConstructor;      //opt: for passing on to SwBorderAttrs
+    const SwFrame *m_pConstructor;      //opt: for passing on to SwBorderAttrs
 
 protected:
     virtual SwCacheObj *NewObj() override;
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index 09ffe34..da17ec9 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -2170,14 +2170,14 @@ SwBorderAttrAccess::SwBorderAttrAccess( SwCache &rCach, const SwFrame *pFrame )
                    (pFrame->IsContentFrame() ?
                       static_cast<SwModify const *>(static_cast<const SwContentFrame*>(pFrame)->GetNode())->IsInCache() :
                       static_cast<SwModify const *>(static_cast<const SwLayoutFrame*>(pFrame)->GetFormat())->IsInCache()) ),
-    pConstructor( pFrame )
+    m_pConstructor( pFrame )
 {
 }
 
 SwCacheObj *SwBorderAttrAccess::NewObj()
 {
     const_cast<SwModify *>(static_cast<SwModify const *>(m_pOwner))->SetInCache( true );
-    return new SwBorderAttrs( static_cast<SwModify const *>(m_pOwner), pConstructor );
+    return new SwBorderAttrs( static_cast<SwModify const *>(m_pOwner), m_pConstructor );
 }
 
 SwBorderAttrs *SwBorderAttrAccess::Get()
commit d47547ff546cd7d150359d16e6f1b7972b22d3b2
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 13:30:13 2017 +0530

    lok: listen for DeleteAnnotation state changes
    
    Change-Id: I2ea0d237cbbfd912b012ed400a328bfb6546cdfb
    (cherry picked from commit 866582435fa8ea0a76ad08d07e7df3a344072c94)

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index a62b777..46d5aa4 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1399,6 +1399,7 @@ static void doc_iniUnoCommands ()
         OUString(".uno:Paste"),
         OUString(".uno:SelectAll"),
         OUString(".uno:InsertAnnotation"),
+        OUString(".uno:DeleteAnnotation"),
         OUString(".uno:ReplyComment"),
         OUString(".uno:InsertRowsBefore"),
         OUString(".uno:InsertRowsAfter"),
diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx
index 0beb487..40455e1 100644
--- a/sfx2/source/control/unoctitm.cxx
+++ b/sfx2/source/control/unoctitm.cxx
@@ -1042,6 +1042,7 @@ static void InterceptLOKStateChangeEvent(const SfxViewFrame* pViewFrame, const c
              aEvent.FeatureURL.Path == "Paste" ||
              aEvent.FeatureURL.Path == "SelectAll" ||
              aEvent.FeatureURL.Path == "InsertAnnotation" ||
+             aEvent.FeatureURL.Path == "DeleteAnnotation" ||
              aEvent.FeatureURL.Path == "InsertRowsBefore" ||
              aEvent.FeatureURL.Path == "InsertRowsAfter" ||
              aEvent.FeatureURL.Path == "InsertColumnsBefore" ||
commit ce5a895046a2f50735a7fe00992c32f66d285b7e
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Feb 20 11:27:53 2017 +0530

    gtktiledviewer: Different reply uno command for impress
    
    Change-Id: I9dcd32a7e64198ca4772f263ed89a458e298c53b
    (cherry picked from commit 57d75ba3176063249e27524a7c7e425b3a2e75b4)


... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list