[Libreoffice-commits] core.git: Branch 'feature/tiled-editing' - 7 commits - include/LibreOfficeKit libreofficekit/qa libreofficekit/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Sep 16 00:25:47 PDT 2015


 include/LibreOfficeKit/LibreOfficeKitGtk.h          |    2 
 libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx |  256 +++++++++++---------
 libreofficekit/source/gtk/lokdocview.cxx            |  112 ++++++--
 3 files changed, 232 insertions(+), 138 deletions(-)

New commits:
commit d4c2efba8601f202376156438961f4ab0eb1dcbe
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Sep 16 09:22:17 2015 +0200

    gtktiledviewer: add setupWidgetAndCreateWindow() to avoid copy&paste
    
    Change-Id: Ibbbaaa1c148cfd4578ad37e0f99b62ab885a1a83

diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index 74a4649..b16993b 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -79,6 +79,7 @@ static std::map<GtkWidget*, TiledWindow> g_aWindows;
 
 static void setupDocView(GtkWidget* pDocView);
 static GtkWidget* createWindow(TiledWindow& rWindow);
+static void openDocumentCallback (GObject* source_object, GAsyncResult* res, gpointer userdata);
 
 static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget)
 {
@@ -192,17 +193,34 @@ static void toggleFindbar(GtkWidget* pButton, gpointer /*pItem*/)
     }
 }
 
-/// Calls lok::Document::createView().
-static void createView(GtkWidget* pButton, gpointer /*pItem*/)
+/// Common initialization, regardless if it's just a new view or a full init.
+static void setupWidgetAndCreateWindow(GtkWidget* pDocView)
 {
-    TiledWindow& rWindow = lcl_getTiledWindow(pButton);
-    GtkWidget* pDocView = lok_doc_view_new_from_widget(LOK_DOC_VIEW(rWindow.m_pDocView));
     setupDocView(pDocView);
     TiledWindow aWindow;
     aWindow.m_pDocView = pDocView;
     createWindow(aWindow);
 }
 
+/// Creates a new view, i.e. no LOK init or document load.
+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));
+
+    setupWidgetAndCreateWindow(pDocView);
+}
+
+/// Creates a new model, i.e. LOK init and document load, one view implicitly.
+static void createModelAndView(const char* pLOPath, const char* pDocPath)
+{
+    GtkWidget* pDocView = lok_doc_view_new(pLOPath, 0, 0);
+
+    setupWidgetAndCreateWindow(pDocView);
+
+    lok_doc_view_open_document(LOK_DOC_VIEW(pDocView), pDocPath, 0, openDocumentCallback, pDocView);
+}
+
 /// Our GtkClipboardGetFunc implementation for HTML.
 static void htmlGetFunc(GtkClipboard* /*pClipboard*/, GtkSelectionData* pSelectionData, guint /*info*/, gpointer pUserData)
 {
@@ -751,12 +769,7 @@ int main( int argc, char* argv[] )
 
     gtk_init( &argc, &argv );
 
-    GtkWidget* pDocView = lok_doc_view_new(argv[1], NULL, NULL);
-    setupDocView(pDocView);
-    TiledWindow aWindow;
-    aWindow.m_pDocView = pDocView;
-    createWindow(aWindow);
-    lok_doc_view_open_document(LOK_DOC_VIEW(pDocView), argv[2], NULL, openDocumentCallback, pDocView);
+    createModelAndView(argv[1], argv[2]);
 
     gtk_main();
 
commit 5f8cdcec441093dd90d65cdbe72012d7a19a2dc7
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 15 15:41:46 2015 +0200

    lokdocview: set up the widget in all windows
    
    With this finally the number of GTK+ windows always match the number
    returned by SfxLokHelper::getViews().
    
    Change-Id: Ia45bef7dea86b80cfac00e2ad7c1a16d7f5b507b

diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index ff9b2cd..271625f 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -1850,8 +1850,15 @@ lok_doc_view_new (const gchar* pPath, GCancellable *cancellable, GError **error)
 SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pLOKDocView)
 {
     LOKDocViewPrivate* priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private(pLOKDocView));
-    return 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));
+    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));
+
+    // No documentLoad(), just a createView().
+    LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(pDocView));
+    pDocument->pClass->createView(pDocument);
+
+    postDocumentLoad(pDocView);
+    return pDocView;
 }
 
 /**
commit d6b6ccd16f11a6c0dac5aa94359fb53048eb6aef
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 15 15:36:51 2015 +0200

    lokdocview: avoid GTK+ calls in openDocumentInThread()
    
    GTK+ calls should be made from the main thread.
    
    Change-Id: Idcfa46d427d6e35fc544246a691bafc72f75a74c

diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index b185de3..ff9b2cd 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -143,6 +143,7 @@ enum
 static guint doc_view_signals[LAST_SIGNAL] = { 0 };
 
 static void lok_doc_view_initable_iface_init (GInitableIface *iface);
+static void callbackWorker (int nType, const char* pPayload, void* pData);
 
 SAL_DLLPUBLIC_EXPORT GType lok_doc_view_get_type();
 #ifdef __GNUC__
@@ -380,6 +381,37 @@ static gboolean queueDraw(gpointer pData)
     return G_SOURCE_REMOVE;
 }
 
+/// Set up LOKDocView after the document is loaded, invoked on the main thread by openDocumentInThread() running in a thread.
+static gboolean postDocumentLoad(gpointer pData)
+{
+    LOKDocView* pLOKDocView = static_cast<LOKDocView*>(pData);
+    LOKDocViewPrivate* priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private(pLOKDocView));
+
+    priv->m_pDocument->pClass->initializeForRendering(priv->m_pDocument);
+    priv->m_pDocument->pClass->registerCallback(priv->m_pDocument, callbackWorker, pLOKDocView);
+    priv->m_pDocument->pClass->getDocumentSize(priv->m_pDocument, &priv->m_nDocumentWidthTwips, &priv->m_nDocumentHeightTwips);
+    g_timeout_add(600, handleTimeout, pLOKDocView);
+
+    float zoom = priv->m_fZoom;
+    long nDocumentWidthTwips = priv->m_nDocumentWidthTwips;
+    long nDocumentHeightTwips = priv->m_nDocumentHeightTwips;
+    long nDocumentWidthPixels = twipToPixel(nDocumentWidthTwips, zoom);
+    long nDocumentHeightPixels = twipToPixel(nDocumentHeightTwips, zoom);
+    // Total number of columns in this document.
+    guint nColumns = ceil((double)nDocumentWidthPixels / nTileSizePixels);
+
+
+    priv->m_aTileBuffer = TileBuffer(priv->m_pDocument,
+                                     nColumns);
+    gtk_widget_set_size_request(GTK_WIDGET(pLOKDocView),
+                                nDocumentWidthPixels,
+                                nDocumentHeightPixels);
+    gtk_widget_set_can_focus(GTK_WIDGET(pLOKDocView), TRUE);
+    gtk_widget_grab_focus(GTK_WIDGET(pLOKDocView));
+
+    return G_SOURCE_REMOVE;
+}
+
 /// Implementation of the global callback handler, invoked by globalCallback();
 static gboolean
 globalCallback (gpointer pData)
@@ -617,8 +649,7 @@ callback (gpointer pData)
     return G_SOURCE_REMOVE;
 }
 
-static void
-callbackWorker (int nType, const char* pPayload, void* pData)
+static void callbackWorker (int nType, const char* pPayload, void* pData)
 {
     LOKDocView* pDocView = LOK_DOC_VIEW (pData);
 
@@ -1193,27 +1224,7 @@ openDocumentInThread (gpointer data)
     }
     else
     {
-        priv->m_pDocument->pClass->initializeForRendering(priv->m_pDocument);
-        priv->m_pDocument->pClass->registerCallback(priv->m_pDocument, callbackWorker, pDocView);
-        priv->m_pDocument->pClass->getDocumentSize(priv->m_pDocument, &priv->m_nDocumentWidthTwips, &priv->m_nDocumentHeightTwips);
-        g_timeout_add(600, handleTimeout, pDocView);
-
-        float zoom = priv->m_fZoom;
-        long nDocumentWidthTwips = priv->m_nDocumentWidthTwips;
-        long nDocumentHeightTwips = priv->m_nDocumentHeightTwips;
-        long nDocumentWidthPixels = twipToPixel(nDocumentWidthTwips, zoom);
-        long nDocumentHeightPixels = twipToPixel(nDocumentHeightTwips, zoom);
-        // Total number of columns in this document.
-        guint nColumns = ceil((double)nDocumentWidthPixels / nTileSizePixels);
-
-
-        priv->m_aTileBuffer = TileBuffer(priv->m_pDocument,
-                                         nColumns);
-        gtk_widget_set_size_request(GTK_WIDGET(pDocView),
-                                    nDocumentWidthPixels,
-                                    nDocumentHeightPixels);
-        gtk_widget_set_can_focus(GTK_WIDGET(pDocView), TRUE);
-        gtk_widget_grab_focus(GTK_WIDGET(pDocView));
+        gdk_threads_add_idle(postDocumentLoad, pDocView);
         g_task_return_boolean (task, true);
     }
 }
commit 6bdd5da0ecb756bdb4fd105349b5339ed23f4d89
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 15 15:22:53 2015 +0200

    gtktiledviewer: set up a new GtkWindow for a new view
    
    Change-Id: I9dcb5871c231a49bcd65a1187df6c3c81f92bd55

diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index 47d349b..74a4649 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -77,6 +77,9 @@ public:
 
 static std::map<GtkWidget*, TiledWindow> g_aWindows;
 
+static void setupDocView(GtkWidget* pDocView);
+static GtkWidget* createWindow(TiledWindow& rWindow);
+
 static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget)
 {
     GtkWidget* pToplevel = gtk_widget_get_toplevel(pWidget);
@@ -193,9 +196,11 @@ static void toggleFindbar(GtkWidget* pButton, gpointer /*pItem*/)
 static void createView(GtkWidget* pButton, gpointer /*pItem*/)
 {
     TiledWindow& rWindow = lcl_getTiledWindow(pButton);
-    LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView);
-    LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(pLOKDocView);
-    pDocument->pClass->createView(pDocument);
+    GtkWidget* pDocView = lok_doc_view_new_from_widget(LOK_DOC_VIEW(rWindow.m_pDocView));
+    setupDocView(pDocView);
+    TiledWindow aWindow;
+    aWindow.m_pDocView = pDocView;
+    createWindow(aWindow);
 }
 
 /// Our GtkClipboardGetFunc implementation for HTML.
commit ca09f12b5be66e4f173afaf3a9e7a96fc0d6d24c
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 15 15:05:51 2015 +0200

    gtktiledviewer: factor out setupDocView() from main()
    
    Change-Id: Iac803f03267859c11f0f9090346b09b90c115b76

diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index bdba91c..47d349b 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -717,6 +717,21 @@ static GtkWidget* createWindow(TiledWindow& rWindow)
     return pWindow;
 }
 
+/// Common setup for DocView (regardless if it's just a new view or a document to be loaded).
+static void setupDocView(GtkWidget* pDocView)
+{
+#if GLIB_CHECK_VERSION(2,40,0)
+    g_assert_nonnull(pDocView);
+#endif
+    g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL);
+    g_signal_connect(pDocView, "command-changed", G_CALLBACK(signalCommand), NULL);
+    g_signal_connect(pDocView, "search-not-found", G_CALLBACK(signalSearch), NULL);
+    g_signal_connect(pDocView, "part-changed", G_CALLBACK(signalPart), NULL);
+    g_signal_connect(pDocView, "size-changed", G_CALLBACK(signalSize), NULL);
+    g_signal_connect(pDocView, "hyperlink-clicked", G_CALLBACK(signalHyperlink), NULL);
+    g_signal_connect(pDocView, "cursor-changed", G_CALLBACK(cursorChanged), NULL);
+}
+
 int main( int argc, char* argv[] )
 {
     if( argc < 3 ||
@@ -731,19 +746,8 @@ int main( int argc, char* argv[] )
 
     gtk_init( &argc, &argv );
 
-    // Docview
-    GtkWidget* pDocView = lok_doc_view_new (argv[1], NULL, NULL);
-#if GLIB_CHECK_VERSION(2,40,0)
-    g_assert_nonnull(pDocView);
-#endif
-    g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL);
-    g_signal_connect(pDocView, "command-changed", G_CALLBACK(signalCommand), NULL);
-    g_signal_connect(pDocView, "search-not-found", G_CALLBACK(signalSearch), NULL);
-    g_signal_connect(pDocView, "part-changed", G_CALLBACK(signalPart), NULL);
-    g_signal_connect(pDocView, "size-changed", G_CALLBACK(signalSize), NULL);
-    g_signal_connect(pDocView, "hyperlink-clicked", G_CALLBACK(signalHyperlink), NULL);
-    g_signal_connect(pDocView, "cursor-changed", G_CALLBACK(cursorChanged), NULL);
-
+    GtkWidget* pDocView = lok_doc_view_new(argv[1], NULL, NULL);
+    setupDocView(pDocView);
     TiledWindow aWindow;
     aWindow.m_pDocView = pDocView;
     createWindow(aWindow);
commit 7091ae96a475652842fd6642e33c295bb3164c50
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 15 14:51:06 2015 +0200

    gtktiledviewer: factor out createWindow() from main()
    
    Change-Id: Ib7ccd2192247805205b65e5e8da67bcc826f4d31

diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index fbd2bc3..bdba91c 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -547,70 +547,58 @@ static void openDocumentCallback (GObject* source_object, GAsyncResult* res, gpo
     gtk_widget_hide(rWindow.m_pStatusBar);
 }
 
-int main( int argc, char* argv[] )
+/// Creates the GtkWindow that has main widget as children and registers it in the window map.
+static GtkWidget* createWindow(TiledWindow& rWindow)
 {
-    if( argc < 3 ||
-        ( argc > 1 && ( !strcmp( argv[1], "--help" ) || !strcmp( argv[1], "-h" ) ) ) )
-        return help();
-
-    if ( argv[1][0] != '/' )
-    {
-        fprintf(stderr, "Absolute path required to libreoffice install\n");
-        return 1;
-    }
-
-    gtk_init( &argc, &argv );
-
-    GtkWidget *pWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
-    TiledWindow aWindow;
-    gtk_window_set_title( GTK_WINDOW(pWindow), "LibreOfficeKit GTK Tiled Viewer" );
+    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_main_quit), NULL );
+    g_signal_connect(pWindow, "destroy", G_CALLBACK(gtk_main_quit), 0);
 
-    aWindow.m_pVBox = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0 );
-    gtk_container_add( GTK_CONTAINER(pWindow), aWindow.m_pVBox );
+    rWindow.m_pVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+    gtk_container_add(GTK_CONTAINER(pWindow), rWindow.m_pVBox);
 
     // Toolbar
     GtkWidget* pToolbar = gtk_toolbar_new();
-    gtk_toolbar_set_style( GTK_TOOLBAR(pToolbar), GTK_TOOLBAR_ICONS );
+    gtk_toolbar_set_style(GTK_TOOLBAR(pToolbar), GTK_TOOLBAR_ICONS);
 
-    GtkToolItem* pZoomIn = gtk_tool_button_new( NULL, NULL );
+    GtkToolItem* pZoomIn = gtk_tool_button_new(NULL, NULL);
     gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pZoomIn), "zoom-in-symbolic");
     gtk_tool_item_set_tooltip_text(pZoomIn, "Zoom In");
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoomIn, 0);
-    g_signal_connect( G_OBJECT(pZoomIn), "clicked", G_CALLBACK(changeZoom), NULL );
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pZoomIn, 0);
+    g_signal_connect(G_OBJECT(pZoomIn), "clicked", G_CALLBACK(changeZoom), NULL);
 
-    GtkToolItem* pZoom1 = gtk_tool_button_new( NULL, NULL );
-    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pZoom1), "zoom-original-symbolic");
+    GtkToolItem* pZoom1 = gtk_tool_button_new(NULL, NULL);
+    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(pZoom1), "zoom-original-symbolic");
     gtk_tool_item_set_tooltip_text(pZoom1, "Normal Size");
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoom1, -1);
-    g_signal_connect( G_OBJECT(pZoom1), "clicked", G_CALLBACK(changeZoom), NULL );
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pZoom1, -1);
+    g_signal_connect(G_OBJECT(pZoom1), "clicked", G_CALLBACK(changeZoom), NULL);
 
-    GtkToolItem* pZoomOut = gtk_tool_button_new( NULL, NULL );
+    GtkToolItem* pZoomOut = gtk_tool_button_new(NULL, NULL);
     gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pZoomOut), "zoom-out-symbolic");
     gtk_tool_item_set_tooltip_text(pZoomOut, "Zoom Out");
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoomOut, -1);
-    g_signal_connect( G_OBJECT(pZoomOut), "clicked", G_CALLBACK(changeZoom), NULL );
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pZoomOut, -1);
+    g_signal_connect(G_OBJECT(pZoomOut), "clicked", G_CALLBACK(changeZoom), NULL);
 
     GtkToolItem* pSeparator1 = gtk_separator_tool_item_new();
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pSeparator1, -1);
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pSeparator1, -1);
 
     GtkToolItem* pPartSelectorToolItem = gtk_tool_item_new();
     GtkWidget* pComboBox = gtk_combo_box_text_new();
-    gtk_container_add( GTK_CONTAINER(pPartSelectorToolItem), pComboBox );
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pPartSelectorToolItem, -1 );
+    gtk_container_add(GTK_CONTAINER(pPartSelectorToolItem), pComboBox);
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pPartSelectorToolItem, -1);
 
-    aWindow.m_pPartSelector = GTK_COMBO_BOX_TEXT(pComboBox);
+    rWindow.m_pPartSelector = GTK_COMBO_BOX_TEXT(pComboBox);
 
     GtkToolItem* pSeparator2 = gtk_separator_tool_item_new();
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pSeparator2, -1);
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pSeparator2, -1);
 
     GtkToolItem* pPartModeSelectorToolItem = gtk_tool_item_new();
-    aWindow.m_pPartModeComboBox = gtk_combo_box_text_new();
-    gtk_container_add(GTK_CONTAINER(pPartModeSelectorToolItem), aWindow.m_pPartModeComboBox);
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pPartModeSelectorToolItem, -1 );
+    rWindow.m_pPartModeComboBox = gtk_combo_box_text_new();
+    gtk_container_add(GTK_CONTAINER(pPartModeSelectorToolItem), rWindow.m_pPartModeComboBox);
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pPartModeSelectorToolItem, -1);
 
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1);
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1);
 
     // Cut, copy & paste.
     GtkToolItem* pCopyButton = gtk_tool_button_new( NULL, NULL);
@@ -621,7 +609,7 @@ int main( int argc, char* argv[] )
     gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1);
 
     GtkToolItem* pEnableEditing = gtk_toggle_tool_button_new();
-    aWindow.m_pEnableEditing = pEnableEditing;
+    rWindow.m_pEnableEditing = pEnableEditing;
     gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pEnableEditing), "insert-text-symbolic");
     gtk_tool_item_set_tooltip_text(pEnableEditing, "Edit");
     gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pEnableEditing, -1);
@@ -639,77 +627,115 @@ int main( int argc, char* argv[] )
     gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pNewViewButton, -1);
     g_signal_connect(G_OBJECT(pNewViewButton), "clicked", G_CALLBACK(createView), NULL);
 
-    gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1);
-
-    aWindow.m_pBold = gtk_toggle_tool_button_new();
-    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (aWindow.m_pBold), "format-text-bold-symbolic");
-    gtk_tool_item_set_tooltip_text(aWindow.m_pBold, "Bold");
-    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), aWindow.m_pBold, -1);
-    g_signal_connect(G_OBJECT(aWindow.m_pBold), "toggled", G_CALLBACK(toggleToolItem), NULL);
-    lcl_registerToolItem(aWindow, aWindow.m_pBold, ".uno:Bold");
-
-    aWindow.m_pItalic = gtk_toggle_tool_button_new();
-    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (aWindow.m_pItalic), "format-text-italic-symbolic");
-    gtk_tool_item_set_tooltip_text(aWindow.m_pItalic, "Italic");
-    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), aWindow.m_pItalic, -1);
-    g_signal_connect(G_OBJECT(aWindow.m_pItalic), "toggled", G_CALLBACK(toggleToolItem), NULL);
-    lcl_registerToolItem(aWindow, aWindow.m_pItalic, ".uno:Italic");
-
-    aWindow.m_pUnderline = gtk_toggle_tool_button_new();
-    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (aWindow.m_pUnderline), "format-text-underline-symbolic");
-    gtk_tool_item_set_tooltip_text(aWindow.m_pUnderline, "Underline");
-    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), aWindow.m_pUnderline, -1);
-    g_signal_connect(G_OBJECT(aWindow.m_pUnderline), "toggled", G_CALLBACK(toggleToolItem), NULL);
-    lcl_registerToolItem(aWindow, aWindow.m_pUnderline, ".uno:Underline");
-
-    aWindow.m_pStrikethrough = gtk_toggle_tool_button_new ();
-    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(aWindow.m_pStrikethrough), "format-text-strikethrough-symbolic");
-    gtk_tool_item_set_tooltip_text(aWindow.m_pStrikethrough, "Strikethrough");
-    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), aWindow.m_pStrikethrough, -1);
-    g_signal_connect(G_OBJECT(aWindow.m_pStrikethrough), "toggled", G_CALLBACK(toggleToolItem), NULL);
-    lcl_registerToolItem(aWindow, aWindow.m_pStrikethrough, ".uno:Strikeout");
-
-    gtk_box_pack_start( GTK_BOX(aWindow.m_pVBox), pToolbar, FALSE, FALSE, 0 ); // Adds to top.
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1);
+
+    rWindow.m_pBold = gtk_toggle_tool_button_new();
+    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(rWindow.m_pBold), "format-text-bold-symbolic");
+    gtk_tool_item_set_tooltip_text(rWindow.m_pBold, "Bold");
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), rWindow.m_pBold, -1);
+    g_signal_connect(G_OBJECT(rWindow.m_pBold), "toggled", G_CALLBACK(toggleToolItem), NULL);
+    lcl_registerToolItem(rWindow, rWindow.m_pBold, ".uno:Bold");
+
+    rWindow.m_pItalic = gtk_toggle_tool_button_new();
+    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (rWindow.m_pItalic), "format-text-italic-symbolic");
+    gtk_tool_item_set_tooltip_text(rWindow.m_pItalic, "Italic");
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), rWindow.m_pItalic, -1);
+    g_signal_connect(G_OBJECT(rWindow.m_pItalic), "toggled", G_CALLBACK(toggleToolItem), NULL);
+    lcl_registerToolItem(rWindow, rWindow.m_pItalic, ".uno:Italic");
+
+    rWindow.m_pUnderline = gtk_toggle_tool_button_new();
+    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (rWindow.m_pUnderline), "format-text-underline-symbolic");
+    gtk_tool_item_set_tooltip_text(rWindow.m_pUnderline, "Underline");
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), rWindow.m_pUnderline, -1);
+    g_signal_connect(G_OBJECT(rWindow.m_pUnderline), "toggled", G_CALLBACK(toggleToolItem), NULL);
+    lcl_registerToolItem(rWindow, rWindow.m_pUnderline, ".uno:Underline");
+
+    rWindow.m_pStrikethrough = gtk_toggle_tool_button_new ();
+    gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(rWindow.m_pStrikethrough), "format-text-strikethrough-symbolic");
+    gtk_tool_item_set_tooltip_text(rWindow.m_pStrikethrough, "Strikethrough");
+    gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), rWindow.m_pStrikethrough, -1);
+    g_signal_connect(G_OBJECT(rWindow.m_pStrikethrough), "toggled", G_CALLBACK(toggleToolItem), NULL);
+    lcl_registerToolItem(rWindow, rWindow.m_pStrikethrough, ".uno:Strikeout");
+
+    gtk_box_pack_start(GTK_BOX(rWindow.m_pVBox), pToolbar, FALSE, FALSE, 0 ); // Adds to top.
 
     // Findbar
-    aWindow.m_pFindbar = gtk_toolbar_new();
-    gtk_toolbar_set_style(GTK_TOOLBAR(aWindow.m_pFindbar), GTK_TOOLBAR_ICONS);
+    rWindow.m_pFindbar = gtk_toolbar_new();
+    gtk_toolbar_set_style(GTK_TOOLBAR(rWindow.m_pFindbar), GTK_TOOLBAR_ICONS);
 
     GtkToolItem* pFindbarClose = gtk_tool_button_new( NULL, NULL);
     gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pFindbarClose), "window-close-symbolic");
-    gtk_toolbar_insert(GTK_TOOLBAR(aWindow.m_pFindbar), pFindbarClose, -1);
+    gtk_toolbar_insert(GTK_TOOLBAR(rWindow.m_pFindbar), pFindbarClose, -1);
     g_signal_connect(G_OBJECT(pFindbarClose), "clicked", G_CALLBACK(toggleFindbar), NULL);
 
     GtkToolItem* pEntryContainer = gtk_tool_item_new();
-    aWindow.m_pFindbarEntry = gtk_entry_new();
-    gtk_container_add(GTK_CONTAINER(pEntryContainer), aWindow.m_pFindbarEntry);
-    g_signal_connect(aWindow.m_pFindbarEntry, "key-press-event", G_CALLBACK(signalFindbar), 0);
-    gtk_toolbar_insert(GTK_TOOLBAR(aWindow.m_pFindbar), pEntryContainer, -1);
+    rWindow.m_pFindbarEntry = gtk_entry_new();
+    gtk_container_add(GTK_CONTAINER(pEntryContainer), rWindow.m_pFindbarEntry);
+    g_signal_connect(rWindow.m_pFindbarEntry, "key-press-event", G_CALLBACK(signalFindbar), 0);
+    gtk_toolbar_insert(GTK_TOOLBAR(rWindow.m_pFindbar), pEntryContainer, -1);
 
     GtkToolItem* pFindbarNext = gtk_tool_button_new( NULL, NULL);
     gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pFindbarNext), "go-down-symbolic");
-    gtk_toolbar_insert(GTK_TOOLBAR(aWindow.m_pFindbar), pFindbarNext, -1);
+    gtk_toolbar_insert(GTK_TOOLBAR(rWindow.m_pFindbar), pFindbarNext, -1);
     g_signal_connect(G_OBJECT(pFindbarNext), "clicked", G_CALLBACK(signalSearchNext), NULL);
 
     GtkToolItem* pFindbarPrev = gtk_tool_button_new( NULL, NULL);
     gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (pFindbarPrev), "go-up-symbolic");
-    gtk_toolbar_insert(GTK_TOOLBAR(aWindow.m_pFindbar), pFindbarPrev, -1);
+    gtk_toolbar_insert(GTK_TOOLBAR(rWindow.m_pFindbar), pFindbarPrev, -1);
     g_signal_connect(G_OBJECT(pFindbarPrev), "clicked", G_CALLBACK(signalSearchPrev), NULL);
 
     GtkToolItem* pFindbarLabelContainer = gtk_tool_item_new();
-    aWindow.m_pFindbarLabel = gtk_label_new("");
-    gtk_container_add(GTK_CONTAINER(pFindbarLabelContainer), aWindow.m_pFindbarLabel);
-    gtk_toolbar_insert(GTK_TOOLBAR(aWindow.m_pFindbar), pFindbarLabelContainer, -1);
+    rWindow.m_pFindbarLabel = gtk_label_new("");
+    gtk_container_add(GTK_CONTAINER(pFindbarLabelContainer), rWindow.m_pFindbarLabel);
+    gtk_toolbar_insert(GTK_TOOLBAR(rWindow.m_pFindbar), pFindbarLabelContainer, -1);
+
+    gtk_box_pack_end(GTK_BOX(rWindow.m_pVBox), rWindow.m_pFindbar, FALSE, FALSE, 0);
+
+    // Scrolled window for DocView
+    rWindow.m_pScrolledWindow = gtk_scrolled_window_new(0, 0);
+    gtk_widget_set_hexpand(rWindow.m_pScrolledWindow, TRUE);
+    gtk_widget_set_vexpand(rWindow.m_pScrolledWindow, TRUE);
+    gtk_container_add(GTK_CONTAINER(rWindow.m_pVBox), rWindow.m_pScrolledWindow);
 
-    gtk_box_pack_end(GTK_BOX(aWindow.m_pVBox), aWindow.m_pFindbar, FALSE, FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(rWindow.m_pScrolledWindow), rWindow.m_pDocView);
+
+    GtkWidget* pProgressBar = gtk_progress_bar_new ();
+    g_signal_connect(rWindow.m_pDocView, "load-changed", G_CALLBACK(loadChanged), pProgressBar);
+
+    GtkWidget* pStatusBar = gtk_statusbar_new();
+    rWindow.m_pStatusBar = pStatusBar;
+    gtk_container_forall(GTK_CONTAINER(pStatusBar), removeChildrenFromStatusbar, pStatusBar);
+    gtk_container_add (GTK_CONTAINER(rWindow.m_pVBox), pStatusBar);
+    gtk_container_add (GTK_CONTAINER(pStatusBar), pProgressBar);
+    gtk_widget_set_hexpand(pProgressBar, true);
+
+    gtk_widget_show_all(pWindow);
+    // Hide the findbar by default.
+    gtk_widget_hide(rWindow.m_pFindbar);
+
+    g_aWindows[pWindow] = rWindow;
+    return pWindow;
+}
+
+int main( int argc, char* argv[] )
+{
+    if( argc < 3 ||
+        ( argc > 1 && ( !strcmp( argv[1], "--help" ) || !strcmp( argv[1], "-h" ) ) ) )
+        return help();
+
+    if ( argv[1][0] != '/' )
+    {
+        fprintf(stderr, "Absolute path required to libreoffice install\n");
+        return 1;
+    }
+
+    gtk_init( &argc, &argv );
 
     // Docview
     GtkWidget* pDocView = lok_doc_view_new (argv[1], NULL, NULL);
-    aWindow.m_pDocView = pDocView;
 #if GLIB_CHECK_VERSION(2,40,0)
     g_assert_nonnull(pDocView);
 #endif
-
     g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL);
     g_signal_connect(pDocView, "command-changed", G_CALLBACK(signalCommand), NULL);
     g_signal_connect(pDocView, "search-not-found", G_CALLBACK(signalSearch), NULL);
@@ -718,32 +744,10 @@ int main( int argc, char* argv[] )
     g_signal_connect(pDocView, "hyperlink-clicked", G_CALLBACK(signalHyperlink), NULL);
     g_signal_connect(pDocView, "cursor-changed", G_CALLBACK(cursorChanged), NULL);
 
-
-    // Scrolled window for DocView
-    aWindow.m_pScrolledWindow = gtk_scrolled_window_new(0, 0);
-    gtk_widget_set_hexpand (aWindow.m_pScrolledWindow, TRUE);
-    gtk_widget_set_vexpand (aWindow.m_pScrolledWindow, TRUE);
-    gtk_container_add(GTK_CONTAINER(aWindow.m_pVBox), aWindow.m_pScrolledWindow);
-
-    gtk_container_add(GTK_CONTAINER(aWindow.m_pScrolledWindow), pDocView);
-
-    GtkWidget* pProgressBar = gtk_progress_bar_new ();
-    g_signal_connect(pDocView, "load-changed", G_CALLBACK(loadChanged), pProgressBar);
-
-    GtkWidget* pStatusBar = gtk_statusbar_new ();
-    aWindow.m_pStatusBar = pStatusBar;
-    gtk_container_forall(GTK_CONTAINER(pStatusBar), removeChildrenFromStatusbar, pStatusBar);
-    gtk_container_add (GTK_CONTAINER(aWindow.m_pVBox), pStatusBar);
-    gtk_container_add (GTK_CONTAINER(pStatusBar), pProgressBar);
-    gtk_widget_set_hexpand(pProgressBar, true);
-
-    gtk_widget_show_all( pWindow );
-    // Hide the findbar by default.
-    gtk_widget_hide(aWindow.m_pFindbar);
-
-    g_aWindows[pWindow] = aWindow;
-
-    lok_doc_view_open_document( LOK_DOC_VIEW(pDocView), argv[2], NULL, openDocumentCallback, pDocView );
+    TiledWindow aWindow;
+    aWindow.m_pDocView = pDocView;
+    createWindow(aWindow);
+    lok_doc_view_open_document(LOK_DOC_VIEW(pDocView), argv[2], NULL, openDocumentCallback, pDocView);
 
     gtk_main();
 
commit 1d4c9fb879dc4506a9b75e8156874e4f7f046aaa
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 15 14:23:53 2015 +0200

    lokdocview: allow not calling documentLoad()
    
    Change-Id: I2ff57c4be11cd3908bc951ebf572a2c02e2c4585

diff --git a/include/LibreOfficeKit/LibreOfficeKitGtk.h b/include/LibreOfficeKit/LibreOfficeKitGtk.h
index 01009fb..f17925b 100644
--- a/include/LibreOfficeKit/LibreOfficeKitGtk.h
+++ b/include/LibreOfficeKit/LibreOfficeKitGtk.h
@@ -44,6 +44,8 @@ GtkWidget*                     lok_doc_view_new                    (const gchar*
                                                                     GCancellable *cancellable,
                                                                     GError **error);
 
+GtkWidget*                     lok_doc_view_new_from_widget        (LOKDocView* pDocView);
+
 void                           lok_doc_view_open_document          (LOKDocView* pDocView,
                                                                     const gchar* pPath,
                                                                     GCancellable* cancellable,
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 4448026..b185de3 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -127,7 +127,9 @@ enum
     PROP_0,
 
     PROP_LO_PATH,
+    PROP_LO_POINTER,
     PROP_DOC_PATH,
+    PROP_DOC_POINTER,
     PROP_EDITABLE,
     PROP_LOAD_PROGRESS,
     PROP_ZOOM,
@@ -1388,9 +1390,15 @@ static void lok_doc_view_set_property (GObject* object, guint propId, const GVal
     case PROP_LO_PATH:
         priv->m_aLOPath = g_value_dup_string (value);
         break;
+    case PROP_LO_POINTER:
+        priv->m_pOffice = static_cast<LibreOfficeKit*>(g_value_get_pointer(value));
+        break;
     case PROP_DOC_PATH:
         priv->m_aDocPath = g_value_dup_string (value);
         break;
+    case PROP_DOC_POINTER:
+        priv->m_pDocument = static_cast<LibreOfficeKitDocument*>(g_value_get_pointer(value));
+        break;
     case PROP_EDITABLE:
         lok_doc_view_set_edit (pDocView, g_value_get_boolean (value));
         break;
@@ -1418,9 +1426,15 @@ static void lok_doc_view_get_property (GObject* object, guint propId, GValue *va
     case PROP_LO_PATH:
         g_value_set_string (value, priv->m_aLOPath);
         break;
+    case PROP_LO_POINTER:
+        g_value_set_pointer(value, priv->m_pOffice);
+        break;
     case PROP_DOC_PATH:
         g_value_set_string (value, priv->m_aDocPath);
         break;
+    case PROP_DOC_POINTER:
+        g_value_set_pointer(value, priv->m_pDocument);
+        break;
     case PROP_EDITABLE:
         g_value_set_boolean (value, priv->m_bEdit);
         break;
@@ -1531,6 +1545,20 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
                                                        | G_PARAM_CONSTRUCT_ONLY)));
 
     /**
+     * LOKDocView:lopointer:
+     *
+     * A LibreOfficeKit* in case lok_init() is already called
+     * previously.
+     */
+    g_object_class_install_property (pGObjectClass,
+          PROP_LO_POINTER,
+          g_param_spec_pointer("lopointer",
+                              "LO Pointer",
+                              "A LibreOfficeKit* from lok_init()",
+                              static_cast<GParamFlags>(G_PARAM_READWRITE
+                                                       | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
      * LOKDocView:docpath:
      *
      * The path of the document that is currently being viewed.
@@ -1544,6 +1572,19 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
                               static_cast<GParamFlags>(G_PARAM_READWRITE)));
 
     /**
+     * LOKDocView:docpointer:
+     *
+     * A LibreOfficeKitDocument* in case documentLoad() is already called
+     * previously.
+     */
+    g_object_class_install_property (pGObjectClass,
+          PROP_DOC_POINTER,
+          g_param_spec_pointer("docpointer",
+                              "Document Pointer",
+                              "A LibreOfficeKitDocument* from documentLoad()",
+                              static_cast<GParamFlags>(G_PARAM_READWRITE)));
+
+    /**
      * LOKDocView:editable:
      *
      * Whether the document loaded inside of #LOKDocView is editable or not.
@@ -1795,6 +1836,13 @@ 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)
+{
+    LOKDocViewPrivate* priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private(pLOKDocView));
+    return 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));
+}
+
 /**
  * lok_doc_view_open_document_finish:
  * @pDocView: The #LOKDocView instance


More information about the Libreoffice-commits mailing list