[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