include/sfx2/viewsh.hxx | 1 libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx | 17 ++++++++- sfx2/source/view/viewsh.cxx | 8 ++++ sw/inc/view.hxx | 2 + sw/qa/extras/tiledrendering/tiledrendering.cxx | 36 ++++++++++++++++++++ sw/source/core/text/xmldump.cxx | 12 +++++- sw/source/uibase/shells/basesh.cxx | 20 ++++++----- sw/source/uibase/uiview/viewprt.cxx | 10 +++++ 8 files changed, 94 insertions(+), 12 deletions(-)
New commits: commit 5f86e619ce2e6a02e5ea23ef778f7062d30f2931 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jul 28 20:58:12 2016 +0200 sw layout xml dump: mention SfxViewShell addresses Change-Id: I2e5c8102684494fd3d7c1c70971a09d0c940a124 Reviewed-on: https://gerrit.libreoffice.org/27637 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> (cherry picked from commit 73c8bc849c0024d5d81ab0370cffa6aa24b56d22) diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx index afee970..d0bbbf0 100644 --- a/include/sfx2/viewsh.hxx +++ b/include/sfx2/viewsh.hxx @@ -333,6 +333,7 @@ public: bool isTiledSearching() const; /// See lok::Document::getPart(). virtual int getPart() const; + virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const; }; diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx index 92d3f1a..8210d88 100644 --- a/sfx2/source/view/viewsh.cxx +++ b/sfx2/source/view/viewsh.cxx @@ -85,6 +85,7 @@ #include <shellimpl.hxx> #include <vector> +#include <libxml/xmlwriter.h> using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -1648,6 +1649,13 @@ int SfxViewShell::getPart() const return 0; } +void SfxViewShell::dumpAsXml(xmlTextWriterPtr pWriter) const +{ + xmlTextWriterStartElement(pWriter, BAD_CAST("sfxViewShell")); + xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this); + xmlTextWriterEndElement(pWriter); +} + bool SfxViewShell::KeyInput( const KeyEvent &rKeyEvent ) /* [Description] diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx index f422ced..ff40f2c 100644 --- a/sw/inc/view.hxx +++ b/sw/inc/view.hxx @@ -651,6 +651,8 @@ public: static SvxSearchItem* GetSearchItem() { return m_pSrchItem; } /// See SfxViewShell::getPart(). int getPart() const override; + /// See SfxViewShell::dumpAsXml(). + void dumpAsXml(struct _xmlTextWriter* pWriter) const override; }; inline long SwView::GetXScroll() const diff --git a/sw/source/core/text/xmldump.cxx b/sw/source/core/text/xmldump.cxx index f3b7a8e..a300087 100644 --- a/sw/source/core/text/xmldump.cxx +++ b/sw/source/core/text/xmldump.cxx @@ -22,6 +22,7 @@ #include <anchoredobject.hxx> #include <libxml/xmlwriter.h> #include <SwPortionHandler.hxx> +#include <view.hxx> #include <svx/svdobj.hxx> class XmlPortionDumper:public SwPortionHandler @@ -297,9 +298,14 @@ void SwFrame::dumpAsXml( xmlTextWriterPtr writer ) const if (IsRootFrame()) { const SwRootFrame* pRootFrame = static_cast<const SwRootFrame*>(this); - xmlTextWriterStartElement(writer, BAD_CAST("shells")); - for (SwViewShell& rViewShell : pRootFrame->GetCurrShell()->GetRingContainer()) - rViewShell.dumpAsXml(writer); + xmlTextWriterStartElement(writer, BAD_CAST("sfxViewShells")); + SwView* pView = static_cast<SwView*>(SfxViewShell::GetFirst(true, checkSfxViewShell<SwView>)); + while (pView) + { + if (pView->GetObjectShell() == pRootFrame->GetCurrShell()->GetSfxViewShell()->GetObjectShell()) + pView->dumpAsXml(writer); + pView = static_cast<SwView*>(SfxViewShell::GetNext(*pView, true, checkSfxViewShell<SwView>)); + } xmlTextWriterEndElement(writer); } diff --git a/sw/source/uibase/uiview/viewprt.cxx b/sw/source/uibase/uiview/viewprt.cxx index 8d12214..ddcefec 100644 --- a/sw/source/uibase/uiview/viewprt.cxx +++ b/sw/source/uibase/uiview/viewprt.cxx @@ -19,6 +19,7 @@ #include <com/sun/star/text/NotePrintMode.hpp> #include <cstdarg> +#include <libxml/xmlwriter.h> #include <cmdid.h> #include <sfx2/request.hxx> #include <sfx2/progress.hxx> @@ -258,6 +259,15 @@ int SwView::getPart() const return nPage - 1; } +void SwView::dumpAsXml(xmlTextWriterPtr pWriter) const +{ + xmlTextWriterStartElement(pWriter, BAD_CAST("swView")); + SfxViewShell::dumpAsXml(pWriter); + if (m_pWrtShell) + m_pWrtShell->dumpAsXml(pWriter); + xmlTextWriterEndElement(pWriter); +} + // Create page printer/additions for SwView and SwPagePreview VclPtr<SfxTabPage> CreatePrintOptionsPage( vcl::Window *pParent, commit d50ef086b87dbfb28db1fc9f9e76fa33eadfaf35 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jul 28 12:47:29 2016 +0200 tdf#101168 sw: fix missing repaint on undo with multiple windows Need to lock / unlock all view shells, not just the current one. Change-Id: I754214a202c6bbb74daac6f933481cb3fe7b9dbb Reviewed-on: https://gerrit.libreoffice.org/27620 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> (cherry picked from commit 1e21c32a2f81b4ae5302fc8d537e4f200a1a3e76) diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 5a379bd3..6d65a8e 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -59,6 +59,7 @@ public: void testViewCursorCleanup(); void testViewLock(); void testTextEditViewInvalidations(); + void testUndoInvalidations(); CPPUNIT_TEST_SUITE(SwTiledRenderingTest); CPPUNIT_TEST(testRegisterCallback); @@ -83,6 +84,7 @@ public: CPPUNIT_TEST(testViewCursorCleanup); CPPUNIT_TEST(testViewLock); CPPUNIT_TEST(testTextEditViewInvalidations); + CPPUNIT_TEST(testUndoInvalidations); CPPUNIT_TEST_SUITE_END(); private: @@ -855,6 +857,40 @@ void SwTiledRenderingTest::testTextEditViewInvalidations() comphelper::LibreOfficeKit::setActive(false); } +void SwTiledRenderingTest::testUndoInvalidations() +{ + // Load a document and create two views. + comphelper::LibreOfficeKit::setActive(); + SwXTextDocument* pXTextDocument = createDoc("dummy.fodt"); + ViewCallback aView1; + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1); + SfxLokHelper::createView(); + pXTextDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + ViewCallback aView2; + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView2); + + // Insert a character the end of the document. + SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell(); + pWrtShell->EndDoc(); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', 0); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); + CPPUNIT_ASSERT_EQUAL(OUString("Aaa bbb.c"), pShellCursor->GetPoint()->nNode.GetNode().GetTextNode()->GetText()); + + // Undo and assert that both views are invalidated. + aView1.m_bTilesInvalidated = false; + aView2.m_bTilesInvalidated = false; + comphelper::dispatchCommand(".uno:Undo", {}); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(aView1.m_bTilesInvalidated); + // Undo was dispatched on the first view, this second view was not invalidated. + CPPUNIT_ASSERT(aView2.m_bTilesInvalidated); + + mxComponent->dispose(); + mxComponent.clear(); + comphelper::LibreOfficeKit::setActive(false); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/uibase/shells/basesh.cxx b/sw/source/uibase/shells/basesh.cxx index bc17219..0b8fb13 100644 --- a/sw/source/uibase/shells/basesh.cxx +++ b/sw/source/uibase/shells/basesh.cxx @@ -488,15 +488,19 @@ void SwBaseShell::ExecUndo(SfxRequest &rReq) switch( nId ) { case SID_UNDO: - rWrtShell.LockPaint(); + for (SwViewShell& rShell : rWrtShell.GetRingContainer()) + rShell.LockPaint(); rWrtShell.Do( SwWrtShell::UNDO, nCnt ); - rWrtShell.UnlockPaint(); + for (SwViewShell& rShell : rWrtShell.GetRingContainer()) + rShell.UnlockPaint(); break; case SID_REDO: - rWrtShell.LockPaint(); + for (SwViewShell& rShell : rWrtShell.GetRingContainer()) + rShell.LockPaint(); rWrtShell.Do( SwWrtShell::REDO, nCnt ); - rWrtShell.UnlockPaint(); + for (SwViewShell& rShell : rWrtShell.GetRingContainer()) + rShell.UnlockPaint(); break; case SID_REPEAT: commit 0ab64f84571fa3c1aa31e886ef4792e3584a852f Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jul 28 10:34:38 2016 +0200 sw: rename generic rSh in SwBaseShell::ExecUndo() So that it's a bit more obvious it's not a base shell nor a view shell. Change-Id: I723a6394c59f4013576e3c4e2ff3016369d2227c Reviewed-on: https://gerrit.libreoffice.org/27616 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> (cherry picked from commit 9e903fc1d477e2f65653b36364de0c46a5151955) diff --git a/sw/source/uibase/shells/basesh.cxx b/sw/source/uibase/shells/basesh.cxx index 4ffe117..bc17219 100644 --- a/sw/source/uibase/shells/basesh.cxx +++ b/sw/source/uibase/shells/basesh.cxx @@ -474,7 +474,7 @@ void SwBaseShell::StateClpbrd(SfxItemSet &rSet) void SwBaseShell::ExecUndo(SfxRequest &rReq) { - SwWrtShell &rSh = GetShell(); + SwWrtShell &rWrtShell = GetShell(); sal_uInt16 nId = rReq.GetSlot(), nCnt = 1; const SfxItemSet* pArgs = rReq.GetArgs(); @@ -488,19 +488,19 @@ void SwBaseShell::ExecUndo(SfxRequest &rReq) switch( nId ) { case SID_UNDO: - rSh.LockPaint(); - rSh.Do( SwWrtShell::UNDO, nCnt ); - rSh.UnlockPaint(); + rWrtShell.LockPaint(); + rWrtShell.Do( SwWrtShell::UNDO, nCnt ); + rWrtShell.UnlockPaint(); break; case SID_REDO: - rSh.LockPaint(); - rSh.Do( SwWrtShell::REDO, nCnt ); - rSh.UnlockPaint(); + rWrtShell.LockPaint(); + rWrtShell.Do( SwWrtShell::REDO, nCnt ); + rWrtShell.UnlockPaint(); break; case SID_REPEAT: - rSh.Do( SwWrtShell::REPEAT ); + rWrtShell.Do( SwWrtShell::REPEAT ); break; default: OSL_FAIL("wrong Dispatcher"); commit d42992ac86e1feb5412ab7c496a8f717d5dd8225 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jul 28 09:52:25 2016 +0200 gtktiledviewer: quit after the last view is destroyed To allow debugging crash-on-exit problems. Change-Id: Ie54a8391e721c3ba8034b4618dd30733bac97a27 Reviewed-on: https://gerrit.libreoffice.org/27605 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> (cherry picked from commit 538ea31c992acb9d47ffd783543e50e149272aac) diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 5aeea19..034e15f 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -1210,13 +1210,28 @@ static void openDocumentCallback (GObject* source_object, GAsyncResult* res, gpo gtk_widget_hide(rWindow.m_pProgressBar); } +/** + * Wrapper around gtk_widget_destroy() that quits when the last tiled window is + * destroyed. + */ +static void destroyWindow(GtkWidget* pWidget) +{ + gtk_widget_destroy(pWidget); + auto it = g_aWindows.find(pWidget); + if (it != g_aWindows.end()) + g_aWindows.erase(it); + + if (g_aWindows.empty()) + gtk_main_quit(); +} + /// Creates the GtkWindow that has main widget as children and registers it in the window map. static GtkWidget* createWindow(TiledWindow& rWindow) { GtkWidget *pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(pWindow), "LibreOfficeKit GTK Tiled Viewer"); gtk_window_set_default_size(GTK_WINDOW(pWindow), 1024, 768); - g_signal_connect(pWindow, "destroy", G_CALLBACK(gtk_widget_destroy), pWindow); + g_signal_connect(pWindow, "destroy", G_CALLBACK(destroyWindow), pWindow); rWindow.m_pVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(pWindow), rWindow.m_pVBox); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits