/** * gdict_database_chooser_refresh: * @chooser: a #GdictDatabaseChooser * * Reloads the list of available databases. * * Since: 0.10 */ void gdict_database_chooser_refresh (GdictDatabaseChooser *chooser) { GdictDatabaseChooserPrivate *priv; GError *db_error; g_return_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser)); priv = chooser->priv; if (!priv->context) { g_warning ("Attempting to retrieve the available databases, but " "no GdictContext has been set. Use gdict_database_chooser_set_context() " "before invoking gdict_database_chooser_refresh()."); return; } if (priv->is_searching) return; gdict_database_chooser_clear (chooser); if (!priv->start_id) { priv->start_id = g_signal_connect (priv->context, "lookup-start", G_CALLBACK (lookup_start_cb), chooser); priv->match_id = g_signal_connect (priv->context, "database-found", G_CALLBACK (database_found_cb), chooser); priv->end_id = g_signal_connect (priv->context, "lookup-end", G_CALLBACK (lookup_end_cb), chooser); } if (!priv->error_id) priv->error_id = g_signal_connect (priv->context, "error", G_CALLBACK (error_cb), chooser); db_error = NULL; gdict_context_lookup_databases (priv->context, &db_error); if (db_error) { GtkTreeIter iter; gtk_list_store_append (priv->store, &iter); gtk_list_store_set (priv->store, &iter, DB_COLUMN_TYPE, DATABASE_ERROR, DB_COLUMN_NAME, _("Error while matching"), DB_COLUMN_DESCRIPTION, NULL, -1); g_warning ("Error while looking for databases: %s", db_error->message); g_error_free (db_error); } }
/** * gdict_database_chooser_count_databases: * @chooser: a #GdictDatabaseChooser * * Returns the number of databases found. * * Return value: the number of databases or -1 if no context is set * * Since: 0.10 */ gint gdict_database_chooser_count_databases (GdictDatabaseChooser *chooser) { g_return_val_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser), -1); return chooser->priv->results; }
/** * gdict_database_chooser_get_context: * @chooser: a #GdictDatabaseChooser * * Retrieves the #GdictContext used by @chooser. * * Return value: a #GdictContext or %NULL * * Since: 0.10 */ GdictContext * gdict_database_chooser_get_context (GdictDatabaseChooser *chooser) { g_return_val_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser), NULL); return chooser->priv->context; }
/** * gdict_database_chooser_set_current_database: * @chooser: a #GdictDatabaseChooser * @db_name: the name of the database * * Sets @db_name as the current database. This function will select * and activate the corresponding row, if the database is found. * * Return value: %TRUE if the database was found and set * * Since: 0.10 */ gboolean gdict_database_chooser_set_current_database (GdictDatabaseChooser *chooser, const gchar *db_name) { GdictDatabaseChooserPrivate *priv; SelectData data; gboolean retval; g_return_val_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser), FALSE); g_return_val_if_fail (db_name != NULL, FALSE); priv = chooser->priv; data.db_name = g_strdup (db_name); data.chooser = chooser; data.found = FALSE; data.do_select = TRUE; data.do_activate = TRUE; gtk_tree_model_foreach (GTK_TREE_MODEL (priv->store), scan_for_db_name, &data); retval = data.found; if (data.found) { g_free (priv->current_db); priv->current_db = data.db_name; } else g_free (data.db_name); return retval; }
/** * gdict_database_chooser_set_context: * @chooser: a #GdictDatabaseChooser * @context: a #GdictContext * * Sets the #GdictContext to be used to query a dictionary source * for the list of available databases. * * Since: 0.10 */ void gdict_database_chooser_set_context (GdictDatabaseChooser *chooser, GdictContext *context) { g_return_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser)); g_return_if_fail (context == NULL || GDICT_IS_CONTEXT (context)); set_gdict_context (chooser, context); g_object_notify (G_OBJECT (chooser), "context"); }
static void set_gdict_context (GdictDatabaseChooser *chooser, GdictContext *context) { GdictDatabaseChooserPrivate *priv; g_assert (GDICT_IS_DATABASE_CHOOSER (chooser)); priv = chooser->priv; if (priv->context) { if (priv->start_id) { GDICT_NOTE (CHOOSER, "Removing old context handlers"); g_signal_handler_disconnect (priv->context, priv->start_id); g_signal_handler_disconnect (priv->context, priv->match_id); g_signal_handler_disconnect (priv->context, priv->end_id); priv->start_id = 0; priv->end_id = 0; priv->match_id = 0; } if (priv->error_id) { g_signal_handler_disconnect (priv->context, priv->error_id); priv->error_id = 0; } GDICT_NOTE (CHOOSER, "Removing old context"); g_object_unref (G_OBJECT (priv->context)); priv->context = NULL; priv->results = -1; } if (!context) return; if (!GDICT_IS_CONTEXT (context)) { g_warning ("Object of type '%s' instead of a GdictContext\n", g_type_name (G_OBJECT_TYPE (context))); return; } GDICT_NOTE (CHOOSER, "Setting new context"); priv->context = g_object_ref (context); priv->results = 0; }
/** * gdict_database_chooser_clear: * @chooser: a #GdictDatabaseChooser * * Clears @chooser. * * Since: 0.10 */ void gdict_database_chooser_clear (GdictDatabaseChooser *chooser) { GdictDatabaseChooserPrivate *priv; g_return_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser)); priv = chooser->priv; gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), NULL); gtk_list_store_clear (priv->store); priv->results = 0; gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), GTK_TREE_MODEL (priv->store)); }
/** * gdict_database_chooser_has_database: * @chooser: a #GdictDatabaseChooser * @database: the name of a database * * Checks whether the @chooser displays @database * * Return value: %TRUE if the search database name is present * * Since: 0.10 */ gboolean gdict_database_chooser_has_database (GdictDatabaseChooser *chooser, const gchar *database) { GdictDatabaseChooserPrivate *priv; GtkTreeIter iter; gboolean retval; g_return_val_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser), FALSE); g_return_val_if_fail (database != NULL, FALSE); priv = chooser->priv; if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->store), &iter)) return FALSE; retval = FALSE; do { gchar *db_name; gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter, DB_COLUMN_NAME, &db_name, -1); if (strcmp (db_name, database) == 0) { g_free (db_name); retval = TRUE; break; } g_free (db_name); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), &iter)); return retval; }
/** * gdict_database_chooser_add_button: * @chooser: a #GdictDatabase * @button_text: text of the button * * Adds a #GtkButton with @button_text to the button area on * the bottom of @chooser. The @button_text can also be a * stock ID. * * Return value: the newly packed button. * * Since: 0.10 */ GtkWidget * gdict_database_chooser_add_button (GdictDatabaseChooser *chooser, const gchar *button_text) { GdictDatabaseChooserPrivate *priv; GtkWidget *button; g_return_val_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser), NULL); g_return_val_if_fail (button_text != NULL, NULL); priv = chooser->priv; button = gtk_button_new_from_stock (button_text); gtk_widget_set_can_default (button, TRUE); gtk_widget_show (button); gtk_box_pack_end (GTK_BOX (priv->buttons_box), button, FALSE, TRUE, 0); return button; }
/** * gdict_database_chooser_get_current_database: * @chooser: a #GdictDatabaseChooser * * Retrieves the name of the currently selected database inside @chooser * * Return value: the name of the selected database. Use g_free() on the * returned string when done using it * * Since: 0.10 */ gchar * gdict_database_chooser_get_current_database (GdictDatabaseChooser *chooser) { GdictDatabaseChooserPrivate *priv; GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; gchar *retval = NULL; g_return_val_if_fail (GDICT_IS_DATABASE_CHOOSER (chooser), NULL); priv = chooser->priv; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)); if (!gtk_tree_selection_get_selected (selection, &model, &iter)) return NULL; gtk_tree_model_get (model, &iter, DB_COLUMN_NAME, &retval, -1); g_free (priv->current_db); priv->current_db = g_strdup (retval); return retval; }