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 <[email protected]> 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 <[email protected]> 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); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
