📄 abook.c
字号:
/* * addressbook dialog * * Authors: Gerhard Khueny <e9625442@student.tuwien.ac.at> * * TODO: * * Fixes: * * For license terms, see the file COPYING in the project directory. */#include <config.h>#include <string.h>#include <gnome.h>#include "abook.h"#include <errno.h>#define MAXLINE 1024typedef struct { GtkWidget *abook; GtkWidget *propertybox; GtkWidget *tree; GtkWidget *nick, *name, *numbers;}AbookWidgets;static AbookWidgets abw;static GList *abook=NULL;static gchar* sel_nick;static gboolean sel_alias = FALSE;static GtkCTreeNode *insnode;static void close_cb(GtkWidget * widget, gpointer data);static void new_entry_cb (GtkWidget *button, gpointer data);static void input_changed_cb (GtkWidget *widget, gpointer data);static void new_apply_cb (GnomePropertyBox *pbox, gint page, gpointer data);static void edit_apply_cb (GnomePropertyBox *pbox, gint page, gpointer data);static void tree_select_item_cb (GtkCTree *ctree, GList *node, gint column, gpointer user_data);static void tree_unselect_item_cb (GtkCTree *ctree, GList *node, gint column, gpointer user_data);static void abook_save_cb (GtkWidget * widget, gpointer data);static void abook_edit_cb (GtkWidget * widget, gpointer data);static void abook_del_cb (GtkWidget * widget, gpointer data);static gboolean delete_event_cb (GtkWidget * widget, gpointer data);static gboolean destroy_event_cb (GtkWidget * widget, gpointer data);static void select_nick_cb (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer user_data);static GtkWidget* new_entry(gboolean fill);static void abook_insert ( gchar *nickname, gchar *fullname, gchar *numbers, gchar *delimiter);static void abook_load (void);static void abook_clear(void);static void abook_save (void);static void abook_delete_entry(gchar *nick);static void find_remove_entry (gchar *nick);static void abook_sort(void);gint abook_compare(gconstpointer a, gconstpointer b);static GnomeUIInfo toolbar[] = { GNOMEUIINFO_ITEM_STOCK(N_("Close"), N_("Close Addressbook"), close_cb, GNOME_STOCK_PIXMAP_CLOSE), GNOMEUIINFO_ITEM_STOCK(N_("New"), N_("Insert Entry"), new_entry_cb, GNOME_STOCK_PIXMAP_NEW), GNOMEUIINFO_ITEM_STOCK(N_("Edit"), N_("Edit Entry"), abook_edit_cb, GNOME_STOCK_PIXMAP_ADD), GNOMEUIINFO_ITEM_STOCK(N_("Remove"), N_("Remove Entry"), abook_del_cb, GNOME_STOCK_PIXMAP_REMOVE), GNOMEUIINFO_ITEM_STOCK(N_("Save"), N_("Save changes"), abook_save_cb, GNOME_STOCK_PIXMAP_SAVE), GNOMEUIINFO_END};GtkWidget* gsms_abook_new (void){ gchar *titles[]={ " Nickname ", " Real Name ", " Number " }; GtkWidget *frame, *swindow; abw.abook = gnome_app_new("Abook","GSMS- adressbook"); gtk_signal_connect(GTK_OBJECT(abw.abook), "delete-event", GTK_SIGNAL_FUNC(delete_event_cb), NULL); gtk_signal_connect(GTK_OBJECT(abw.abook), "destroy", GTK_SIGNAL_FUNC(destroy_event_cb), NULL); gnome_app_create_toolbar_with_data(GNOME_APP(abw.abook), toolbar, abw.abook); frame = gtk_frame_new(NULL); swindow = gtk_scrolled_window_new(NULL, NULL); abw.tree = gtk_ctree_new_with_titles(3, 0, titles); gtk_signal_connect(GTK_OBJECT(abw.tree), "tree-select-row", GTK_SIGNAL_FUNC(tree_select_item_cb), NULL); gtk_signal_connect(GTK_OBJECT(abw.tree), "tree-unselect-row", GTK_SIGNAL_FUNC(tree_unselect_item_cb), NULL); gtk_container_add(GTK_CONTAINER(swindow), abw.tree); gtk_container_add(GTK_CONTAINER(frame), swindow); gnome_app_set_contents(GNOME_APP(abw.abook), frame); gtk_window_set_default_size (GTK_WINDOW(abw.abook), 400, 300); abook_load (); return abw.abook;}void abook_open (void){ gtk_widget_show_all(abw.abook);}AbookEntry* abook_search(gchar *nick) { AbookEntry *entry; GList *list_ptr = abook; while(list_ptr != NULL) { entry = list_ptr->data; if (g_strcasecmp(entry->nick, nick) == 0) return entry; list_ptr = g_list_next(list_ptr); } return NULL;}void abook_insert_entry(GtkWidget *entry) { GList *list_ptr = abook; AbookEntry *abentry = NULL; GtkWidget *dialog, *clist, *frame, *swindow; gchar *titles[]={"Nick", "Name"}, *clist_item[2]; dialog = gnome_dialog_new ("Select recipient", GNOME_STOCK_BUTTON_CLOSE, NULL); frame = gtk_frame_new("Select recipient:"); swindow = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(frame), swindow); clist = gtk_clist_new_with_titles(2, titles); gtk_container_add(GTK_CONTAINER(swindow), clist); gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox),frame,TRUE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(clist), "select-row", GTK_SIGNAL_FUNC(select_nick_cb), entry); while(list_ptr != NULL) { abentry = list_ptr->data; clist_item[0] = abentry->nick; clist_item[1] = abentry->name; gtk_clist_append (GTK_CLIST(clist), clist_item); list_ptr = g_list_next(list_ptr); } gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, TRUE, FALSE); gtk_window_set_default_size(GTK_WINDOW(dialog), 300, 200); gtk_widget_show_all(dialog); gnome_dialog_run_and_close (GNOME_DIALOG(dialog));}static void select_nick_cb (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer user_data){ gchar *text; gtk_clist_get_text(clist, row, 0, &text); gtk_entry_set_text(GTK_ENTRY(user_data), text); }static void close_cb(GtkWidget * widget, gpointer data){ abook_save(); gtk_widget_hide_all(abw.abook);}static gboolean delete_event_cb (GtkWidget * widget, gpointer data){ abook_save(); gtk_widget_hide_all(widget); return TRUE;}static gboolean destroy_event_cb (GtkWidget * widget, gpointer data){ abook_save(); abook_clear(); return FALSE;}static void new_entry_cb (GtkWidget *button, gpointer data){ abw.propertybox=gnome_property_box_new(); gtk_window_set_modal( GTK_WINDOW(abw.propertybox), TRUE); gnome_property_box_append_page(GNOME_PROPERTY_BOX(abw.propertybox), new_entry(FALSE), gtk_label_new(_("New Card") )); gtk_signal_connect (GTK_OBJECT (abw.propertybox), "apply", GTK_SIGNAL_FUNC (new_apply_cb), NULL); gtk_widget_show(abw.propertybox);}static void abook_del_cb (GtkWidget * widget, gpointer data) { if(sel_nick != NULL) { abook_delete_entry (sel_nick); sel_nick = NULL; }}static void abook_edit_cb (GtkWidget * widget, gpointer data) { if ((sel_nick) != NULL && !sel_alias) { abw.propertybox=gnome_property_box_new(); gtk_window_set_modal( GTK_WINDOW(abw.propertybox), TRUE); gnome_property_box_append_page(GNOME_PROPERTY_BOX(abw.propertybox), new_entry(TRUE), gtk_label_new(_("Edit Card") )); gtk_signal_connect (GTK_OBJECT (abw.propertybox), "apply", GTK_SIGNAL_FUNC (edit_apply_cb), NULL); gtk_widget_show(abw.propertybox); } sel_alias = FALSE;}static GtkWidget*new_entry(gboolean fill){ GtkWidget *label, *table, *hbox, *vscrollbar; GtkAdjustment *adjustment; AbookEntry *entry=NULL; if((sel_nick != NULL) && fill) entry = abook_search(sel_nick); table = gtk_table_new(3, 2, FALSE); /* labels */ label = gtk_label_new(_("Nick")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_SHRINK, 0, 5); label = gtk_label_new(_("Real Name")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_SHRINK, 0, 5); label = gtk_label_new(_("Number/Nicks")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 5); abw.nick = gtk_entry_new(); if (fill) gtk_entry_set_text(GTK_ENTRY(abw.nick), entry->nick); gtk_table_attach(GTK_TABLE(table), abw.nick, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 10, 5); gtk_signal_connect(GTK_OBJECT(abw.nick), "changed", GTK_SIGNAL_FUNC(input_changed_cb), NULL); abw.name = gtk_entry_new(); if (fill) gtk_entry_set_text(GTK_ENTRY(abw.name), entry->name); gtk_table_attach(GTK_TABLE(table), abw.name, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 10, 5); gtk_signal_connect(GTK_OBJECT(abw.name), "changed", GTK_SIGNAL_FUNC(input_changed_cb), NULL); hbox = gtk_hbox_new(FALSE,0); adjustment = (GtkAdjustment *) gtk_adjustment_new(0, 0, 1, 0.1, 0, 0); abw.numbers = gtk_text_new (NULL,adjustment); if(fill) { gint pos=0; if (entry->alias != NULL) { GList *list_ptr; GString *text; text = g_string_new(""); list_ptr = entry->alias; while (list_ptr != NULL ) { AbookEntry *alias_entry = list_ptr->data; g_string_sprintfa(text,"%s\n", alias_entry->nick); list_ptr = g_list_next(list_ptr); } gtk_editable_insert_text(GTK_EDITABLE(abw.numbers), text->str, text->len, &pos); g_string_free(text,TRUE); } else gtk_editable_insert_text(GTK_EDITABLE(abw.numbers), entry->number, strlen(entry->number), &pos); } gtk_text_set_editable(GTK_TEXT(abw.numbers), TRUE); vscrollbar = gtk_vscrollbar_new(adjustment); gtk_signal_connect(GTK_OBJECT(abw.numbers), "changed", GTK_SIGNAL_FUNC(input_changed_cb), NULL); gtk_container_add(GTK_CONTAINER(hbox), abw.numbers); gtk_box_pack_end(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 2, 3, GTK_FILL, GTK_FILL , 10, 5); gtk_widget_show_all(table); return table;}static voidinput_changed_cb (GtkWidget *widget, gpointer data){ gnome_property_box_changed(GNOME_PROPERTY_BOX (abw.propertybox));}static void new_apply_cb (GnomePropertyBox *pbox, gint page, gpointer data){ gchar *nick, *name, *numbers; if (page == -1) { /* Nick must not be NULL */ nick = gtk_entry_get_text (GTK_ENTRY(abw.nick)); if (*nick == '\0')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -