[Libreoffice-commits] core.git: 2 commits - include/LibreOfficeKit libreofficekit/qa libreofficekit/source sw/inc sw/qa sw/source

Miklos Vajna vmiklos at collabora.co.uk
Thu Aug 18 09:38:36 UTC 2016


 include/LibreOfficeKit/LibreOfficeKitGtk.h          |    4 +-
 libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx |   34 +++++++++++++++++---
 libreofficekit/source/gtk/lokdocview.cxx            |    5 +-
 sw/inc/view.hxx                                     |    2 +
 sw/qa/extras/uiwriter/uiwriter.cxx                  |   30 +++++++++++++++++
 sw/source/uibase/app/docsh.cxx                      |    7 ++++
 sw/source/uibase/inc/uivwimp.hxx                    |    3 +
 sw/source/uibase/uiview/viewprt.cxx                 |   11 ++++++
 sw/source/uibase/uno/unotxdoc.cxx                   |    9 +++++
 9 files changed, 98 insertions(+), 7 deletions(-)

New commits:
commit f2afe318ce800c1b301f7e1aef769194aa676b12
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Aug 18 10:07:51 2016 +0200

    gtktiledviewer: specify author name when calling initializeForRendering()
    
    Open two views, and type into both of them when a Writer doc with
    redlining enabled is open: the manage changes dialog now shows how the
    correct author is used when creating the redline items.
    
    Change-Id: I48fb90301bfcc04b06d5be5544324ca76fe7b3d7

diff --git a/include/LibreOfficeKit/LibreOfficeKitGtk.h b/include/LibreOfficeKit/LibreOfficeKitGtk.h
index fc7cec1..cb96f20 100644
--- a/include/LibreOfficeKit/LibreOfficeKitGtk.h
+++ b/include/LibreOfficeKit/LibreOfficeKitGtk.h
@@ -75,10 +75,12 @@ GtkWidget*                     lok_doc_view_new_from_user_profile  (const gchar*
 /**
  * lok_doc_view_new_from_widget:
  * @pDocView: The #LOKDocView instance
+ * @pRenderingArguments: (nullable): lok::Document::initializeForRendering() arguments.
  *
  * Returns: (transfer none): The #LOKDocView widget instance.
  */
-GtkWidget*                     lok_doc_view_new_from_widget        (LOKDocView* pDocView);
+GtkWidget*                     lok_doc_view_new_from_widget        (LOKDocView* pDocView,
+                                                                    const gchar* pRenderingArguments);
 
 /**
  * lok_doc_view_open_document:
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index e975381..bd6650b 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -136,7 +136,10 @@ public:
     std::shared_ptr<TiledRowColumnBar> m_pRowBar;
     std::shared_ptr<TiledRowColumnBar> m_pColumnBar;
     std::shared_ptr<TiledCornerButton> m_pCornerButton;
+    /// Author string, used for comment insertion.
     std::string m_aAuthor;
+    /// Rendering arguments, which are the same for all views.
+    boost::property_tree::ptree m_aRenderingArguments;
 
     TiledWindow()
         : m_pDocView(nullptr),
@@ -174,8 +177,6 @@ public:
         m_pFindbarLabel(nullptr),
         m_bFindAll(false)
     {
-        struct passwd* pPasswd = getpwuid(getuid());
-        m_aAuthor = std::string(pPasswd->pw_gecos);
     }
 };
 
@@ -198,6 +199,14 @@ static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget)
     return g_aWindows[pToplevel];
 }
 
+/// Generate an author string for multiple views.
+static std::string getNextAuthor()
+{
+    static int nCounter = 0;
+    struct passwd* pPasswd = getpwuid(getuid());
+    return std::string(pPasswd->pw_gecos) + " #" + std::to_string(++nCounter);
+}
+
 TiledRowColumnBar::TiledRowColumnBar(TiledBarType eType)
     : m_pDrawingArea(gtk_drawing_area_new()),
     m_nSizePixel(0),
@@ -841,9 +850,19 @@ static void registerSelectorHandlers(TiledWindow& rWindow)
 static void createView(GtkWidget* pButton, gpointer /*pItem*/)
 {
     TiledWindow& rWindow = lcl_getTiledWindow(pButton);
-    GtkWidget* pDocView = lok_doc_view_new_from_widget(LOK_DOC_VIEW(rWindow.m_pDocView));
+
+    boost::property_tree::ptree aTree = rWindow.m_aRenderingArguments;
+    std::string aAuthor = getNextAuthor();
+    aTree.put(boost::property_tree::ptree::path_type(".uno:Author/type", '/'), "string");
+    aTree.put(boost::property_tree::ptree::path_type(".uno:Author/value", '/'), aAuthor);
+    std::stringstream aStream;
+    boost::property_tree::write_json(aStream, aTree);
+    std::string aArguments = aStream.str();
+
+    GtkWidget* pDocView = lok_doc_view_new_from_widget(LOK_DOC_VIEW(rWindow.m_pDocView), aArguments.c_str());
 
     TiledWindow& rNewWindow = setupWidgetAndCreateWindow(pDocView);
+    rNewWindow.m_aAuthor = aAuthor;
     // Hide the unused progress bar.
     gtk_widget_show_all(rNewWindow.m_pStatusBar);
     gtk_widget_hide(rNewWindow.m_pProgressBar);
@@ -866,7 +885,7 @@ static void createModelAndView(const char* pLOPath, const char* pDocPath, const
     const gchar* pUserProfile = aUserProfile.empty() ? nullptr : aUserProfile.c_str();
     GtkWidget* pDocView = lok_doc_view_new_from_user_profile(pLOPath, pUserProfile, nullptr, nullptr);
 
-    setupWidgetAndCreateWindow(pDocView);
+    TiledWindow& rWindow = setupWidgetAndCreateWindow(pDocView);
 
     boost::property_tree::ptree aTree;
     for (size_t i = 0; i < rArguments.size(); ++i)
@@ -892,6 +911,13 @@ static void createModelAndView(const char* pLOPath, const char* pDocPath, const
         }
     }
 
+    // Save rendering arguments for views which are created later.
+    rWindow.m_aRenderingArguments = aTree;
+
+    rWindow.m_aAuthor = getNextAuthor();
+    aTree.put(boost::property_tree::ptree::path_type(".uno:Author/type", '/'), "string");
+    aTree.put(boost::property_tree::ptree::path_type(".uno:Author/value", '/'), rWindow.m_aAuthor);
+
     std::stringstream aStream;
     boost::property_tree::write_json(aStream, aTree);
     std::string aArguments = aStream.str();
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 34cbd27..b4e53e1 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -3016,7 +3016,8 @@ lok_doc_view_new_from_user_profile (const gchar* pPath, const gchar* pUserProfil
                                      nullptr));
 }
 
-SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pOldLOKDocView)
+SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pOldLOKDocView,
+                                                             const gchar* pRenderingArguments)
 {
     LOKDocViewPrivate& pOldPriv = getPrivate(pOldLOKDocView);
     GtkWidget* pNewDocView = GTK_WIDGET(g_initable_new(LOK_TYPE_DOC_VIEW, /*cancellable=*/nullptr, /*error=*/nullptr,
@@ -3034,7 +3035,7 @@ SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pOldLOK
     // Store the view id only later in postDocumentLoad(), as
     // initializeForRendering() changes the id in Impress.
     pDocument->pClass->createView(pDocument);
-    pNewPriv->m_aRenderingArguments = pOldPriv->m_aRenderingArguments;
+    pNewPriv->m_aRenderingArguments = pRenderingArguments;
 
     postDocumentLoad(pNewDocView);
     return pNewDocView;
commit cb9362faad9fe702031c5e657a31b1963ad4d374
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Aug 18 10:01:32 2016 +0200

    sw redlining: support per-view authors
    
    In case there are multiple SwView instances and SetRedlineAuthor() is
    called with a non-empty string on them, switching views will keep the
    SwModule redline author string up to date as expected.
    
    Change-Id: I363221049dbacd67d7c8f4ff3e778f8032a3bc43

diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx
index 891fdd8..ff08c5d 100644
--- a/sw/inc/view.hxx
+++ b/sw/inc/view.hxx
@@ -646,6 +646,8 @@ public:
     int getPart() const override;
     /// See SfxViewShell::dumpAsXml().
     void dumpAsXml(struct _xmlTextWriter* pWriter) const override;
+    void SetRedlineAuthor(const OUString& rAuthor);
+    const OUString& GetRedlineAuthor();
 };
 
 inline long SwView::GetXScroll() const
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index c0fa9e2..e6f851c 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -203,6 +203,7 @@ public:
     void testTdf84695NormalChar();
     void testTableStyleUndo();
     void testRedlineParam();
+    void testRedlineViewAuthor();
 
     CPPUNIT_TEST_SUITE(SwUiWriterTest);
     CPPUNIT_TEST(testReplaceForward);
@@ -307,6 +308,7 @@ public:
     CPPUNIT_TEST(testTdf84695NormalChar);
     CPPUNIT_TEST(testTableStyleUndo);
     CPPUNIT_TEST(testRedlineParam);
+    CPPUNIT_TEST(testRedlineViewAuthor);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -3857,6 +3859,34 @@ void SwUiWriterTest::testRedlineParam()
     CPPUNIT_ASSERT_EQUAL(OUString("aaamiddle"), pShellCursor->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
 }
 
+void SwUiWriterTest::testRedlineViewAuthor()
+{
+    // Test that setting an author at an SwView level has effect.
+
+    // Create a document with minimal content.
+    SwDoc* pDoc = createDoc();
+    SwDocShell* pDocShell = pDoc->GetDocShell();
+    SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
+    pWrtShell->Insert("middle");
+    SwView* pView = pDocShell->GetView();
+    const OUString aAuthor("A U. Thor");
+    pView->SetRedlineAuthor(aAuthor);
+    pDocShell->SetView(pView);
+
+    // Turn on track changes, and add changes to the start of the document.
+    uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
+    xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
+    pWrtShell->SttDoc();
+    pWrtShell->Insert("aaa");
+
+    // Now assert that SwView::SetRedlineAuthor() had an effect.
+    const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rTable.size());
+    SwRangeRedline* pRedline = rTable[0];
+    // This was 'Unknown Author' instead of 'A U. Thor'.
+    CPPUNIT_ASSERT_EQUAL(aAuthor, pRedline->GetAuthorString());
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
 CPPUNIT_PLUGIN_IMPLEMENT();
 
diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx
index 0670885..03ea367 100644
--- a/sw/source/uibase/app/docsh.cxx
+++ b/sw/source/uibase/app/docsh.cxx
@@ -1107,7 +1107,14 @@ void SwDocShell::SetView(SwView* pVw)
     SetViewShell_Impl(pVw);
     m_pView = pVw;
     if (m_pView)
+    {
         m_pWrtShell = &m_pView->GetWrtShell();
+
+        // Set view-specific redline author.
+        const OUString& rRedlineAuthor = m_pView->GetRedlineAuthor();
+        if (!rRedlineAuthor.isEmpty())
+            SW_MOD()->SetRedlineAuthor(m_pView->GetRedlineAuthor());
+    }
     else
         m_pWrtShell = nullptr;
 }
diff --git a/sw/source/uibase/inc/uivwimp.hxx b/sw/source/uibase/inc/uivwimp.hxx
index e7dddba..6ebf23d 100644
--- a/sw/source/uibase/inc/uivwimp.hxx
+++ b/sw/source/uibase/inc/uivwimp.hxx
@@ -119,6 +119,9 @@ class SwView_Impl
     bool                        m_bEditingPositionSet;
 
 public:
+    /// Redline author that's specific to this view.
+    OUString m_sRedlineAuthor;
+
     SwView_Impl(SwView* pShell);
     ~SwView_Impl();
 
diff --git a/sw/source/uibase/uiview/viewprt.cxx b/sw/source/uibase/uiview/viewprt.cxx
index 1b727c8..9a0abf6 100644
--- a/sw/source/uibase/uiview/viewprt.cxx
+++ b/sw/source/uibase/uiview/viewprt.cxx
@@ -65,6 +65,7 @@
 #include <svl/slstitm.hxx>
 
 #include <unomid.h>
+#include <uivwimp.hxx>
 
 using namespace ::com::sun::star;
 
@@ -268,6 +269,16 @@ void SwView::dumpAsXml(xmlTextWriterPtr pWriter) const
     xmlTextWriterEndElement(pWriter);
 }
 
+void SwView::SetRedlineAuthor(const OUString& rAuthor)
+{
+    m_pViewImpl->m_sRedlineAuthor = rAuthor;
+}
+
+const OUString& SwView::GetRedlineAuthor()
+{
+    return m_pViewImpl->m_sRedlineAuthor;
+}
+
 // Create page printer/additions for SwView and SwPagePreview
 
 VclPtr<SfxTabPage> CreatePrintOptionsPage( vcl::Window *pParent,
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 20a4d1a..1214162 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3277,6 +3277,15 @@ void SwXTextDocument::initializeForTiledRendering(const css::uno::Sequence<css::
             aViewOption.SetHideWhitespaceMode(rValue.Value.get<bool>());
         else if (rValue.Name == ".uno:ShowBorderShadow" && rValue.Value.has<bool>())
             SwViewOption::SetAppearanceFlag(ViewOptFlags::Shadow , rValue.Value.get<bool>());
+        else if (rValue.Name == ".uno:Author" && rValue.Value.has<OUString>())
+        {
+            // Store the author name in the view.
+            pView->SetRedlineAuthor(rValue.Value.get<OUString>());
+            // Let the actual author name pick up the value from the current
+            // view, which would normally happen only during the next view
+            // switch.
+            pDocShell->SetView(pView);
+        }
     }
     pViewShell->ApplyViewOptions(aViewOption);
 


More information about the Libreoffice-commits mailing list