diff options
Diffstat (limited to 'src/editgroup.c')
| -rw-r--r-- | src/editgroup.c | 902 |
1 files changed, 902 insertions, 0 deletions
diff --git a/src/editgroup.c b/src/editgroup.c new file mode 100644 index 0000000..21fcfcd --- /dev/null +++ b/src/editgroup.c | |||
| @@ -0,0 +1,902 @@ | |||
| 1 | /* | ||
| 2 | * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client | ||
| 3 | * Copyright (C) 1999-2017 Hiroyuki Yamamoto | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifdef HAVE_CONFIG_H | ||
| 21 | # include "config.h" | ||
| 22 | #endif | ||
| 23 | |||
| 24 | #include "defs.h" | ||
| 25 | |||
| 26 | #include <glib.h> | ||
| 27 | #include <glib/gi18n.h> | ||
| 28 | #include <gdk/gdkkeysyms.h> | ||
| 29 | #include <gtk/gtk.h> | ||
| 30 | |||
| 31 | #include "addressbook.h" | ||
| 32 | #include "addressitem.h" | ||
| 33 | #include "addrbook.h" | ||
| 34 | #include "addritem.h" | ||
| 35 | |||
| 36 | #include "mgutils.h" | ||
| 37 | |||
| 38 | #include "prefs_common.h" | ||
| 39 | |||
| 40 | #include "alertpanel.h" | ||
| 41 | #include "inputdialog.h" | ||
| 42 | #include "manage_window.h" | ||
| 43 | #include "gtkutils.h" | ||
| 44 | #include "stock_pixmap.h" | ||
| 45 | |||
| 46 | #define ADDRESSBOOK_GUESS_FOLDER_NAME "NewFolder" | ||
| 47 | #define ADDRESSBOOK_GUESS_GROUP_NAME "NewGroup" | ||
| 48 | |||
| 49 | #define EDITGROUP_WIDTH 680 | ||
| 50 | #define EDITGROUP_HEIGHT 380 | ||
| 51 | |||
| 52 | typedef enum { | ||
| 53 | GROUP_COL_NAME, | ||
| 54 | GROUP_COL_EMAIL, | ||
| 55 | GROUP_COL_REMARKS, | ||
| 56 | GROUP_COL_DATA, | ||
| 57 | GROUP_COL_PIXBUF, | ||
| 58 | GROUP_COL_PIXBUF_OPEN, | ||
| 59 | GROUP_N_COLS | ||
| 60 | } GroupEditEMailColumns; | ||
| 61 | |||
| 62 | #define GROUP_COL_WIDTH_NAME 160 | ||
| 63 | #define GROUP_COL_WIDTH_EMAIL 140 | ||
| 64 | #define GROUP_COL_WIDTH_REMARKS 80 | ||
| 65 | |||
| 66 | static struct _GroupEdit_dlg { | ||
| 67 | GtkWidget *window; | ||
| 68 | GtkWidget *hbbox; | ||
| 69 | GtkWidget *ok_btn; | ||
| 70 | GtkWidget *cancel_btn; | ||
| 71 | GtkWidget *statusbar; | ||
| 72 | gint status_cid; | ||
| 73 | |||
| 74 | /* Basic data tab */ | ||
| 75 | GtkWidget *entry_name; | ||
| 76 | GtkTreeView *treeview_avail; | ||
| 77 | GtkTreeView *treeview_group; | ||
| 78 | } groupeditdlg; | ||
| 79 | |||
| 80 | |||
| 81 | static GdkPixbuf *folderpix; | ||
| 82 | static GdkPixbuf *folderopenpix; | ||
| 83 | |||
| 84 | static gchar *_edit_group_dfl_message_ = NULL; | ||
| 85 | |||
| 86 | static void edit_group_status_show( gchar *msg ) { | ||
| 87 | if( groupeditdlg.statusbar != NULL ) { | ||
| 88 | gtk_statusbar_pop( GTK_STATUSBAR(groupeditdlg.statusbar), groupeditdlg.status_cid ); | ||
| 89 | if( msg ) { | ||
| 90 | gtk_statusbar_push( GTK_STATUSBAR(groupeditdlg.statusbar), groupeditdlg.status_cid, msg ); | ||
| 91 | } | ||
| 92 | } | ||
| 93 | } | ||
| 94 | |||
| 95 | static void edit_group_ok(GtkWidget *widget, gboolean *cancelled) { | ||
| 96 | gchar *sName; | ||
| 97 | gboolean errFlag = TRUE; | ||
| 98 | |||
| 99 | sName = gtk_editable_get_chars( GTK_EDITABLE(groupeditdlg.entry_name), 0, -1 ); | ||
| 100 | if( sName ) { | ||
| 101 | g_strstrip( sName ); | ||
| 102 | if( *sName != '\0' ) { | ||
| 103 | gtk_entry_set_text(GTK_ENTRY(groupeditdlg.entry_name), sName ); | ||
| 104 | *cancelled = FALSE; | ||
| 105 | gtk_main_quit(); | ||
| 106 | errFlag = FALSE; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | if( errFlag ) { | ||
| 110 | edit_group_status_show( _( "A Group Name must be supplied." ) ); | ||
| 111 | } | ||
| 112 | g_free( sName ); | ||
| 113 | } | ||
| 114 | |||
| 115 | static void edit_group_cancel(GtkWidget *widget, gboolean *cancelled) { | ||
| 116 | *cancelled = TRUE; | ||
| 117 | gtk_main_quit(); | ||
| 118 | } | ||
| 119 | |||
| 120 | static gint edit_group_delete_event(GtkWidget *widget, GdkEventAny *event, gboolean *cancelled) { | ||
| 121 | *cancelled = TRUE; | ||
| 122 | gtk_main_quit(); | ||
| 123 | return TRUE; | ||
| 124 | } | ||
| 125 | |||
| 126 | static gboolean edit_group_key_pressed(GtkWidget *widget, GdkEventKey *event, gboolean *cancelled) { | ||
| 127 | if (event && event->keyval == GDK_Escape) { | ||
| 128 | *cancelled = TRUE; | ||
| 129 | gtk_main_quit(); | ||
| 130 | } | ||
| 131 | return FALSE; | ||
| 132 | } | ||
| 133 | |||
| 134 | static gchar *edit_group_format_item( ItemPerson *person, ItemEMail *email ) { | ||
| 135 | gchar *str = NULL; | ||
| 136 | gchar *aName = ADDRITEM_NAME(email); | ||
| 137 | if( aName == NULL || *aName == '\0' ) return str; | ||
| 138 | if( person ) { | ||
| 139 | str = g_strdup_printf( "%s - %s", ADDRITEM_NAME(person), aName ); | ||
| 140 | } | ||
| 141 | else { | ||
| 142 | str = g_strdup( aName ); | ||
| 143 | } | ||
| 144 | return str; | ||
| 145 | } | ||
| 146 | |||
| 147 | static void edit_group_list_add_email(GtkTreeStore *store, GtkTreeIter *parent, ItemEMail *email) { | ||
| 148 | ItemPerson *person = (ItemPerson *)ADDRITEM_PARENT(email); | ||
| 149 | gchar *name; | ||
| 150 | GtkTreeIter iter; | ||
| 151 | |||
| 152 | name = edit_group_format_item(person, email); | ||
| 153 | if (!name) | ||
| 154 | name = g_strdup(ADDRITEM_NAME(person)); | ||
| 155 | |||
| 156 | gtk_tree_store_append(store, &iter, parent); | ||
| 157 | gtk_tree_store_set(store, &iter, | ||
| 158 | GROUP_COL_NAME, name, | ||
| 159 | GROUP_COL_EMAIL, email->address, | ||
| 160 | GROUP_COL_REMARKS, email->remarks, | ||
| 161 | GROUP_COL_DATA, email, -1); | ||
| 162 | if (parent && GTK_TREE_MODEL(store) == gtk_tree_view_get_model(groupeditdlg.treeview_avail)) { | ||
| 163 | gtkut_tree_view_expand_parent_all(groupeditdlg.treeview_avail, &iter); | ||
| 164 | } | ||
| 165 | |||
| 166 | g_free(name); | ||
| 167 | } | ||
| 168 | |||
| 169 | /* | ||
| 170 | * Build available email list with folder tree excluding ones in already | ||
| 171 | * the group | ||
| 172 | */ | ||
| 173 | static void edit_group_load_available_list_recurse(ItemFolder *folder, GtkTreeIter *parent, GHashTable *table) { | ||
| 174 | GtkTreeModel *model; | ||
| 175 | GtkTreeStore *store; | ||
| 176 | GtkTreeIter iter; | ||
| 177 | GList *node; | ||
| 178 | |||
| 179 | model = gtk_tree_view_get_model(groupeditdlg.treeview_avail); | ||
| 180 | store = GTK_TREE_STORE(model); | ||
| 181 | |||
| 182 | if (ADDRITEM_PARENT(folder)) { | ||
| 183 | gtk_tree_store_append(store, &iter, parent); | ||
| 184 | gtk_tree_store_set(store, &iter, | ||
| 185 | GROUP_COL_NAME, ADDRITEM_NAME(folder), | ||
| 186 | GROUP_COL_EMAIL, "", | ||
| 187 | GROUP_COL_REMARKS, "", | ||
| 188 | GROUP_COL_DATA, folder, | ||
| 189 | GROUP_COL_PIXBUF, folderpix, | ||
| 190 | GROUP_COL_PIXBUF_OPEN, folderopenpix, -1); | ||
| 191 | } | ||
| 192 | |||
| 193 | node = folder->listFolder; | ||
| 194 | while (node) { | ||
| 195 | if (ADDRITEM_TYPE(node->data) == ITEMTYPE_FOLDER) { | ||
| 196 | ItemFolder *child = (ItemFolder *)node->data; | ||
| 197 | edit_group_load_available_list_recurse(child, ADDRITEM_PARENT(folder) ? &iter : NULL, table); | ||
| 198 | } | ||
| 199 | node = g_list_next(node); | ||
| 200 | } | ||
| 201 | |||
| 202 | node = folder->listPerson; | ||
| 203 | while (node) { | ||
| 204 | if (ADDRITEM_TYPE(node->data) == ITEMTYPE_PERSON) { | ||
| 205 | GList *cur; | ||
| 206 | ItemPerson *person = (ItemPerson *)node->data; | ||
| 207 | cur = person->listEMail; | ||
| 208 | while (cur) { | ||
| 209 | ItemEMail *email = (ItemEMail *)cur->data; | ||
| 210 | if (!g_hash_table_lookup(table, ADDRITEM_ID(email))) { | ||
| 211 | edit_group_list_add_email(store, ADDRITEM_PARENT(folder) ? &iter : NULL, email); | ||
| 212 | } | ||
| 213 | cur = g_list_next(cur); | ||
| 214 | } | ||
| 215 | } | ||
| 216 | node = g_list_next(node); | ||
| 217 | } | ||
| 218 | } | ||
| 219 | |||
| 220 | static void edit_group_load_available_list(AddressBookFile *abf, ItemGroup *group) { | ||
| 221 | GHashTable *table; | ||
| 222 | |||
| 223 | g_return_if_fail(abf != NULL); | ||
| 224 | |||
| 225 | table = g_hash_table_new(g_str_hash, g_str_equal); | ||
| 226 | if (group) { | ||
| 227 | GList *list = group->listEMail; | ||
| 228 | while (list) { | ||
| 229 | ItemEMail *email = list->data; | ||
| 230 | g_hash_table_insert(table, ADDRITEM_ID(email), email); | ||
| 231 | list = g_list_next(list); | ||
| 232 | } | ||
| 233 | } | ||
| 234 | |||
| 235 | edit_group_load_available_list_recurse(abf->addressCache->rootFolder, NULL, table); | ||
| 236 | |||
| 237 | g_hash_table_destroy(table); | ||
| 238 | table = NULL; | ||
| 239 | } | ||
| 240 | |||
| 241 | static void edit_group_load_group_list( GtkTreeView *treeview, GList *listEMail ) { | ||
| 242 | GList *node = listEMail; | ||
| 243 | GtkTreeModel *model = gtk_tree_view_get_model(treeview); | ||
| 244 | |||
| 245 | while (node) { | ||
| 246 | ItemEMail *email = node->data; | ||
| 247 | edit_group_list_add_email(GTK_TREE_STORE(model), NULL, email); | ||
| 248 | node = g_list_next(node); | ||
| 249 | } | ||
| 250 | } | ||
| 251 | |||
| 252 | static gboolean edit_group_find_parent_folder(GtkTreeModel *model, GtkTreeIter *parent, ItemEMail *email) { | ||
| 253 | ItemPerson *person; | ||
| 254 | ItemFolder *folder; | ||
| 255 | |||
| 256 | person = (ItemPerson *)ADDRITEM_PARENT(email); | ||
| 257 | folder = (ItemFolder *)ADDRITEM_PARENT(person); | ||
| 258 | if (ADDRITEM_TYPE(folder) != ITEMTYPE_FOLDER) { | ||
| 259 | return FALSE; | ||
| 260 | } | ||
| 261 | if (ADDRITEM_PARENT(folder) == NULL) { | ||
| 262 | /* Root folder */ | ||
| 263 | return FALSE; | ||
| 264 | } | ||
| 265 | |||
| 266 | if (gtkut_tree_model_find_by_column_data(model, parent, NULL, GROUP_COL_DATA, folder)) { | ||
| 267 | return TRUE; | ||
| 268 | } | ||
| 269 | |||
| 270 | return FALSE; | ||
| 271 | } | ||
| 272 | |||
| 273 | static gboolean edit_group_find_next_selection(GtkTreeModel *model, GtkTreeIter *next) { | ||
| 274 | gboolean valid; | ||
| 275 | GtkTreeIter iter = *next; | ||
| 276 | AddrItemObject *obj; | ||
| 277 | |||
| 278 | while ((valid = gtkut_tree_model_next(model, &iter)) != FALSE) { | ||
| 279 | gtk_tree_model_get(model, &iter, GROUP_COL_DATA, &obj, -1); | ||
| 280 | if (!obj || ADDRITEM_TYPE(obj) == ITEMTYPE_FOLDER) { | ||
| 281 | continue; | ||
| 282 | } | ||
| 283 | *next = iter; | ||
| 284 | return TRUE; | ||
| 285 | } | ||
| 286 | |||
| 287 | return FALSE; | ||
| 288 | } | ||
| 289 | |||
| 290 | static gboolean edit_group_find_last_selection(GtkTreeModel *model, GtkTreeIter *next) { | ||
| 291 | gboolean valid; | ||
| 292 | GtkTreeIter iter; | ||
| 293 | GtkTreeIter last; | ||
| 294 | AddrItemObject *obj; | ||
| 295 | gboolean found = FALSE; | ||
| 296 | |||
| 297 | valid = gtk_tree_model_get_iter_first(model, &iter); | ||
| 298 | while (valid) { | ||
| 299 | gtk_tree_model_get(model, &iter, GROUP_COL_DATA, &obj, -1); | ||
| 300 | if (obj && ADDRITEM_TYPE(obj) != ITEMTYPE_FOLDER) { | ||
| 301 | last = iter; | ||
| 302 | found = TRUE; | ||
| 303 | } | ||
| 304 | valid = gtkut_tree_model_next(model, &iter); | ||
| 305 | } | ||
| 306 | |||
| 307 | if (found) { | ||
| 308 | *next = last; | ||
| 309 | } | ||
| 310 | return found; | ||
| 311 | } | ||
| 312 | |||
| 313 | static void edit_group_move_email( GtkTreeView *treeview_from, GtkTreeView *treeview_to ) { | ||
| 314 | GtkTreeModel *model; | ||
| 315 | GtkTreeModel *model_to; | ||
| 316 | GtkTreeSelection *selection; | ||
| 317 | GtkTreeIter iter; | ||
| 318 | GtkTreeIter next; | ||
| 319 | gboolean next_valid; | ||
| 320 | GList *rows; | ||
| 321 | GList *cur; | ||
| 322 | GtkTreePath *path; | ||
| 323 | AddrItemObject *obj; | ||
| 324 | ItemEMail *email; | ||
| 325 | GtkTreeIter parent; | ||
| 326 | |||
| 327 | model = gtk_tree_view_get_model(treeview_from); | ||
| 328 | selection = gtk_tree_view_get_selection(treeview_from); | ||
| 329 | rows = gtk_tree_selection_get_selected_rows(selection, NULL); | ||
| 330 | if (!rows) { | ||
| 331 | return; | ||
| 332 | } | ||
| 333 | rows = g_list_reverse(rows); | ||
| 334 | |||
| 335 | path = (GtkTreePath *)rows->data; | ||
| 336 | gtk_tree_model_get_iter(model, &next, path); | ||
| 337 | next_valid = edit_group_find_next_selection(model, &next); | ||
| 338 | |||
| 339 | model_to = gtk_tree_view_get_model(treeview_to); | ||
| 340 | |||
| 341 | for (cur = rows; cur != NULL; cur = cur->next) { | ||
| 342 | path = (GtkTreePath *)cur->data; | ||
| 343 | gtk_tree_model_get_iter(model, &iter, path); | ||
| 344 | gtk_tree_model_get(model, &iter, GROUP_COL_DATA, &obj, -1); | ||
| 345 | if (obj && ADDRITEM_TYPE(obj) == ITEMTYPE_FOLDER) { | ||
| 346 | continue; | ||
| 347 | } | ||
| 348 | email = (ItemEMail *)obj; | ||
| 349 | if (treeview_to == groupeditdlg.treeview_avail && | ||
| 350 | edit_group_find_parent_folder(model_to, &parent, email)) { | ||
| 351 | edit_group_list_add_email(GTK_TREE_STORE(model_to), &parent, email); | ||
| 352 | } else { | ||
| 353 | edit_group_list_add_email(GTK_TREE_STORE(model_to), NULL, email); | ||
| 354 | } | ||
| 355 | gtk_tree_store_remove(GTK_TREE_STORE(model), &iter); | ||
| 356 | gtk_tree_path_free(path); | ||
| 357 | } | ||
| 358 | g_list_free(rows); | ||
| 359 | |||
| 360 | gtk_tree_selection_unselect_all(selection); | ||
| 361 | if (!next_valid) { | ||
| 362 | next_valid = edit_group_find_last_selection(model, &next); | ||
| 363 | } | ||
| 364 | if (next_valid) { | ||
| 365 | gtk_tree_selection_select_iter(selection, &next); | ||
| 366 | } | ||
| 367 | } | ||
| 368 | |||
| 369 | static void edit_group_to_group( GtkWidget *widget, gpointer data ) { | ||
| 370 | edit_group_move_email( groupeditdlg.treeview_avail, groupeditdlg.treeview_group ); | ||
| 371 | } | ||
| 372 | |||
| 373 | static void edit_group_to_avail( GtkWidget *widget, gpointer data ) { | ||
| 374 | edit_group_move_email( groupeditdlg.treeview_group, groupeditdlg.treeview_avail ); | ||
| 375 | } | ||
| 376 | |||
| 377 | static gboolean edit_group_list_group_button( GtkWidget *treeview, GdkEventButton *event, gpointer data ) { | ||
| 378 | if( ! event ) return FALSE; | ||
| 379 | if( event->button == 1 ) { | ||
| 380 | if( event->type == GDK_2BUTTON_PRESS ) { | ||
| 381 | edit_group_to_avail( NULL, NULL ); | ||
| 382 | } | ||
| 383 | } | ||
| 384 | return FALSE; | ||
| 385 | } | ||
| 386 | |||
| 387 | static gboolean edit_group_list_avail_button( GtkWidget *treeview, GdkEventButton *event, gpointer data ) { | ||
| 388 | if( ! event ) return FALSE; | ||
| 389 | if( event->button == 1 ) { | ||
| 390 | if( event->type == GDK_2BUTTON_PRESS ) { | ||
| 391 | edit_group_to_group( NULL, NULL ); | ||
| 392 | } | ||
| 393 | } | ||
| 394 | return FALSE; | ||
| 395 | } | ||
| 396 | |||
| 397 | static gint edit_group_list_col_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gint col) | ||
| 398 | { | ||
| 399 | gchar *name1 = NULL, *name2 = NULL; | ||
| 400 | gint ret; | ||
| 401 | |||
| 402 | gtk_tree_model_get(model, a, col, &name1, -1); | ||
| 403 | gtk_tree_model_get(model, b, col, &name2, -1); | ||
| 404 | |||
| 405 | if (!name1) { | ||
| 406 | name1 = g_strdup(""); | ||
| 407 | } | ||
| 408 | if (!name2) { | ||
| 409 | name2 = g_strdup(""); | ||
| 410 | } | ||
| 411 | |||
| 412 | ret = g_ascii_strcasecmp(name1, name2); | ||
| 413 | g_free(name2); | ||
| 414 | g_free(name1); | ||
| 415 | |||
| 416 | return ret; | ||
| 417 | } | ||
| 418 | |||
| 419 | static gint edit_group_list_name_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data) { | ||
| 420 | gint ret; | ||
| 421 | |||
| 422 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_NAME); | ||
| 423 | if (ret == 0) | ||
| 424 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_EMAIL); | ||
| 425 | if (ret == 0) | ||
| 426 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_REMARKS); | ||
| 427 | |||
| 428 | return ret; | ||
| 429 | } | ||
| 430 | |||
| 431 | static gint edit_group_list_email_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data) { | ||
| 432 | gint ret; | ||
| 433 | |||
| 434 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_EMAIL); | ||
| 435 | if (ret == 0) | ||
| 436 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_NAME); | ||
| 437 | if (ret == 0) | ||
| 438 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_REMARKS); | ||
| 439 | |||
| 440 | return ret; | ||
| 441 | } | ||
| 442 | |||
| 443 | static gint edit_group_list_remarks_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data) { | ||
| 444 | gint ret; | ||
| 445 | |||
| 446 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_REMARKS); | ||
| 447 | if (ret == 0) | ||
| 448 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_NAME); | ||
| 449 | if (ret == 0) | ||
| 450 | ret = edit_group_list_col_compare(model, a, b, GROUP_COL_EMAIL); | ||
| 451 | |||
| 452 | return ret; | ||
| 453 | } | ||
| 454 | |||
| 455 | static void addressbook_edit_group_create( gboolean *cancelled ) { | ||
| 456 | GtkWidget *window; | ||
| 457 | GtkWidget *vbox; | ||
| 458 | GtkWidget *vbox1; | ||
| 459 | GtkWidget *hbbox; | ||
| 460 | GtkWidget *ok_btn; | ||
| 461 | GtkWidget *cancel_btn; | ||
| 462 | GtkWidget *hsbox; | ||
| 463 | GtkWidget *statusbar; | ||
| 464 | |||
| 465 | GtkWidget *hboxg; | ||
| 466 | GtkWidget *table; | ||
| 467 | GtkWidget *label; | ||
| 468 | GtkWidget *entry_name; | ||
| 469 | GtkWidget *hboxl; | ||
| 470 | GtkWidget *vboxl; | ||
| 471 | GtkWidget *hboxh; | ||
| 472 | GtkWidget *vboxb; | ||
| 473 | GtkWidget *vboxb1; | ||
| 474 | GtkWidget *hboxb; | ||
| 475 | |||
| 476 | GtkWidget *treeview_swin; | ||
| 477 | GtkWidget *treeview_avail; | ||
| 478 | GtkWidget *treeview_group; | ||
| 479 | GtkTreeStore *store; | ||
| 480 | GtkTreeViewColumn *column; | ||
| 481 | GtkCellRenderer *renderer; | ||
| 482 | GtkTreeSelection *selection; | ||
| 483 | |||
| 484 | GtkWidget *button_add; | ||
| 485 | GtkWidget *button_remove; | ||
| 486 | gint top; | ||
| 487 | |||
| 488 | gchar *titles[ GROUP_N_COLS ]; | ||
| 489 | |||
| 490 | titles[ GROUP_COL_NAME ] = _( "Name" ); | ||
| 491 | titles[ GROUP_COL_EMAIL ] = _("E-Mail Address"); | ||
| 492 | titles[ GROUP_COL_REMARKS ] = _("Remarks"); | ||
| 493 | |||
| 494 | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | ||
| 495 | gtk_widget_set_size_request(window, EDITGROUP_WIDTH, EDITGROUP_HEIGHT); | ||
| 496 | gtk_window_set_title(GTK_WINDOW(window), _("Edit Group Data")); | ||
| 497 | gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ON_PARENT); | ||
| 498 | gtk_window_set_modal(GTK_WINDOW(window), TRUE); | ||
| 499 | gtk_widget_realize(window); | ||
| 500 | g_signal_connect(G_OBJECT(window), "delete_event", | ||
| 501 | G_CALLBACK(edit_group_delete_event), | ||
| 502 | cancelled); | ||
| 503 | g_signal_connect(G_OBJECT(window), "key_press_event", | ||
| 504 | G_CALLBACK(edit_group_key_pressed), | ||
| 505 | cancelled); | ||
| 506 | |||
| 507 | vbox = gtk_vbox_new( FALSE, 4 ); | ||
| 508 | gtk_container_add( GTK_CONTAINER( window ), vbox ); | ||
| 509 | |||
| 510 | vbox1 = gtk_vbox_new( FALSE, 10 ); | ||
| 511 | gtk_box_pack_start(GTK_BOX(vbox), vbox1, TRUE, TRUE, 0); | ||
| 512 | gtk_container_set_border_width(GTK_CONTAINER(vbox1), 6); | ||
| 513 | |||
| 514 | /* Group area */ | ||
| 515 | hboxg = gtk_hbox_new( FALSE, 0 ); | ||
| 516 | gtk_box_pack_start(GTK_BOX(vbox1), hboxg, FALSE, FALSE, 0); | ||
| 517 | |||
| 518 | /* Data entry area */ | ||
| 519 | table = gtk_table_new( 1, 2, FALSE); | ||
| 520 | gtk_box_pack_start(GTK_BOX(hboxg), table, TRUE, TRUE, 0); | ||
| 521 | gtk_table_set_row_spacings(GTK_TABLE(table), 0); | ||
| 522 | gtk_table_set_col_spacings(GTK_TABLE(table), 4); | ||
| 523 | |||
| 524 | /* First row */ | ||
| 525 | top = 0; | ||
| 526 | label = gtk_label_new(_("Group Name")); | ||
| 527 | gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0); | ||
| 528 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | ||
| 529 | |||
| 530 | entry_name = gtk_entry_new(); | ||
| 531 | gtk_table_attach(GTK_TABLE(table), entry_name, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); | ||
| 532 | |||
| 533 | /* List area */ | ||
| 534 | hboxl = gtk_hbox_new( FALSE, 8 ); | ||
| 535 | gtk_box_pack_start(GTK_BOX(vbox1), hboxl, TRUE, TRUE, 0); | ||
| 536 | |||
| 537 | /* Available list */ | ||
| 538 | vboxl = gtk_vbox_new( FALSE, 4 ); | ||
| 539 | gtk_box_pack_start(GTK_BOX(hboxl), vboxl, TRUE, TRUE, 0); | ||
| 540 | |||
| 541 | hboxh = gtk_hbox_new( FALSE, 0 ); | ||
| 542 | gtk_box_pack_start(GTK_BOX(vboxl), hboxh, FALSE, FALSE, 0); | ||
| 543 | label = gtk_label_new(_("Available Addresses")); | ||
| 544 | gtk_box_pack_start(GTK_BOX(hboxh), label, FALSE, FALSE, 0); | ||
| 545 | |||
| 546 | treeview_swin = gtk_scrolled_window_new( NULL, NULL ); | ||
| 547 | gtk_box_pack_start(GTK_BOX(vboxl), treeview_swin, TRUE, TRUE, 0); | ||
| 548 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treeview_swin), | ||
| 549 | GTK_POLICY_AUTOMATIC, | ||
| 550 | GTK_POLICY_ALWAYS); | ||
| 551 | |||
| 552 | store = gtk_tree_store_new(GROUP_N_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); | ||
| 553 | gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), | ||
| 554 | GROUP_COL_NAME, | ||
| 555 | edit_group_list_name_compare_func, | ||
| 556 | NULL, NULL); | ||
| 557 | gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), | ||
| 558 | GROUP_COL_EMAIL, | ||
| 559 | edit_group_list_email_compare_func, | ||
| 560 | NULL, NULL); | ||
| 561 | gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), | ||
| 562 | GROUP_COL_REMARKS, | ||
| 563 | edit_group_list_remarks_compare_func, | ||
| 564 | NULL, NULL); | ||
| 565 | |||
| 566 | treeview_avail = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); | ||
| 567 | g_object_unref(G_OBJECT(store)); | ||
| 568 | gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview_avail), TRUE); | ||
| 569 | gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview_avail), FALSE); | ||
| 570 | gtk_container_add(GTK_CONTAINER(treeview_swin), treeview_avail); | ||
| 571 | |||
| 572 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview_avail)); | ||
| 573 | gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); | ||
| 574 | |||
| 575 | column = gtk_tree_view_column_new(); | ||
| 576 | renderer = gtk_cell_renderer_pixbuf_new(); | ||
| 577 | g_object_set(renderer, "ypad", 0, NULL); | ||
| 578 | gtk_tree_view_column_pack_start(column, renderer, FALSE); | ||
| 579 | gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", GROUP_COL_PIXBUF, "pixbuf-expander-open", GROUP_COL_PIXBUF_OPEN, "pixbuf-expander-closed", GROUP_COL_PIXBUF, NULL); | ||
| 580 | |||
| 581 | renderer = gtk_cell_renderer_text_new(); | ||
| 582 | g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ypad", 0, NULL); | ||
| 583 | gtk_tree_view_column_pack_start(column, renderer, TRUE); | ||
| 584 | gtk_tree_view_column_set_attributes(column, renderer, "text", GROUP_COL_NAME, NULL); | ||
| 585 | |||
| 586 | gtk_tree_view_column_set_title(column, titles[GROUP_COL_NAME]); | ||
| 587 | gtk_tree_view_column_set_spacing(column, 1); | ||
| 588 | gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); | ||
| 589 | gtk_tree_view_column_set_fixed_width(column, GROUP_COL_WIDTH_NAME); | ||
| 590 | gtk_tree_view_column_set_resizable(column, TRUE); | ||
| 591 | gtk_tree_view_column_set_sort_column_id(column, GROUP_COL_NAME); | ||
| 592 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview_avail), column); | ||
| 593 | gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview_avail), column); | ||
| 594 | |||
| 595 | renderer = gtk_cell_renderer_text_new(); | ||
| 596 | g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ypad", 0, NULL); | ||
| 597 | column = gtk_tree_view_column_new_with_attributes(titles[GROUP_COL_EMAIL], renderer, "text", GROUP_COL_EMAIL, NULL); | ||
| 598 | gtk_tree_view_column_set_spacing(column, 1); | ||
| 599 | gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); | ||
| 600 | gtk_tree_view_column_set_fixed_width(column, GROUP_COL_WIDTH_EMAIL); | ||
| 601 | gtk_tree_view_column_set_resizable(column, TRUE); | ||
| 602 | gtk_tree_view_column_set_sort_column_id(column, GROUP_COL_EMAIL); | ||
| 603 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview_avail), column); | ||
| 604 | |||
| 605 | renderer = gtk_cell_renderer_text_new(); | ||
| 606 | g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ypad", 0, NULL); | ||
| 607 | column = gtk_tree_view_column_new_with_attributes(titles[GROUP_COL_REMARKS], renderer, "text", GROUP_COL_REMARKS, NULL); | ||
| 608 | gtk_tree_view_column_set_spacing(column, 1); | ||
| 609 | gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); | ||
| 610 | gtk_tree_view_column_set_fixed_width(column, GROUP_COL_WIDTH_REMARKS); | ||
| 611 | gtk_tree_view_column_set_resizable(column, TRUE); | ||
| 612 | gtk_tree_view_column_set_sort_column_id(column, GROUP_COL_REMARKS); | ||
| 613 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview_avail), column); | ||
| 614 | |||
| 615 | gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), | ||
| 616 | GROUP_COL_NAME, GTK_SORT_ASCENDING); | ||
| 617 | |||
| 618 | /* Add/Remove button */ | ||
| 619 | vboxb = gtk_vbox_new( FALSE, 0 ); | ||
| 620 | gtk_box_pack_start(GTK_BOX(hboxl), vboxb, FALSE, FALSE, 0); | ||
| 621 | |||
| 622 | vboxb1 = gtk_vbox_new( FALSE, 8 ); | ||
| 623 | gtk_box_pack_start(GTK_BOX(vboxb), vboxb1, TRUE, FALSE, 0); | ||
| 624 | |||
| 625 | button_add = gtk_button_new_with_label( _( " -> " ) ); | ||
| 626 | gtk_box_pack_start(GTK_BOX(vboxb1), button_add, FALSE, FALSE, 0); | ||
| 627 | |||
| 628 | button_remove = gtk_button_new_with_label( _( " <- " ) ); | ||
| 629 | gtk_box_pack_start(GTK_BOX(vboxb1), button_remove, FALSE, FALSE, 0); | ||
| 630 | |||
| 631 | /* Group list */ | ||
| 632 | vboxl = gtk_vbox_new( FALSE, 4 ); | ||
| 633 | gtk_box_pack_start(GTK_BOX(hboxl), vboxl, TRUE, TRUE, 0); | ||
| 634 | |||
| 635 | hboxh = gtk_hbox_new( FALSE, 0 ); | ||
| 636 | gtk_box_pack_start(GTK_BOX(vboxl), hboxh, FALSE, FALSE, 0); | ||
| 637 | label = gtk_label_new(_("Addresses in Group")); | ||
| 638 | gtk_box_pack_start(GTK_BOX(hboxh), label, FALSE, FALSE, 0); | ||
| 639 | |||
| 640 | treeview_swin = gtk_scrolled_window_new( NULL, NULL ); | ||
| 641 | gtk_box_pack_start(GTK_BOX(vboxl), treeview_swin, TRUE, TRUE, 0); | ||
| 642 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treeview_swin), | ||
| 643 | GTK_POLICY_AUTOMATIC, | ||
| 644 | GTK_POLICY_ALWAYS); | ||
| 645 | |||
| 646 | store = gtk_tree_store_new(GROUP_N_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); | ||
| 647 | gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), | ||
| 648 | GROUP_COL_NAME, | ||
| 649 | edit_group_list_name_compare_func, | ||
| 650 | NULL, NULL); | ||
| 651 | gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), | ||
| 652 | GROUP_COL_EMAIL, | ||
| 653 | edit_group_list_email_compare_func, | ||
| 654 | NULL, NULL); | ||
| 655 | gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), | ||
| 656 | GROUP_COL_REMARKS, | ||
| 657 | edit_group_list_remarks_compare_func, | ||
| 658 | NULL, NULL); | ||
| 659 | |||
| 660 | treeview_group = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); | ||
| 661 | g_object_unref(G_OBJECT(store)); | ||
| 662 | gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview_group), TRUE); | ||
| 663 | gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview_group), FALSE); | ||
| 664 | gtk_container_add(GTK_CONTAINER(treeview_swin), treeview_group); | ||
| 665 | |||
| 666 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview_group)); | ||
| 667 | gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); | ||
| 668 | |||
| 669 | renderer = gtk_cell_renderer_text_new(); | ||
| 670 | g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ypad", 0, NULL); | ||
| 671 | column = gtk_tree_view_column_new_with_attributes(titles[GROUP_COL_NAME], renderer, "text", GROUP_COL_NAME, NULL); | ||
| 672 | gtk_tree_view_column_set_spacing(column, 1); | ||
| 673 | gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); | ||
| 674 | gtk_tree_view_column_set_fixed_width(column, GROUP_COL_WIDTH_NAME); | ||
| 675 | gtk_tree_view_column_set_resizable(column, TRUE); | ||
| 676 | gtk_tree_view_column_set_sort_column_id(column, GROUP_COL_NAME); | ||
| 677 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview_group), column); | ||
| 678 | |||
| 679 | renderer = gtk_cell_renderer_text_new(); | ||
| 680 | g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ypad", 0, NULL); | ||
| 681 | column = gtk_tree_view_column_new_with_attributes(titles[GROUP_COL_EMAIL], renderer, "text", GROUP_COL_EMAIL, NULL); | ||
| 682 | gtk_tree_view_column_set_spacing(column, 1); | ||
| 683 | gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); | ||
| 684 | gtk_tree_view_column_set_fixed_width(column, GROUP_COL_WIDTH_EMAIL); | ||
| 685 | gtk_tree_view_column_set_resizable(column, TRUE); | ||
| 686 | gtk_tree_view_column_set_sort_column_id(column, GROUP_COL_EMAIL); | ||
| 687 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview_group), column); | ||
| 688 | |||
| 689 | renderer = gtk_cell_renderer_text_new(); | ||
| 690 | g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ypad", 0, NULL); | ||
| 691 | column = gtk_tree_view_column_new_with_attributes(titles[GROUP_COL_REMARKS], renderer, "text", GROUP_COL_REMARKS, NULL); | ||
| 692 | gtk_tree_view_column_set_spacing(column, 1); | ||
| 693 | gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); | ||
| 694 | gtk_tree_view_column_set_fixed_width(column, GROUP_COL_WIDTH_REMARKS); | ||
| 695 | gtk_tree_view_column_set_resizable(column, TRUE); | ||
| 696 | gtk_tree_view_column_set_sort_column_id(column, GROUP_COL_REMARKS); | ||
| 697 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview_group), column); | ||
| 698 | |||
| 699 | gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), | ||
| 700 | GROUP_COL_NAME, GTK_SORT_ASCENDING); | ||
| 701 | /* Button panel */ | ||
| 702 | hboxb = gtk_hbox_new(FALSE, 8); | ||
| 703 | gtk_box_pack_start(GTK_BOX(vbox1), hboxb, FALSE, FALSE, 0); | ||
| 704 | |||
| 705 | gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK, | ||
| 706 | &cancel_btn, GTK_STOCK_CANCEL, | ||
| 707 | NULL, NULL); | ||
| 708 | gtk_box_pack_end(GTK_BOX(hboxb), hbbox, FALSE, FALSE, 0); | ||
| 709 | gtk_widget_grab_default(ok_btn); | ||
| 710 | |||
| 711 | g_signal_connect(G_OBJECT(ok_btn), "clicked", | ||
| 712 | G_CALLBACK(edit_group_ok), cancelled); | ||
| 713 | g_signal_connect(G_OBJECT(cancel_btn), "clicked", | ||
| 714 | G_CALLBACK(edit_group_cancel), cancelled); | ||
| 715 | |||
| 716 | /* Status line */ | ||
| 717 | hsbox = gtk_hbox_new(FALSE, 0); | ||
| 718 | gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, 0); | ||
| 719 | statusbar = gtk_statusbar_new(); | ||
| 720 | gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0); | ||
| 721 | |||
| 722 | gtk_widget_show_all(vbox); | ||
| 723 | |||
| 724 | /* Event handlers */ | ||
| 725 | g_signal_connect(G_OBJECT(button_add), "clicked", | ||
| 726 | G_CALLBACK( edit_group_to_group ), NULL); | ||
| 727 | g_signal_connect(G_OBJECT(button_remove), "clicked", | ||
| 728 | G_CALLBACK( edit_group_to_avail ), NULL); | ||
| 729 | g_signal_connect(G_OBJECT(treeview_avail), "button_press_event", | ||
| 730 | G_CALLBACK(edit_group_list_avail_button), NULL); | ||
| 731 | g_signal_connect(G_OBJECT(treeview_group), "button_press_event", | ||
| 732 | G_CALLBACK(edit_group_list_group_button), NULL); | ||
| 733 | |||
| 734 | groupeditdlg.window = window; | ||
| 735 | groupeditdlg.hbbox = hbbox; | ||
| 736 | groupeditdlg.ok_btn = ok_btn; | ||
| 737 | groupeditdlg.cancel_btn = cancel_btn; | ||
| 738 | groupeditdlg.statusbar = statusbar; | ||
| 739 | groupeditdlg.status_cid = gtk_statusbar_get_context_id( GTK_STATUSBAR(statusbar), "Edit Group Dialog" ); | ||
| 740 | |||
| 741 | groupeditdlg.entry_name = entry_name; | ||
| 742 | groupeditdlg.treeview_group = GTK_TREE_VIEW( treeview_group ); | ||
| 743 | groupeditdlg.treeview_avail = GTK_TREE_VIEW( treeview_avail ); | ||
| 744 | |||
| 745 | stock_pixbuf_gdk(window, STOCK_PIXMAP_FOLDER_CLOSE, &folderpix); | ||
| 746 | stock_pixbuf_gdk(window, STOCK_PIXMAP_FOLDER_OPEN, &folderopenpix); | ||
| 747 | |||
| 748 | if( ! _edit_group_dfl_message_ ) { | ||
| 749 | _edit_group_dfl_message_ = _( "Move E-Mail Addresses to or from Group with arrow buttons" ); | ||
| 750 | } | ||
| 751 | } | ||
| 752 | |||
| 753 | /* | ||
| 754 | * Return list of email items. | ||
| 755 | */ | ||
| 756 | static GList *edit_group_build_email_list() { | ||
| 757 | GtkTreeView *treeview = groupeditdlg.treeview_group; | ||
| 758 | GtkTreeModel *model; | ||
| 759 | GtkTreeIter iter; | ||
| 760 | gboolean valid; | ||
| 761 | GList *listEMail = NULL; | ||
| 762 | ItemEMail *email; | ||
| 763 | |||
| 764 | model = gtk_tree_view_get_model(treeview); | ||
| 765 | valid = gtk_tree_model_get_iter_first(model, &iter); | ||
| 766 | while (valid) { | ||
| 767 | gtk_tree_model_get(model, &iter, GROUP_COL_DATA, &email, -1); | ||
| 768 | listEMail = g_list_append( listEMail, email ); | ||
| 769 | valid = gtk_tree_model_iter_next(model, &iter); | ||
| 770 | } | ||
| 771 | |||
| 772 | return listEMail; | ||
| 773 | } | ||
| 774 | |||
| 775 | /* | ||
| 776 | * Edit group. | ||
| 777 | * Enter: abf Address book. | ||
| 778 | * folder Parent folder for group (or NULL if adding to root folder). Argument is | ||
| 779 | * only required for new objects). | ||
| 780 | * group Group to edit, or NULL for a new group object. | ||
| 781 | * Return: Edited object, or NULL if cancelled. | ||
| 782 | */ | ||
| 783 | ItemGroup *addressbook_edit_group( AddressBookFile *abf, ItemFolder *parent, ItemGroup *group ) { | ||
| 784 | static gboolean cancelled; | ||
| 785 | GList *listEMail = NULL; | ||
| 786 | gchar *name; | ||
| 787 | GtkTreeModel *model; | ||
| 788 | GtkTreeSelection *selection; | ||
| 789 | GtkTreeIter iter; | ||
| 790 | |||
| 791 | if (!groupeditdlg.window) | ||
| 792 | addressbook_edit_group_create(&cancelled); | ||
| 793 | gtkut_box_set_reverse_order(GTK_BOX(groupeditdlg.hbbox), | ||
| 794 | !prefs_common.comply_gnome_hig); | ||
| 795 | gtk_widget_grab_focus(groupeditdlg.ok_btn); | ||
| 796 | gtk_widget_grab_focus(groupeditdlg.entry_name); | ||
| 797 | manage_window_set_transient(GTK_WINDOW(groupeditdlg.window)); | ||
| 798 | gtk_widget_show(groupeditdlg.window); | ||
| 799 | |||
| 800 | /* Clear all fields */ | ||
| 801 | edit_group_status_show( "" ); | ||
| 802 | model = gtk_tree_view_get_model(groupeditdlg.treeview_group); | ||
| 803 | gtk_tree_store_clear(GTK_TREE_STORE(model)); | ||
| 804 | model = gtk_tree_view_get_model(groupeditdlg.treeview_avail); | ||
| 805 | gtk_tree_store_clear(GTK_TREE_STORE(model)); | ||
| 806 | |||
| 807 | if( group ) { | ||
| 808 | if( ADDRITEM_NAME(group) ) | ||
| 809 | gtk_entry_set_text(GTK_ENTRY(groupeditdlg.entry_name), ADDRITEM_NAME(group) ); | ||
| 810 | edit_group_load_group_list( groupeditdlg.treeview_group, group->listEMail ); | ||
| 811 | gtk_window_set_title( GTK_WINDOW(groupeditdlg.window), _("Edit Group Details")); | ||
| 812 | } | ||
| 813 | else { | ||
| 814 | gtk_window_set_title( GTK_WINDOW(groupeditdlg.window), _("Add New Group")); | ||
| 815 | gtk_entry_set_text(GTK_ENTRY(groupeditdlg.entry_name), ADDRESSBOOK_GUESS_GROUP_NAME ); | ||
| 816 | } | ||
| 817 | |||
| 818 | edit_group_load_available_list(abf, group); | ||
| 819 | gtk_tree_view_expand_all(groupeditdlg.treeview_avail); | ||
| 820 | |||
| 821 | model = gtk_tree_view_get_model(groupeditdlg.treeview_group); | ||
| 822 | selection = gtk_tree_view_get_selection(groupeditdlg.treeview_group); | ||
| 823 | if (gtk_tree_model_get_iter_first(model, &iter)) { | ||
| 824 | gtk_tree_selection_select_iter(selection, &iter); | ||
| 825 | } | ||
| 826 | model = gtk_tree_view_get_model(groupeditdlg.treeview_avail); | ||
| 827 | selection = gtk_tree_view_get_selection(groupeditdlg.treeview_avail); | ||
| 828 | if (gtk_tree_model_get_iter_first(model, &iter)) { | ||
| 829 | gtk_tree_selection_select_iter(selection, &iter); | ||
| 830 | } | ||
| 831 | |||
| 832 | edit_group_status_show( _edit_group_dfl_message_ ); | ||
| 833 | |||
| 834 | gtk_main(); | ||
| 835 | gtk_widget_hide( groupeditdlg.window ); | ||
| 836 | |||
| 837 | if( cancelled ) { | ||
| 838 | return NULL; | ||
| 839 | } | ||
| 840 | |||
| 841 | listEMail = edit_group_build_email_list(); | ||
| 842 | if( group ) { | ||
| 843 | /* Update email list */ | ||
| 844 | addrbook_update_group_list( abf, group, listEMail ); | ||
| 845 | } | ||
| 846 | else { | ||
| 847 | /* Create new person and email list */ | ||
| 848 | group = addrbook_add_group_list( abf, parent, listEMail ); | ||
| 849 | } | ||
| 850 | name = gtk_editable_get_chars( GTK_EDITABLE(groupeditdlg.entry_name), 0, -1 ); | ||
| 851 | addritem_group_set_name( group, name ); | ||
| 852 | g_free( name ); | ||
| 853 | |||
| 854 | listEMail = NULL; | ||
| 855 | return group; | ||
| 856 | } | ||
| 857 | |||
| 858 | /* | ||
| 859 | * Edit folder. | ||
| 860 | * Enter: abf Address book. | ||
| 861 | * parent Parent folder for folder (or NULL if adding to root folder). Argument is | ||
| 862 | * only required for new objects). | ||
| 863 | * folder Folder to edit, or NULL for a new folder object. | ||
| 864 | * Return: Edited object, or NULL if cancelled. | ||
| 865 | */ | ||
| 866 | ItemFolder *addressbook_edit_folder( AddressBookFile *abf, ItemFolder *parent, ItemFolder *folder ) { | ||
| 867 | gchar *name = NULL; | ||
| 868 | |||
| 869 | if( folder ) { | ||
| 870 | name = g_strdup( ADDRITEM_NAME(folder) ); | ||
| 871 | name = input_dialog( _("Edit folder"), _("Input the new name of folder:"), name ); | ||
| 872 | } | ||
| 873 | else { | ||
| 874 | name = input_dialog( _("New folder"), | ||
| 875 | _("Input the name of new folder:"), | ||
| 876 | _(ADDRESSBOOK_GUESS_FOLDER_NAME) ); | ||
| 877 | } | ||
| 878 | if( ! name ) return NULL; | ||
| 879 | g_strstrip( name ); | ||
| 880 | if( *name == '\0' ) { | ||
| 881 | g_free( name ); | ||
| 882 | return NULL; | ||
| 883 | } | ||
| 884 | if( folder ) { | ||
| 885 | if( g_ascii_strcasecmp( name, ADDRITEM_NAME(folder) ) == 0 ) { | ||
| 886 | g_free( name ); | ||
| 887 | return NULL; | ||
| 888 | } | ||
| 889 | } | ||
| 890 | |||
| 891 | if( ! folder ) { | ||
| 892 | folder = addrbook_add_new_folder( abf, parent ); | ||
| 893 | } | ||
| 894 | addritem_folder_set_name( folder, name ); | ||
| 895 | g_free( name ); | ||
| 896 | return folder; | ||
| 897 | } | ||
| 898 | |||
| 899 | /* | ||
| 900 | * End of Source. | ||
| 901 | */ | ||
| 902 | |||
