⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abook.c

📁 GNOME下的短信息发送中心
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -