X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=gtk%2Ffriendlist.c;h=f7e683f959341fdd4f9bced7f60c4d553308b892;hb=bfd0d728ec6a185bfcb4d8836d611765f8bc45e2;hp=d5a056feff907b5bf5249e598d3084cf5e8747c7;hpb=c40cfeb0fe12b6803d25a11664fd16d49a4a9b2a;p=linphone diff --git a/gtk/friendlist.c b/gtk/friendlist.c index d5a056fe..f7e683f9 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -27,12 +27,14 @@ enum{ FRIEND_NAME, FRIEND_PRESENCE_STATUS, FRIEND_ID, + FRIEND_CHATROOM, FRIEND_SIP_ADDRESS, FRIEND_ICON, + FRIEND_CALL, + FRIEND_CHAT, FRIEND_LIST_NCOL }; - typedef struct _status_picture_tab_t{ LinphoneOnlineStatus status; const char *img; @@ -67,6 +69,25 @@ static GdkPixbuf *create_status_picture(LinphoneOnlineStatus ss){ return NULL; } +static GdkPixbuf *create_call_picture(){ + GdkPixbuf *pixbuf; + pixbuf = create_pixbuf("call.png"); + return pixbuf; +} + +static GdkPixbuf *create_unread_msg(){ + GdkPixbuf *pixbuf; + pixbuf = create_pixbuf("active_chat.png"); + return pixbuf; +} + +static GdkPixbuf *create_chat_picture(){ + GdkPixbuf *pixbuf; + pixbuf = create_pixbuf("chat.png"); + return pixbuf; +} + +/* void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid, const gchar *url, const gchar *status, const gchar *img){ GtkTreeIter iter; LinphoneFriend *tmp=0; @@ -87,9 +108,17 @@ void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid } }while(gtk_tree_model_iter_next(model,&iter)); } - } +*/ +gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr){ + LinphoneFriend *lf; + char *addr_str=linphone_address_as_string(addr); + lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),addr_str); + if(lf == NULL){ + return FALSE; + } return TRUE; +} static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){ GtkTreeSelection *select; @@ -107,22 +136,259 @@ static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){ } } +void linphone_gtk_add_contact(){ + GtkWidget *w=linphone_gtk_create_window("contact"); + int presence_enabled=linphone_gtk_get_ui_config_int("use_subscribe_notify",1); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),presence_enabled); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"allow_presence")), + presence_enabled); + gtk_widget_show(w); +} + +void linphone_gtk_edit_contact(GtkWidget *button){ + GtkWidget *w=gtk_widget_get_toplevel(button); + GtkTreeSelection *select; + GtkTreeIter iter; + GtkTreeModel *model; + LinphoneFriend *lf=NULL; + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); + if (gtk_tree_selection_get_selected (select, &model, &iter)) + { + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + linphone_gtk_show_contact(lf); + } +} + +void linphone_gtk_remove_contact(GtkWidget *button){ + GtkWidget *w=gtk_widget_get_toplevel(button); + GtkTreeSelection *select; + GtkTreeIter iter; + GtkTreeModel *model; + LinphoneFriend *lf=NULL; + LinphoneChatRoom *cr=NULL; + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); + if (gtk_tree_selection_get_selected (select, &model, &iter)) + { + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + linphone_core_remove_friend(linphone_gtk_get_core(),lf); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + linphone_chat_room_delete_history(cr); + linphone_gtk_show_friends(); + } +} + +void linphone_gtk_delete_history(GtkWidget *button){ + GtkWidget *w=linphone_gtk_get_main_window(); + GtkTreeSelection *select; + GtkTreeIter iter; + GtkTreeModel *model; + GtkWidget *chat_view; + LinphoneFriend *lf=NULL; + GtkWidget *friendlist; + + friendlist=linphone_gtk_get_widget(w,"contact_list"); + chat_view=(GtkWidget *)g_object_get_data(G_OBJECT(friendlist),"chatview"); + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(friendlist)); + if (gtk_tree_selection_get_selected (select, &model, &iter)) + { + LinphoneChatRoom *cr; + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + linphone_chat_room_delete_history(cr); + if(chat_view!=NULL){ + char *from=g_object_get_data(G_OBJECT(friendlist),"from"); + char *addr=linphone_address_as_string(linphone_friend_get_address(lf)); + if(g_strcmp0(from,addr)==0){ + GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); + GtkTextIter start; + GtkTextIter end; + GtkTextBuffer *text_buffer; + + text_buffer=gtk_text_view_get_buffer(text_view); + gtk_text_buffer_get_bounds(text_buffer, &start, &end); + gtk_text_buffer_delete (text_buffer, &start, &end); + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + } + } + linphone_gtk_show_friends(); + } +} + static void linphone_gtk_call_selected(GtkTreeView *treeview){ linphone_gtk_set_selection_to_uri_bar(treeview); linphone_gtk_start_call(linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(treeview)), "start_call")); } +void linphone_gtk_friend_list_update_chat_picture(){ + GtkTreeIter iter; + GtkWidget *w = linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); + LinphoneChatRoom *cr=NULL; + int nbmsg=0; + if (gtk_tree_model_get_iter_first(model,&iter)) { + do{ + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + nbmsg=linphone_chat_room_get_unread_messages_count(cr); + if(nbmsg != 0){ + gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_unread_msg(),-1); + } else { + gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_chat_picture(),-1); + } + }while(gtk_tree_model_iter_next(model,&iter)); + } +} + +static gboolean grab_focus(GtkWidget *w){ + gtk_widget_grab_focus(w); + return FALSE; +} + +void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la){ + GtkTreeIter iter; + GtkListStore *store=NULL; + GtkWidget *w = linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); + GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + LinphoneFriend *lf=NULL; + LinphoneChatRoom *cr=NULL; + GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + char *la_str=linphone_address_as_string(la); + + lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),la_str); + if(lf==NULL){ + cr=linphone_gtk_create_chatroom(la); + g_object_set_data(G_OBJECT(friendlist),"from",la_str); + if(chat_view==NULL){ + chat_view=linphone_gtk_init_chatroom(cr,la); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)chat_view); + } else { + linphone_gtk_load_chatroom(cr,la,chat_view); + } + gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); + linphone_gtk_friend_list_update_chat_picture(); + g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); + } else { + store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); + if (gtk_tree_model_get_iter_first(model,&iter)) { + do{ + const LinphoneAddress *uri; + char *lf_str; + gtk_tree_model_get(model, &iter,FRIEND_ID , &lf, -1); + uri=linphone_friend_get_address(lf); + lf_str=linphone_address_as_string(uri); + if( g_strcmp0(lf_str,la_str)==0){ + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + if(cr==NULL){ + cr=linphone_gtk_create_chatroom(uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); + } + g_object_set_data(G_OBJECT(friendlist),"from",linphone_address_as_string(uri)); + if(chat_view==NULL){ + chat_view=linphone_gtk_init_chatroom(cr,uri); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)chat_view); + } else { + linphone_gtk_load_chatroom(cr,uri,chat_view); + } + gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); + linphone_gtk_friend_list_update_chat_picture(); + g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); + break; + } + }while(gtk_tree_model_iter_next(model,&iter)); + } + } +} + +void linphone_gtk_notebook_tab_select(GtkNotebook *notebook,GtkWidget *page,guint page_num, gpointer data){ + GtkWidget *w=linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkWidget *chat_view; + LinphoneChatRoom *cr=NULL; + chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + if(page != NULL){ + notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + if(gtk_notebook_page_num(notebook,page)==gtk_notebook_page_num(notebook,chat_view)){ + cr=g_object_get_data(G_OBJECT(chat_view),"cr"); + if(cr!=NULL){ + linphone_chat_room_mark_as_read(cr); + linphone_gtk_show_friends(); + } + } + } +} + +void linphone_gtk_chat_selected(GtkWidget *item){ + GtkWidget *w=gtk_widget_get_toplevel(item); + GtkTreeSelection *select; + GtkListStore *store=NULL; + GtkTreeIter iter; + GtkTreeModel *model; + LinphoneFriend *lf=NULL; + LinphoneChatRoom *cr=NULL; + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkWidget *page; + + select=gtk_tree_view_get_selection(GTK_TREE_VIEW(friendlist)); + store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(item))); + if (gtk_tree_selection_get_selected (select, &model, &iter)){ + GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + const LinphoneAddress *uri; + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + uri=linphone_friend_get_address(lf); + if(cr==NULL){ + cr=linphone_gtk_create_chatroom(uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); + } + page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + g_object_set_data(G_OBJECT(friendlist),"from",linphone_address_as_string(uri)); + if(page==NULL){ + page=linphone_gtk_init_chatroom(cr,uri); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)page); + } else { + linphone_gtk_load_chatroom(cr,uri,page); + } + gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); + linphone_gtk_friend_list_update_chat_picture(); + g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); + } +} + void linphone_gtk_contact_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { - linphone_gtk_call_selected(treeview); + //linphone_gtk_call_selected(treeview); } void linphone_gtk_contact_clicked(GtkTreeView *treeview){ linphone_gtk_set_selection_to_uri_bar(treeview); + if(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(treeview),"numcol"))==1){ + linphone_gtk_call_selected(treeview); + } else { + if(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(treeview),"numcol"))==2){ + linphone_gtk_chat_selected(GTK_WIDGET(treeview)); + } + } + g_object_set_data(G_OBJECT(treeview),"numcol",GINT_TO_POINTER(0)); +} + + +void linphone_gtk_add_button_clicked(void){ + linphone_gtk_add_contact(); +} + +void linphone_gtk_edit_button_clicked(GtkWidget *button){ + linphone_gtk_edit_contact(button); +} + +void linphone_gtk_remove_button_clicked(GtkWidget *button){ + linphone_gtk_remove_contact(button); } static GtkWidget * create_presence_menu(){ @@ -247,7 +513,11 @@ static gboolean friend_search_func(GtkTreeModel *model, gint column, gboolean ret=TRUE; gtk_tree_model_get(model,iter,FRIEND_NAME,&name,-1); if (name!=NULL){ - ret=strstr(name,key)==NULL; + gchar *uname=g_utf8_casefold(name,-1); /* need that to perform case-insensitive search in utf8 */ + gchar *ukey=g_utf8_casefold(key,-1); + ret=strstr(uname,ukey)==NULL; + g_free(uname); + g_free(ukey); g_free(name); } return ret; @@ -275,7 +545,7 @@ static gint friend_sort(GtkTreeModel *model, GtkTreeIter *a,GtkTreeIter *b,gpoin static void on_name_column_clicked(GtkTreeModel *model){ GtkSortType st; gint column; - + gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model),&column,&st); if (column==FRIEND_NAME){ if (st==GTK_SORT_ASCENDING) st=GTK_SORT_DESCENDING; @@ -284,7 +554,6 @@ static void on_name_column_clicked(GtkTreeModel *model){ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),FRIEND_NAME,st); } - static int get_friend_weight(const LinphoneFriend *lf){ int w=0; switch(linphone_friend_get_status(lf)){ @@ -320,14 +589,6 @@ static int friend_compare_func(const LinphoneFriend *lf1, const LinphoneFriend * return w2-w1; } -static gint friend_sort_with_presence(GtkTreeModel *model, GtkTreeIter *a,GtkTreeIter *b,gpointer user_data){ - LinphoneFriend *lf1=NULL,*lf2=NULL; - gtk_tree_model_get(model,a,FRIEND_ID,&lf1,-1); - gtk_tree_model_get(model,b,FRIEND_ID,&lf2,-1); - return friend_compare_func(lf1,lf2); -} - - static MSList *sort_friend_list(const MSList *friends){ MSList *ret=NULL; const MSList *elem; @@ -343,7 +604,7 @@ static MSList *sort_friend_list(const MSList *friends){ static void on_presence_column_clicked(GtkTreeModel *model){ GtkSortType st; gint column; - + gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model),&column,&st); if (column==FRIEND_ID){ if (st==GTK_SORT_ASCENDING) st=GTK_SORT_DESCENDING; @@ -352,44 +613,37 @@ static void on_presence_column_clicked(GtkTreeModel *model){ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),FRIEND_ID,st); } -static void linphone_gtk_friend_list_init(GtkWidget *friendlist) -{ +void create_button(){ + GtkWidget *main_window = linphone_gtk_get_main_window (); + GtkWidget *button_add = linphone_gtk_get_widget(main_window,"add_button"); + GtkWidget *image; + + image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU); + gtk_container_add (GTK_CONTAINER (button_add), image); +} + +static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ GtkListStore *store; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *select; linphone_gtk_init_bookmark_icon(); - - store = gtk_list_store_new(FRIEND_LIST_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, - G_TYPE_STRING, GDK_TYPE_PIXBUF); + + store = gtk_list_store_new(FRIEND_LIST_NCOL,GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, + G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); gtk_tree_view_set_model(GTK_TREE_VIEW(friendlist),GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); + /* Tree specification*/ + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(friendlist),FALSE); gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(friendlist),friend_search_func,NULL,NULL); gtk_tree_view_set_search_column(GTK_TREE_VIEW(friendlist),FRIEND_NAME); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store),FRIEND_NAME,friend_sort,NULL,NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store),FRIEND_ID,friend_sort_with_presence,NULL,NULL); - - renderer = gtk_cell_renderer_pixbuf_new (); - column = gtk_tree_view_column_new_with_attributes (_("Name"), - renderer, - "pixbuf", FRIEND_ICON, - NULL); - g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); - g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_name_column_clicked,GTK_TREE_MODEL(store)); - gtk_tree_view_column_set_clickable(column,TRUE); + /*Name and presence column*/ renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column,renderer,FALSE); - gtk_tree_view_column_add_attribute (column,renderer, - "text", - FRIEND_NAME); - - gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); - column = gtk_tree_view_column_new_with_attributes (_("Presence status"), renderer, "text", FRIEND_PRESENCE_STATUS, @@ -398,21 +652,47 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist) g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_presence_column_clicked,GTK_TREE_MODEL(store)); gtk_tree_view_column_set_clickable(column,TRUE); gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_status",1)); - + gtk_tree_view_column_set_min_width(column,50); + renderer = gtk_cell_renderer_pixbuf_new(); - gtk_tree_view_column_pack_start(column,renderer,FALSE); + gtk_tree_view_column_pack_start(column,renderer,TRUE); gtk_tree_view_column_add_attribute (column,renderer, "pixbuf", FRIEND_PRESENCE_IMG); gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Name"), + renderer, + "text", FRIEND_NAME,NULL); + g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); + g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_name_column_clicked,GTK_TREE_MODEL(store)); + gtk_tree_view_column_set_clickable(column,TRUE); + gtk_tree_view_column_set_expand(column,TRUE); + gtk_tree_view_column_set_max_width(column,60); + gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + + /* Call column*/ + renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes (_("Call"),renderer,"pixbuf",FRIEND_CALL,NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + + /* Chat column*/ + renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes (_("Chat"),renderer,"pixbuf",FRIEND_CHAT,NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + select = gtk_tree_view_get_selection (GTK_TREE_VIEW (friendlist)); gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); + + gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(friendlist),GTK_TREE_VIEW_GRID_LINES_NONE); #if GTK_CHECK_VERSION(2,12,0) gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(friendlist),FRIEND_SIP_ADDRESS); #endif - gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget( - gtk_widget_get_toplevel(friendlist),"show_category")),0); + + gtk_widget_set_size_request(friendlist,200,120); + /*gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget( + gtk_widget_get_toplevel(friendlist),"show_category")),0);*/ } void linphone_gtk_show_directory_search(void){ @@ -468,33 +748,31 @@ void linphone_gtk_directory_search_button_clicked(GtkWidget *button){ linphone_gtk_get_widget(gtk_widget_get_toplevel(button),"directory_search_entry")); } - void linphone_gtk_show_friends(void){ GtkWidget *mw=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(mw,"contact_list"); GtkListStore *store=NULL; GtkTreeIter iter; const MSList *itf; - GtkWidget *category=linphone_gtk_get_widget(mw,"show_category"); - GtkWidget *filter=linphone_gtk_get_widget(mw,"search_bar"); + //GtkWidget *filter=linphone_gtk_get_widget(mw,"search_bar"); LinphoneCore *core=linphone_gtk_get_core(); - const gchar *search=NULL; - gboolean online_only=FALSE,lookup=FALSE; + //const gchar *search=NULL; + //gboolean lookup=FALSE; MSList *sorted; - - linphone_gtk_show_directory_search(); + LinphoneChatRoom *cr=NULL; + linphone_gtk_show_directory_search(); if (gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))==NULL){ linphone_gtk_friend_list_init(friendlist); } + store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); gtk_list_store_clear(store); - online_only=(gtk_combo_box_get_active(GTK_COMBO_BOX(category))==1); - search=gtk_entry_get_text(GTK_ENTRY(filter)); - if (search==NULL || search[0]=='\0') - lookup=FALSE; - else lookup=TRUE; + //search=gtk_entry_get_text(GTK_ENTRY(filter)); + //if (search==NULL || search[0]=='\0') + // lookup=FALSE; + //else lookup=TRUE; sorted=sort_friend_list(linphone_core_get_friend_list(core)); @@ -505,66 +783,47 @@ void linphone_gtk_show_friends(void){ const char *name=linphone_address_get_display_name(f_uri); const char *display=name; char *escaped=NULL; - if (lookup){ + //char buf[26]={0}; + int nbmsg=0; + + /*if (lookup){ if (strstr(uri,search)==NULL){ ms_free(uri); continue; } + }*/ + //BuddyInfo *bi; + gboolean send_subscribe=linphone_friend_get_send_subscribe(lf); + if (name==NULL || name[0]=='\0') { + display=linphone_address_get_username(f_uri); } - if (!online_only || (linphone_friend_get_status(lf)!=LinphoneStatusOffline)){ - BuddyInfo *bi; - gboolean send_subscribe=linphone_friend_get_send_subscribe(lf); - if (name==NULL || name[0]=='\0') display=uri; - gtk_list_store_append(store,&iter); - gtk_list_store_set(store,&iter,FRIEND_NAME, display, - FRIEND_PRESENCE_STATUS, - send_subscribe ? linphone_online_status_to_string(linphone_friend_get_status(lf)) : "", - FRIEND_ID,lf, - FRIEND_PRESENCE_IMG, send_subscribe ? create_status_picture(linphone_friend_get_status(lf)) : NULL, - -1); - escaped=g_markup_escape_text(uri,-1); - gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); - g_free(escaped); - bi=linphone_friend_get_info(lf); - if (bi!=NULL && bi->image_data!=NULL){ - GdkPixbuf *pbuf= - _gdk_pixbuf_new_from_memory_at_scale(bi->image_data,bi->image_length,-1,40,TRUE); - if (pbuf) { - gtk_list_store_set(store,&iter,FRIEND_ICON,pbuf,-1); - g_object_unref(G_OBJECT(pbuf)); - } - } + gtk_list_store_append(store,&iter); + gtk_list_store_set(store,&iter,FRIEND_NAME, display,FRIEND_ID,lf, + FRIEND_PRESENCE_IMG, send_subscribe ? create_status_picture(linphone_friend_get_status(lf)) : NULL, + FRIEND_CHAT,create_chat_picture(),FRIEND_CALL,create_call_picture(),-1); + cr=linphone_gtk_create_chatroom(f_uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); + nbmsg=linphone_chat_room_get_unread_messages_count(cr); + if(nbmsg != 0){ + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_unread_msg(),-1); } + escaped=g_markup_escape_text(uri,-1); + gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); + g_free(escaped); + //bi=linphone_friend_get_info(lf); + /*if (bi!=NULL && bi->image_data!=NULL){ + GdkPixbuf *pbuf= + _gdk_pixbuf_new_from_memory_at_scale(bi->image_data,bi->image_length,-1,40,TRUE); + if (pbuf) { + //gtk_list_store_set(store,&iter,FRIEND_ICON,pbuf,-1); + g_object_unref(G_OBJECT(pbuf)); + } + }*/ ms_free(uri); } ms_list_free(sorted); } -void linphone_gtk_add_contact(){ - GtkWidget *w=linphone_gtk_create_window("contact"); - int presence_enabled=linphone_gtk_get_ui_config_int("use_subscribe_notify",1); - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),presence_enabled); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"allow_presence")), - presence_enabled); - gtk_widget_show(w); -} - -void linphone_gtk_remove_contact(GtkWidget *button){ - GtkWidget *w=gtk_widget_get_toplevel(button); - GtkTreeSelection *select; - GtkTreeIter iter; - GtkTreeModel *model; - LinphoneFriend *lf=NULL; - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); - if (gtk_tree_selection_get_selected (select, &model, &iter)) - { - gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - linphone_core_remove_friend(linphone_gtk_get_core(),lf); - linphone_gtk_show_friends(); - } -} - void linphone_gtk_show_contact(LinphoneFriend *lf){ GtkWidget *w=linphone_gtk_create_window("contact"); char *uri; @@ -587,37 +846,6 @@ void linphone_gtk_show_contact(LinphoneFriend *lf){ gtk_widget_show(w); } -void linphone_gtk_edit_contact(GtkWidget *button){ - GtkWidget *w=gtk_widget_get_toplevel(button); - GtkTreeSelection *select; - GtkTreeIter iter; - GtkTreeModel *model; - LinphoneFriend *lf=NULL; - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); - if (gtk_tree_selection_get_selected (select, &model, &iter)) - { - gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - linphone_gtk_show_contact(lf); - } -} - -void linphone_gtk_chat_selected(GtkWidget *item){ - GtkWidget *w=gtk_widget_get_toplevel(item); - GtkTreeSelection *select; - GtkTreeIter iter; - GtkTreeModel *model; - LinphoneFriend *lf=NULL; - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); - if (gtk_tree_selection_get_selected (select, &model, &iter)) - { - char *uri; - gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - uri=linphone_address_as_string(linphone_friend_get_address(lf)); - linphone_gtk_create_chatroom(uri); - ms_free(uri); - } -} - void linphone_gtk_contact_cancel(GtkWidget *button){ gtk_widget_destroy(gtk_widget_get_toplevel(button)); } @@ -625,9 +853,11 @@ void linphone_gtk_contact_cancel(GtkWidget *button){ void linphone_gtk_contact_ok(GtkWidget *button){ GtkWidget *w=gtk_widget_get_toplevel(button); LinphoneFriend *lf=(LinphoneFriend*)g_object_get_data(G_OBJECT(w),"friend_ref"); + LinphoneFriend *lf2; char *fixed_uri=NULL; gboolean show_presence=FALSE,allow_presence=FALSE; const gchar *name,*uri; + LinphoneAddress* friend_address; if (lf==NULL){ lf=linphone_friend_new(); if (linphone_gtk_get_ui_config_int("use_subscribe_notify",1)==1){ @@ -646,19 +876,23 @@ void linphone_gtk_contact_ok(GtkWidget *button){ linphone_gtk_display_something(GTK_MESSAGE_WARNING,_("Invalid sip contact !")); return ; } - LinphoneAddress* friend_address = linphone_address_new(fixed_uri); + friend_address = linphone_address_new(fixed_uri); linphone_address_set_display_name(friend_address,name); linphone_friend_set_addr(lf,friend_address); - ms_free(fixed_uri); linphone_address_destroy(friend_address); linphone_friend_send_subscribe(lf,show_presence); linphone_friend_set_inc_subscribe_policy(lf,allow_presence==TRUE ? LinphoneSPAccept : LinphoneSPDeny); if (linphone_friend_in_list(lf)) { linphone_friend_done(lf); - }else{ - linphone_core_add_friend(linphone_gtk_get_core(),lf); + } else { + lf2=linphone_core_get_friend_by_address(linphone_gtk_get_core(),fixed_uri); + if(lf2==NULL){ + linphone_friend_set_name(lf,name); + linphone_core_add_friend(linphone_gtk_get_core(),lf); + } } + ms_free(fixed_uri); linphone_gtk_show_friends(); gtk_widget_destroy(w); } @@ -670,6 +904,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ gchar *text_label=NULL; gchar *edit_label=NULL; gchar *delete_label=NULL; + gchar *delete_hist_label=NULL; gchar *name=NULL; GtkTreeSelection *select; GtkTreeIter iter; @@ -692,6 +927,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ text_label=g_strdup_printf(_("Send text to %s"),name); edit_label=g_strdup_printf(_("Edit contact '%s'"),name); delete_label=g_strdup_printf(_("Delete contact '%s'"),name); + delete_hist_label=g_strdup_printf(_("Delete chat history of '%s'"),name); g_free(name); } if (call_label){ @@ -730,7 +966,16 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_remove_contact,contact_list); } - + + if (delete_hist_label){ + menu_item=gtk_image_menu_item_new_with_label(delete_hist_label); + image=gtk_image_new_from_stock(GTK_STOCK_CLEAR,GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); + gtk_widget_show(image); + gtk_widget_show(menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); + g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_delete_history,contact_list); + } if (ssc && (sip_setup_context_get_capabilities(ssc) & SIP_SETUP_CAP_BUDDY_LOOKUP)) { gchar *tmp=g_strdup_printf(_("Add new contact from %s directory"),linphone_proxy_config_get_domain(cfg)); @@ -744,7 +989,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_show_buddy_lookup_window,ssc); gtk_widget_show(menu); } - + menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); gtk_widget_show(menu_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); @@ -759,19 +1004,64 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ return menu; } - gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event){ GtkWidget *m=linphone_gtk_create_contact_menu(list); - gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL, + gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL, event ? event->button : 0, event ? event->time : gtk_get_current_event_time()); return TRUE; } +gint get_col_number_from_tree_view_column (GtkTreeViewColumn *col){ + GList *cols; + gint num; + g_return_val_if_fail ( col != NULL, -1 ); + g_return_val_if_fail ( col->tree_view != NULL, -1 ); + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view)); + num = g_list_index(cols, (gpointer) col); + g_list_free(cols); + + return num; +} + +static gint tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y){ + GtkTreeViewColumn *col = NULL; + GList *node, *columns; + gint colx = 0; + GtkTreePath *path; + GtkTreeViewDropPosition pos; + + g_return_val_if_fail ( view != NULL, 0 ); + columns = gtk_tree_view_get_columns(view); + + gtk_tree_view_get_dest_row_at_pos(view,x,y,&path,&pos); + if(path != NULL){ + for (node = columns; node != NULL && col == NULL; node = node->next){ + GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data; + if (x >= colx && x < (colx + checkcol->width)){ + col = checkcol; + gint num = get_col_number_from_tree_view_column(col); + return num; + } else { + colx += checkcol->width; + } + } + } + g_list_free(columns); + return 0; +} + gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventButton *event){ /* Ignore double-clicks and triple-clicks */ if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { return linphone_gtk_popup_contact_menu(widget, event); + } else if(event->button == 1 && event->type == GDK_BUTTON_PRESS){ + gint numcol = tree_view_get_cell_from_pos(GTK_TREE_VIEW(widget),event->x,event->y); + if(numcol==2){ + g_object_set_data(G_OBJECT(widget),"numcol",GINT_TO_POINTER(1)); + } else if(numcol==3){ + g_object_set_data(G_OBJECT(widget),"numcol",GINT_TO_POINTER(2)); + } } return FALSE; } @@ -779,6 +1069,4 @@ gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventBut void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf){ /*refresh the entire list*/ linphone_gtk_show_friends(); -} - - +} \ No newline at end of file