Kaydet (Commit) 645f0054 authored tarafından Pranav Kant's avatar Pranav Kant Kaydeden (comit) Miklos Vajna

lokdocview: Call open_document in another thread

This is to keep the widget responsive during document load.

Change-Id: I81acaffc75ca7deddd6cc2de6abae22d009d40cd
üst d8794a4f
...@@ -45,8 +45,15 @@ GtkWidget* lok_doc_view_new (const gchar* ...@@ -45,8 +45,15 @@ GtkWidget* lok_doc_view_new (const gchar*
GCancellable *cancellable, GCancellable *cancellable,
GError **error); GError **error);
gboolean lok_doc_view_open_document (LOKDocView* pDocView, void lok_doc_view_open_document (LOKDocView* pDocView,
const gchar* pPath); const gchar* pPath,
GCancellable* cancellable,
GAsyncReadyCallback callback,
gpointer userdata);
gboolean lok_doc_view_open_document_finish (LOKDocView* pDocView,
GAsyncResult* res,
GError** error);
/// Gets the document the viewer displays. /// Gets the document the viewer displays.
LibreOfficeKitDocument* lok_doc_view_get_document (LOKDocView* pDocView); LibreOfficeKitDocument* lok_doc_view_get_document (LOKDocView* pDocView);
......
...@@ -41,6 +41,7 @@ std::map<std::string, GtkToolItem*> g_aCommandNameToolItems; ...@@ -41,6 +41,7 @@ std::map<std::string, GtkToolItem*> g_aCommandNameToolItems;
bool g_bToolItemBroadcast = true; bool g_bToolItemBroadcast = true;
static GtkWidget* pVBox; static GtkWidget* pVBox;
static GtkComboBoxText* pPartSelector; static GtkComboBoxText* pPartSelector;
static GtkWidget* pPartModeComboBox;
/// Should the part selector avoid calling lok::Document::setPart()? /// Should the part selector avoid calling lok::Document::setPart()?
static bool g_bPartSelectorBroadcast = true; static bool g_bPartSelectorBroadcast = true;
GtkWidget* pFindbar; GtkWidget* pFindbar;
...@@ -291,6 +292,7 @@ static void signalSearch(LOKDocView* /*pLOKDocView*/, char* /*pPayload*/, gpoint ...@@ -291,6 +292,7 @@ static void signalSearch(LOKDocView* /*pLOKDocView*/, char* /*pPayload*/, gpoint
gtk_label_set_text(GTK_LABEL(pFindbarLabel), "Search key not found"); gtk_label_set_text(GTK_LABEL(pFindbarLabel), "Search key not found");
} }
static void signalPart(LOKDocView* /*pLOKDocView*/, int nPart, gpointer /*pData*/) static void signalPart(LOKDocView* /*pLOKDocView*/, int nPart, gpointer /*pData*/)
{ {
g_bPartSelectorBroadcast = false; g_bPartSelectorBroadcast = false;
...@@ -381,6 +383,28 @@ static void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ ) ...@@ -381,6 +383,28 @@ static void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ )
} }
} }
static void openDocumentCallback (GObject* source_object, GAsyncResult* res, gpointer /*userdata*/)
{
LOKDocView* pDocView1 = LOK_DOC_VIEW (source_object);
GError* error = NULL;
GList *focusChain = NULL;
if (!lok_doc_view_open_document_finish(pDocView1, res, &error))
{
g_warning ("Error occurred while opening the document : %s", error->message);
g_error_free (error);
}
populatePartSelector();
populatePartModeSelector( GTK_COMBO_BOX_TEXT(pPartModeComboBox) );
// Connect these signals after populating the selectors, to avoid re-rendering on setting the default part/partmode.
g_signal_connect(G_OBJECT(pPartModeComboBox), "changed", G_CALLBACK(changePartMode), 0);
g_signal_connect(G_OBJECT(pPartSelector), "changed", G_CALLBACK(changePart), 0);
focusChain = g_list_append( focusChain, pDocView1 );
gtk_container_set_focus_chain ( GTK_CONTAINER (pVBox), focusChain );
}
int main( int argc, char* argv[] ) int main( int argc, char* argv[] )
{ {
if( argc < 3 || if( argc < 3 ||
...@@ -436,7 +460,7 @@ int main( int argc, char* argv[] ) ...@@ -436,7 +460,7 @@ int main( int argc, char* argv[] )
gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pSeparator2, -1); gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pSeparator2, -1);
GtkToolItem* pPartModeSelectorToolItem = gtk_tool_item_new(); GtkToolItem* pPartModeSelectorToolItem = gtk_tool_item_new();
GtkWidget* pPartModeComboBox = gtk_combo_box_text_new(); pPartModeComboBox = gtk_combo_box_text_new();
gtk_container_add( GTK_CONTAINER(pPartModeSelectorToolItem), pPartModeComboBox ); gtk_container_add( GTK_CONTAINER(pPartModeSelectorToolItem), pPartModeComboBox );
gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pPartModeSelectorToolItem, -1 ); gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pPartModeSelectorToolItem, -1 );
...@@ -543,21 +567,7 @@ int main( int argc, char* argv[] ) ...@@ -543,21 +567,7 @@ int main( int argc, char* argv[] )
// Hide the findbar by default. // Hide the findbar by default.
gtk_widget_hide(pFindbar); gtk_widget_hide(pFindbar);
int bOpened = lok_doc_view_open_document( LOK_DOC_VIEW(pDocView), argv[2] ); lok_doc_view_open_document( LOK_DOC_VIEW(pDocView), argv[2], NULL, openDocumentCallback, pDocView );
if (!bOpened)
g_error("main: lok_doc_view_open_document() failed");
assert(lok_doc_view_get_document(LOK_DOC_VIEW(pDocView)));
populatePartSelector();
populatePartModeSelector( GTK_COMBO_BOX_TEXT(pPartModeComboBox) );
// Connect these signals after populating the selectors, to avoid re-rendering on setting the default part/partmode.
g_signal_connect(G_OBJECT(pPartModeComboBox), "changed", G_CALLBACK(changePartMode), 0);
g_signal_connect(G_OBJECT(pPartSelector), "changed", G_CALLBACK(changePart), 0);
// Make only LOKDocView widget as focussable
GList *focusChain = NULL;
focusChain = g_list_append( focusChain, pDocView );
gtk_container_set_focus_chain ( GTK_CONTAINER (pVBox), focusChain );
gtk_main(); gtk_main();
......
...@@ -108,8 +108,6 @@ struct _LOKDocViewPrivate ...@@ -108,8 +108,6 @@ struct _LOKDocViewPrivate
enum enum
{ {
LOAD_CHANGED,
LOAD_FAILED,
EDIT_CHANGED, EDIT_CHANGED,
COMMAND_CHANGED, COMMAND_CHANGED,
SEARCH_NOT_FOUND, SEARCH_NOT_FOUND,
...@@ -337,19 +335,23 @@ static gboolean ...@@ -337,19 +335,23 @@ static gboolean
globalCallback (gpointer pData) globalCallback (gpointer pData)
{ {
CallbackData* pCallback = static_cast<CallbackData*>(pData); CallbackData* pCallback = static_cast<CallbackData*>(pData);
LOKDocViewPrivate* priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pCallback->m_pDocView));
switch (pCallback->m_nType) switch (pCallback->m_nType)
{ {
case LOK_CALLBACK_STATUS_INDICATOR_START: case LOK_CALLBACK_STATUS_INDICATOR_START:
{ {
priv->m_nLoadProgress = 0;
} }
break; break;
case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE: case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE:
{ {
priv->m_nLoadProgress = std::stoi(pCallback->m_aPayload);
} }
break; break;
case LOK_CALLBACK_STATUS_INDICATOR_FINISH: case LOK_CALLBACK_STATUS_INDICATOR_FINISH:
{ {
priv->m_nLoadProgress = 100;
} }
break; break;
default: default:
...@@ -1389,15 +1391,30 @@ lok_doc_view_new (const gchar* pPath, GCancellable *cancellable, GError **error) ...@@ -1389,15 +1391,30 @@ lok_doc_view_new (const gchar* pPath, GCancellable *cancellable, GError **error)
} }
/** /**
* lok_doc_view_open_document: * lok_doc_view_open_document_finish:
* @pDocView: The #LOKDocView instance * @pDocView: The #LOKDocView instance
* @pPath: The path of the document that #LOKDocView widget should try to open * @res:
* @error:
* *
* Returns: %TRUE if the document is loaded succesfully, %FALSE otherwise * Returns: %TRUE if the document is loaded succesfully, %FALSE otherwise
*/ */
SAL_DLLPUBLIC_EXPORT gboolean SAL_DLLPUBLIC_EXPORT gboolean
lok_doc_view_open_document (LOKDocView* pDocView, const gchar* pPath) lok_doc_view_open_document_finish (LOKDocView* pDocView, GAsyncResult* res, GError** error)
{
GTask* task = G_TASK(res);
g_return_val_if_fail(g_task_is_valid(res, pDocView), NULL);
//FIXME: make source_tag workx
//g_return_val_if_fail(g_task_get_source_tag(task) == lok_doc_view_open_document, NULL);
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
return g_task_propagate_boolean(task, error);
}
static void
lok_doc_view_open_document_func (GTask* task, gpointer source_object, gpointer task_data, GCancellable* cancellable)
{ {
LOKDocView* pDocView = LOK_DOC_VIEW(source_object);
LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView)); LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView));
if ( priv->m_pDocument ) if ( priv->m_pDocument )
...@@ -1407,13 +1424,13 @@ lok_doc_view_open_document (LOKDocView* pDocView, const gchar* pPath) ...@@ -1407,13 +1424,13 @@ lok_doc_view_open_document (LOKDocView* pDocView, const gchar* pPath)
} }
priv->m_pOffice->pClass->registerCallback(priv->m_pOffice, globalCallbackWorker, pDocView); priv->m_pOffice->pClass->registerCallback(priv->m_pOffice, globalCallbackWorker, pDocView);
priv->m_pDocument = priv->m_pOffice->pClass->documentLoad( priv->m_pOffice, pPath ); priv->m_pDocument = priv->m_pOffice->pClass->documentLoad( priv->m_pOffice, priv->m_aDocPath );
if ( !priv->m_pDocument ) if ( !priv->m_pDocument )
{ {
// FIXME: should have a GError parameter and populate it. // FIXME: should have a GError parameter and populate it.
char *pError = priv->m_pOffice->pClass->getError( priv->m_pOffice ); char *pError = priv->m_pOffice->pClass->getError( priv->m_pOffice );
fprintf( stderr, "Error opening document '%s'\n", pError ); fprintf( stderr, "Error opening document '%s'\n", pError );
return FALSE; g_task_return_new_error(task, 0, 0, pError);
} }
else else
{ {
...@@ -1438,8 +1455,34 @@ lok_doc_view_open_document (LOKDocView* pDocView, const gchar* pPath) ...@@ -1438,8 +1455,34 @@ lok_doc_view_open_document (LOKDocView* pDocView, const gchar* pPath)
nDocumentHeightPixels); nDocumentHeightPixels);
gtk_widget_set_can_focus(GTK_WIDGET(pDocView), TRUE); gtk_widget_set_can_focus(GTK_WIDGET(pDocView), TRUE);
gtk_widget_grab_focus(GTK_WIDGET(pDocView)); gtk_widget_grab_focus(GTK_WIDGET(pDocView));
g_task_return_boolean (task, true);
} }
return TRUE; }
/**
* lok_doc_view_open_document:
* @pDocView: The #LOKDocView instance
* @pPath: The path of the document that #LOKDocView widget should try to open
*
* Returns: %TRUE if the document is loaded succesfully, %FALSE otherwise
*/
SAL_DLLPUBLIC_EXPORT void
lok_doc_view_open_document (LOKDocView* pDocView,
const gchar* pPath,
GCancellable* cancellable,
GAsyncReadyCallback callback,
gpointer userdata)
{
GTask *task;
LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView));
priv->m_aDocPath = g_strdup(pPath);
task = g_task_new(pDocView, cancellable, callback, userdata);
// FIXME: Use source_tag to check the task.
//g_task_set_source_tag(task, lok_doc_view_open_document);
g_task_run_in_thread(task, lok_doc_view_open_document_func);
g_object_unref(task);
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment