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 <vmik...@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 <vmik...@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 <vmik...@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 <vmik...@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 <vmik...@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 <vmik...@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 <vmik...@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 _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits