[Libreoffice-commits] core.git: Branch 'feature/tiled-editing' - 4 commits - desktop/qa desktop/source include/LibreOfficeKit include/sfx2 include/vcl libreofficekit/source sfx2/source sw/inc sw/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Sep 16 05:15:23 PDT 2015


 desktop/qa/desktop_lib/test_desktop_lib.cxx |   12 +++++--
 desktop/source/lib/init.cxx                 |   47 +++++++++++++++++-----------
 include/LibreOfficeKit/LibreOfficeKit.h     |    9 +++--
 include/LibreOfficeKit/LibreOfficeKit.hxx   |   38 ++++++++++++++++------
 include/sfx2/lokhelper.hxx                  |   13 ++++---
 include/vcl/ITiledRenderable.hxx            |    8 ----
 libreofficekit/source/gtk/lokdocview.cxx    |   21 +++++++-----
 sfx2/source/view/lokhelper.cxx              |   41 ++++++++++++++++++++++--
 sw/inc/unotxdoc.hxx                         |    2 -
 sw/source/uibase/uno/unotxdoc.cxx           |    5 --
 10 files changed, 129 insertions(+), 67 deletions(-)

New commits:
commit 711598801a3ccd7d7564929b1917cdb64754a942
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Sep 16 14:14:04 2015 +0200

    LOK: make getViews() be a member function of Document
    
    Just to be consistent, as all other view-related member functions are
    there, too.
    
    No real impact, as only the unit test uses this so far, and it always
    works with a single document.
    
    Change-Id: I46f1ed8265ab95017986ab45c1b510e961192241

diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 7ad8127..0cd88ce 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -134,10 +134,10 @@ void DesktopLOKTest::testGetFonts()
 void DesktopLOKTest::testCreateView()
 {
     LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
-    CPPUNIT_ASSERT_EQUAL(1, SfxLokHelper::getViews());
+    CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getViews(pDocument));
 
     int nId = pDocument->m_pDocumentClass->createView(pDocument);
-    CPPUNIT_ASSERT_EQUAL(2, SfxLokHelper::getViews());
+    CPPUNIT_ASSERT_EQUAL(2, pDocument->m_pDocumentClass->getViews(pDocument));
 
     // Make sure the created view is the active one, then switch to the old
     // one.
@@ -146,7 +146,7 @@ void DesktopLOKTest::testCreateView()
     CPPUNIT_ASSERT_EQUAL(0, pDocument->m_pDocumentClass->getView(pDocument));
 
     pDocument->m_pDocumentClass->destroyView(pDocument, nId);
-    CPPUNIT_ASSERT_EQUAL(1, SfxLokHelper::getViews());
+    CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getViews(pDocument));
     closeDoc();
 }
 
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index eba9c0b..4f17cb7 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -249,6 +249,7 @@ static int doc_createView(LibreOfficeKitDocument* pThis);
 static void doc_destroyView(LibreOfficeKitDocument* pThis, int nId);
 static void doc_setView(LibreOfficeKitDocument* pThis, int nId);
 static int doc_getView(LibreOfficeKitDocument* pThis);
+static int doc_getViews(LibreOfficeKitDocument* pThis);
 
 LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent) :
     mxComponent( xComponent )
@@ -284,6 +285,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
         m_pDocumentClass->destroyView = doc_destroyView;
         m_pDocumentClass->setView = doc_setView;
         m_pDocumentClass->getView = doc_getView;
+        m_pDocumentClass->getViews = doc_getViews;
 
         gDocumentClass = m_pDocumentClass;
     }
@@ -311,8 +313,6 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions  (LibreOfficeKit* pThi
 static void                    lo_registerCallback (LibreOfficeKit* pThis,
                                                     LibreOfficeKitCallback pCallback,
                                                     void* pData);
-static int lo_getViews(LibreOfficeKit* pThis);
-
 struct LibLibreOffice_Impl : public _LibreOfficeKit
 {
     OUString maLastExceptionMsg;
@@ -335,7 +335,6 @@ struct LibLibreOffice_Impl : public _LibreOfficeKit
             m_pOfficeClass->getError = lo_getError;
             m_pOfficeClass->documentLoadWithOptions = lo_documentLoadWithOptions;
             m_pOfficeClass->registerCallback = lo_registerCallback;
-            m_pOfficeClass->getViews = lo_getViews;
 
             gOfficeClass = m_pOfficeClass;
         }
@@ -453,11 +452,6 @@ static void lo_registerCallback (LibreOfficeKit* pThis,
     pLib->mpCallbackData = pData;
 }
 
-static int lo_getViews(LibreOfficeKit* /*pThis*/)
-{
-    return SfxLokHelper::getViews();
-}
-
 static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* sUrl, const char* pFormat, const char* pFilterOptions)
 {
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
@@ -1019,6 +1013,13 @@ static int doc_getView(LibreOfficeKitDocument* /*pThis*/)
     return SfxLokHelper::getView();
 }
 
+static int doc_getViews(LibreOfficeKitDocument* /*pThis*/)
+{
+    SolarMutexGuard aGuard;
+
+    return SfxLokHelper::getViews();
+}
+
 static char* lo_getError (LibreOfficeKit *pThis)
 {
     LibLibreOffice_Impl* pLib = static_cast<LibLibreOffice_Impl*>(pThis);
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 18f4b3e..fc025ae 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -54,9 +54,6 @@ struct _LibreOfficeKitClass
     void (*registerCallback) (LibreOfficeKit* pThis,
                               LibreOfficeKitCallback pCallback,
                               void* pData);
-
-    /// @see lok::Office::getViews().
-    int (*getViews) (LibreOfficeKit* pThis);
 #endif
 };
 
@@ -174,6 +171,8 @@ struct _LibreOfficeKitDocumentClass
     void (*setView) (LibreOfficeKitDocument* pThis, int nId);
     /// @see lok::Document::getView().
     int (*getView) (LibreOfficeKitDocument* pThis);
+    /// @see lok::Document::getViews().
+    int (*getViews) (LibreOfficeKitDocument* pThis);
 #endif // LOK_USE_UNSTABLE_API
 };
 
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index f5821b7..45ace9d 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -294,6 +294,14 @@ public:
     {
         return mpDoc->pClass->getView(mpDoc);
     }
+
+    /**
+     * Get number of views of this document.
+     */
+    inline int getViews()
+    {
+        return mpDoc->pClass->getViews(mpDoc);
+    }
 #endif // LOK_USE_UNSTABLE_API
 };
 
@@ -340,16 +348,6 @@ public:
     {
         return mpThis->pClass->getError(mpThis);
     }
-
-#ifdef LOK_USE_UNSTABLE_API
-    /**
-     * Get number of total views.
-     */
-    inline int getViews()
-    {
-        return mpThis->pClass->getViews(mpThis);
-    }
-#endif
 };
 
 /// Factory method to create a lok::Office instance.
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index 5051622..99f2076 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -25,9 +25,8 @@ public:
     static void setView(size_t nId);
     /// Get the currently active view.
     static size_t getView();
-
-    /// Total number of view shells.
-    static int getViews();
+    /// Get the number of views of the current object shell.
+    static size_t getViews();
 };
 
 #endif
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index 0beb06d..646715e 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -62,10 +62,19 @@ size_t SfxLokHelper::getView()
     return 0;
 }
 
-int SfxLokHelper::getViews()
+size_t SfxLokHelper::getViews()
 {
+    size_t nRet = 0;
+
+    SfxObjectShell* pObjectShell = SfxViewFrame::Current()->GetObjectShell();
     SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl();
-    return rViewArr.size();
+    for (size_t i = 0; i < rViewArr.size(); ++i)
+    {
+        if (rViewArr[i]->GetObjectShell() == pObjectShell)
+            ++nRet;
+    }
+
+    return nRet;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 3c01b6cdc3f52340a1a55cba6a33b01b5f5ee2c7
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Sep 16 12:30:25 2015 +0200

    gtktiledviewer: use setView() before postKeyEvent()
    
    Also in SfxLokHelper::setView() set the current view shell directly,
    GetFocus() in VCL may be a NOP for hidden windows.
    
    With this, the Writer layout dump shows that two Gtk windows can have
    different cursor positions correctly.
    
    Change-Id: I81890c1d8ad7972f1194db3d5f2e9d8a39fc2f87

diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 271625f..25f1c48 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -106,6 +106,9 @@ struct _LOKDocViewPrivate
     /// If we are in the middle of a drag of a graphic selection handle.
     gboolean m_bInDragGraphicHandles[8];
     ///@}
+
+    /// View ID, returned by createView() or 0 by default.
+    int m_nViewId;
 };
 
 enum
@@ -240,6 +243,7 @@ postKeyEventInThread(gpointer data)
     LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView));
     LOEvent* pLOEvent = static_cast<LOEvent*>(g_task_get_task_data(task));
 
+    priv->m_pDocument->pClass->setView(priv->m_pDocument, priv->m_nViewId);
     priv->m_pDocument->pClass->postKeyEvent(priv->m_pDocument,
                                             pLOEvent->m_nKeyEvent,
                                             pLOEvent->m_nCharCode,
@@ -1847,18 +1851,19 @@ lok_doc_view_new (const gchar* pPath, GCancellable *cancellable, GError **error)
     return GTK_WIDGET (g_initable_new (LOK_TYPE_DOC_VIEW, cancellable, error, "lopath", pPath, NULL));
 }
 
-SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pLOKDocView)
+SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pOldLOKDocView)
 {
-    LOKDocViewPrivate* priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private(pLOKDocView));
-    GtkWidget* pDocView = GTK_WIDGET(g_initable_new(LOK_TYPE_DOC_VIEW, /*cancellable=*/0, /*error=*/0,
-                                                    "lopath", priv->m_aLOPath, "lopointer", priv->m_pOffice, "docpointer", priv->m_pDocument, NULL));
+    LOKDocViewPrivate* pOldPriv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private(pOldLOKDocView));
+    GtkWidget* pNewDocView = GTK_WIDGET(g_initable_new(LOK_TYPE_DOC_VIEW, /*cancellable=*/0, /*error=*/0,
+                                                       "lopath", pOldPriv->m_aLOPath, "lopointer", pOldPriv->m_pOffice, "docpointer", pOldPriv->m_pDocument, NULL));
 
     // No documentLoad(), just a createView().
-    LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(pDocView));
-    pDocument->pClass->createView(pDocument);
+    LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(pNewDocView));
+    LOKDocViewPrivate* pNewPriv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private(LOK_DOC_VIEW(pNewDocView)));
+    pNewPriv->m_nViewId = pDocument->pClass->createView(pDocument);
 
-    postDocumentLoad(pDocView);
-    return pDocView;
+    postDocumentLoad(pNewDocView);
+    return pNewDocView;
 }
 
 /**
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index f53d2b3..0beb06d 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -46,7 +46,7 @@ void SfxLokHelper::setView(size_t nId)
 
     SfxViewShell* pViewShell = rViewArr[nId];
     if (SfxViewFrame* pViewFrame = pViewShell->GetViewFrame())
-        pViewFrame->GetWindow().GrabFocus();
+        pViewFrame->MakeActive_Impl(false);
 }
 
 size_t SfxLokHelper::getView()
commit b18b49b529c4b97c7cc97438424ed33d6746e364
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Sep 16 10:32:34 2015 +0200

    Use SfxViewFrame::Current()
    
    Allows getting rid of vcl::ITiledRenderable::getCurrentViewShell(),
    which would do the same, just not implemented outside Writer.
    
    Change-Id: Id26ceca560fb9002dc2d5c740c411b9c4a149523

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index a0f1110..eba9c0b 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -991,19 +991,11 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
     }
 }
 
-static int doc_createView(LibreOfficeKitDocument* pThis)
+static int doc_createView(LibreOfficeKitDocument* /*pThis*/)
 {
     SolarMutexGuard aGuard;
 
-    ITiledRenderable* pDoc = getTiledRenderable(pThis);
-    if (!pDoc)
-    {
-        gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering";
-        return -1;
-    }
-
-    SfxViewShell* pViewShell = pDoc->getCurrentViewShell();
-    return SfxLokHelper::createView(pViewShell);
+    return SfxLokHelper::createView();
 }
 
 static void doc_destroyView(LibreOfficeKitDocument* /*pThis*/, int nId)
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index a05cd5d..5051622 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -17,8 +17,8 @@ class SfxViewShell;
 class SFX2_DLLPUBLIC SfxLokHelper
 {
 public:
-    /// Create a new view shell for pViewShell's object shell.
-    static int createView(SfxViewShell* pViewShell);
+    /// Create a new view shell from the current view frame.
+    static int createView();
     /// Destroy a view shell from the global shell list.
     static void destroyView(size_t nId);
     /// Set a view shell as current one.
diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx
index a31d808..6639745 100644
--- a/include/vcl/ITiledRenderable.hxx
+++ b/include/vcl/ITiledRenderable.hxx
@@ -16,8 +16,6 @@
 #include <tools/gen.hxx>
 #include <vcl/virdev.hxx>
 
-class SfxViewShell;
-
 namespace vcl
 {
 
@@ -141,12 +139,6 @@ public:
      * @see lok::Document::resetSelection().
      */
     virtual void resetSelection() = 0;
-
-    /// Get the currently active view shell of the document.
-    virtual SfxViewShell* getCurrentViewShell()
-    {
-        return 0;
-    }
 };
 
 } // namespace vcl
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index 0aea6db..f53d2b3 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -15,9 +15,9 @@
 
 #include <shellimpl.hxx>
 
-int SfxLokHelper::createView(SfxViewShell* pViewShell)
+int SfxLokHelper::createView()
 {
-    SfxViewFrame* pViewFrame = pViewShell->GetViewFrame();
+    SfxViewFrame* pViewFrame = SfxViewFrame::Current();
     SfxRequest aRequest(pViewFrame, SID_NEWWINDOW);
     pViewFrame->ExecView_Impl(aRequest);
 
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index 0ca6e5b..8306b83 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -428,8 +428,6 @@ public:
     virtual void setGraphicSelection(int nType, int nX, int nY) SAL_OVERRIDE;
     /// @see vcl::ITiledRenderable::resetSelection().
     virtual void resetSelection() SAL_OVERRIDE;
-    /// @see vcl::ITiledRenderable::getCurrentViewShell().
-    virtual SfxViewShell* getCurrentViewShell() SAL_OVERRIDE;
 
     // ::com::sun::star::tiledrendering::XTiledRenderable
     virtual void SAL_CALL paintTile( const ::css::uno::Any& Parent, ::sal_Int32 nOutputWidth, ::sal_Int32 nOutputHeight, ::sal_Int32 nTilePosX, ::sal_Int32 nTilePosY, ::sal_Int32 nTileWidth, ::sal_Int32 nTileHeight ) throw (::css::uno::RuntimeException, ::std::exception) SAL_OVERRIDE;
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index bd35606..fe75178 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3400,11 +3400,6 @@ void SwXTextDocument::resetSelection()
     pWrtShell->ResetSelect(0, false);
 }
 
-SfxViewShell* SwXTextDocument::getCurrentViewShell()
-{
-    return pDocShell->GetView();
-}
-
 void SAL_CALL SwXTextDocument::paintTile( const ::css::uno::Any& Parent, ::sal_Int32 nOutputWidth, ::sal_Int32 nOutputHeight, ::sal_Int32 nTilePosX, ::sal_Int32 nTilePosY, ::sal_Int32 nTileWidth, ::sal_Int32 nTileHeight ) throw (::css::uno::RuntimeException, ::std::exception)
 {
     SystemGraphicsData aData;
commit 8fbfba74539d49fd9f17c3732b3c0f002c2b2b97
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Sep 16 09:30:41 2015 +0200

    lok::Document: add get/setView()
    
    Change-Id: Ic3bce8f01d7e048e853c063c4bce1255845c60d0

diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 6baaa32..7ad8127 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -139,6 +139,12 @@ void DesktopLOKTest::testCreateView()
     int nId = pDocument->m_pDocumentClass->createView(pDocument);
     CPPUNIT_ASSERT_EQUAL(2, SfxLokHelper::getViews());
 
+    // Make sure the created view is the active one, then switch to the old
+    // one.
+    CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getView(pDocument));
+    pDocument->m_pDocumentClass->setView(pDocument, 0);
+    CPPUNIT_ASSERT_EQUAL(0, pDocument->m_pDocumentClass->getView(pDocument));
+
     pDocument->m_pDocumentClass->destroyView(pDocument, nId);
     CPPUNIT_ASSERT_EQUAL(1, SfxLokHelper::getViews());
     closeDoc();
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 0d1e870..a0f1110 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -247,6 +247,8 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
 
 static int doc_createView(LibreOfficeKitDocument* pThis);
 static void doc_destroyView(LibreOfficeKitDocument* pThis, int nId);
+static void doc_setView(LibreOfficeKitDocument* pThis, int nId);
+static int doc_getView(LibreOfficeKitDocument* pThis);
 
 LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent) :
     mxComponent( xComponent )
@@ -280,6 +282,8 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
 
         m_pDocumentClass->createView = doc_createView;
         m_pDocumentClass->destroyView = doc_destroyView;
+        m_pDocumentClass->setView = doc_setView;
+        m_pDocumentClass->getView = doc_getView;
 
         gDocumentClass = m_pDocumentClass;
     }
@@ -1009,6 +1013,20 @@ static void doc_destroyView(LibreOfficeKitDocument* /*pThis*/, int nId)
     SfxLokHelper::destroyView(nId);
 }
 
+static void doc_setView(LibreOfficeKitDocument* /*pThis*/, int nId)
+{
+    SolarMutexGuard aGuard;
+
+    SfxLokHelper::setView(nId);
+}
+
+static int doc_getView(LibreOfficeKitDocument* /*pThis*/)
+{
+    SolarMutexGuard aGuard;
+
+    return SfxLokHelper::getView();
+}
+
 static char* lo_getError (LibreOfficeKit *pThis)
 {
     LibLibreOffice_Impl* pLib = static_cast<LibLibreOffice_Impl*>(pThis);
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 7f41d13..18f4b3e 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -170,6 +170,10 @@ struct _LibreOfficeKitDocumentClass
     int (*createView) (LibreOfficeKitDocument* pThis);
     /// @see lok::Document::destroyView().
     void (*destroyView) (LibreOfficeKitDocument* pThis, int nId);
+    /// @see lok::Document::setView().
+    void (*setView) (LibreOfficeKitDocument* pThis, int nId);
+    /// @see lok::Document::getView().
+    int (*getView) (LibreOfficeKitDocument* pThis);
 #endif // LOK_USE_UNSTABLE_API
 };
 
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index 3e1a0ac..f5821b7 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -269,13 +269,31 @@ public:
     }
 
     /**
-     * Destroy a view of an existring document.
+     * Destroy a view of an existing document.
      * @param nId a view ID, returned by createView().
      */
     void destroyView(int nId)
     {
         mpDoc->pClass->destroyView(mpDoc, nId);
     }
+
+    /**
+     * Set an existing view of an existing document as current.
+     * @param nId a view ID, returned by createView().
+     */
+    void setView(int nId)
+    {
+        mpDoc->pClass->setView(mpDoc, nId);
+    }
+
+    /**
+     * Get the current view.
+     * @return a view ID, previously returned by createView().
+     */
+    int getView()
+    {
+        return mpDoc->pClass->getView(mpDoc);
+    }
 #endif // LOK_USE_UNSTABLE_API
 };
 
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index b57cb7d..a05cd5d 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -21,6 +21,10 @@ public:
     static int createView(SfxViewShell* pViewShell);
     /// Destroy a view shell from the global shell list.
     static void destroyView(size_t nId);
+    /// Set a view shell as current one.
+    static void setView(size_t nId);
+    /// Get the currently active view.
+    static size_t getView();
 
     /// Total number of view shells.
     static int getViews();
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index 557478a..0aea6db 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -38,6 +38,30 @@ void SfxLokHelper::destroyView(size_t nId)
     pViewFrame->Exec_Impl(aRequest);
 }
 
+void SfxLokHelper::setView(size_t nId)
+{
+    SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl();
+    if (nId > rViewArr.size() - 1)
+        return;
+
+    SfxViewShell* pViewShell = rViewArr[nId];
+    if (SfxViewFrame* pViewFrame = pViewShell->GetViewFrame())
+        pViewFrame->GetWindow().GrabFocus();
+}
+
+size_t SfxLokHelper::getView()
+{
+    SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl();
+    SfxViewFrame* pViewFrame = SfxViewFrame::Current();
+    for (size_t i = 0; i < rViewArr.size(); ++i)
+    {
+        if (rViewArr[i]->GetViewFrame() == pViewFrame)
+            return i;
+    }
+    assert(false);
+    return 0;
+}
+
 int SfxLokHelper::getViews()
 {
     SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl();


More information about the Libreoffice-commits mailing list