* mug.c: show error dialogs for errors; focus query when there was a parse error

This commit is contained in:
Dirk-Jan C. Binnema 2010-11-24 09:03:06 +02:00
parent bb9b7081df
commit f59ac88118
4 changed files with 94 additions and 10 deletions

View File

@ -29,7 +29,7 @@ enum _MuResult {
MU_ERROR_QUERY,
MU_ERROR_INTERNAL,
MU_ERROR /* some error occured */
MU_ERROR /* some other error occured */

View File

@ -30,6 +30,7 @@ static void mug_msg_list_view_finalize (GObject *obj);
/* list my signals */
enum {
MUG_MSG_SELECTED,
MUG_ERROR_OCCURED,
LAST_SIGNAL
};
@ -87,6 +88,15 @@ mug_msg_list_view_class_init (MugMsgListViewClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
signals[MUG_ERROR_OCCURED] =
g_signal_new ("error-occured",
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET(MugMsgListViewClass,
error_occured),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT);
}
@ -308,8 +318,25 @@ empty_or_display_contact (const gchar* str)
}
static MugError
mu_result_to_mug_error (MuResult r)
{
switch (r) {
case MU_ERROR_XAPIAN_DIR:
return MUG_ERROR_XAPIAN_DIR;
case MU_ERROR_XAPIAN_NOT_UPTODATE:
return MUG_ERROR_XAPIAN_NOT_UPTODATE;
case MU_ERROR_QUERY:
return MUG_ERROR_QUERY;
default:
return MUG_ERROR_OTHER;
}
}
static MuMsgIter *
run_query (const char *xpath, const char *query)
run_query (const char *xpath, const char *query,
MugMsgListView *self)
{
GError *err;
MuQuery *xapian;
@ -319,6 +346,9 @@ run_query (const char *xpath, const char *query)
xapian = mu_query_new (xpath, &err);
if (!xapian) {
g_warning ("Error: %s", err->message);
g_signal_emit (G_OBJECT(self),
signals[MUG_ERROR_OCCURED], 0,
mu_result_to_mug_error (err->code));
g_error_free (err);
return NULL;
}
@ -329,6 +359,9 @@ run_query (const char *xpath, const char *query)
mu_query_destroy (xapian);
if (!iter) {
g_warning ("Error: %s", err->message);
g_signal_emit (G_OBJECT(self),
signals[MUG_ERROR_OCCURED], 0,
mu_result_to_mug_error (err->code));
g_error_free (err);
return NULL;
}
@ -369,12 +402,13 @@ add_row (GtkListStore *store, MuMsgIter *iter)
static int
update_model (GtkListStore *store, const char *xpath, const char *query)
update_model (GtkListStore *store, const char *xpath, const char *query,
MugMsgListView *self)
{
MuMsgIter *iter;
int count;
iter = run_query (xpath, query);
iter = run_query (xpath, query, self);
if (!iter) {
g_warning ("error: running query failed\n");
return -1;
@ -407,7 +441,8 @@ mug_msg_list_view_query (MugMsgListView *self, const char *query)
if (!query)
return TRUE;
rv = update_model (priv->_store, priv->_xpath, query);
rv = update_model (priv->_store, priv->_xpath, query,
self);
gtk_tree_view_columns_autosize (GTK_TREE_VIEW(self));

View File

@ -21,7 +21,7 @@
#define __MUG_MSG_LIST_VIEW_H__
#include <gtk/gtk.h>
/* other include files */
#include "src/mu-result.h"
G_BEGIN_DECLS
@ -41,10 +41,20 @@ struct _MugMsgListView {
/* insert public members, if any */
};
enum _MugError {
MUG_ERROR_XAPIAN_NOT_UPTODATE,
MUG_ERROR_XAPIAN_DIR,
MUG_ERROR_QUERY,
MUG_ERROR_OTHER
};
typedef enum _MugError MugError;
struct _MugMsgListViewClass {
GtkTreeViewClass parent_class;
/* insert signal callback declarations, e.g. */
void (* msg_selected) (MugMsgListView* obj, const char* msgpath);
void (* error_occured) (MugMsgListView* obj, MugError err);
};
/* member functions */

View File

@ -74,18 +74,20 @@ static void
on_tool_button_clicked (GtkToolButton *btn, MugData *mugdata)
{
ToolAction action;
action = (ToolAction)GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(btn),
"action"));
action = (ToolAction)GPOINTER_TO_UINT(
g_object_get_data(G_OBJECT(btn),"action"));
switch (action) {
case ACTION_DO_QUIT:
gtk_main_quit();
break;
case ACTION_NEXT_MSG:
mug_msg_list_view_move_next (MUG_MSG_LIST_VIEW(mugdata->mlist));
mug_msg_list_view_move_next
(MUG_MSG_LIST_VIEW(mugdata->mlist));
break;
case ACTION_PREV_MSG:
mug_msg_list_view_move_prev (MUG_MSG_LIST_VIEW(mugdata->mlist));
mug_msg_list_view_move_prev
(MUG_MSG_LIST_VIEW(mugdata->mlist));
break;
case ACTION_ABOUT:
about_mug (mugdata);
@ -199,6 +201,41 @@ on_msg_selected (MugMsgListView *mlist, const char* mpath, MugData *mugdata)
}
static void
on_list_view_error (MugMsgListView *mlist, MugError err,
MugData *mugdata)
{
GtkWidget *errdialog;
const char* msg;
switch (err) {
case MUG_ERROR_XAPIAN_NOT_UPTODATE:
msg = "The Xapian Database has the wrong version\n"
"Please run 'mu index --rebuild'"; break;
case MUG_ERROR_XAPIAN_DIR:
msg = "Cannot find the Xapian database dir\n"
"Please restart mug with --muhome=... pointing\n"
"to your mu home directory"; break;
case MUG_ERROR_QUERY:
msg = "Error in query"; break;
default:
msg = "Some error occured"; break;
}
errdialog = gtk_message_dialog_new
(GTK_WINDOW(mugdata->win), GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, "%s", msg);
gtk_dialog_run (GTK_DIALOG(errdialog));
gtk_widget_destroy (errdialog);
if (err == MUG_ERROR_QUERY) {
mug_query_bar_grab_focus
(MUG_QUERY_BAR(mugdata->querybar));
}
}
static GtkWidget*
mug_querybar (void)
@ -235,6 +272,8 @@ mug_query_area (MugData *mugdata)
mug_msg_view_set_msg (MUG_MSG_VIEW(mugdata->msgview), NULL);
g_signal_connect (G_OBJECT(mugdata->mlist), "msg-selected",
G_CALLBACK(on_msg_selected), mugdata);
g_signal_connect (G_OBJECT(mugdata->mlist), "error-occured",
G_CALLBACK(on_list_view_error), mugdata);
gtk_paned_add2 (GTK_PANED (paned), mugdata->msgview);
mugdata->querybar = mug_querybar();