| 211 { |
218 { |
| 212 gnt_widget_destroy(sub->window); /* the "destroy" callback will remove entry from the hashtable */ |
219 gnt_widget_destroy(sub->window); /* the "destroy" callback will remove entry from the hashtable */ |
| 213 } |
220 } |
| 214 |
221 |
| 215 static void |
222 static void |
| |
223 free_key(gpointer key, gpointer n) |
| |
224 { |
| |
225 RowInfo *row = key; |
| |
226 g_free(row->message); |
| |
227 g_free(key); |
| |
228 } |
| |
229 |
| |
230 |
| |
231 static void |
| 216 update_edit_list(GntWidget *widget, EditStatus *edit) |
232 update_edit_list(GntWidget *widget, EditStatus *edit) |
| 217 { |
233 { |
| 218 edits = g_list_remove(edits, edit); |
234 edits = g_list_remove(edits, edit); |
| 219 gaim_notify_close_with_handle(edit); |
235 gaim_notify_close_with_handle(edit); |
| 220 g_hash_table_foreach(edit->hash, (GHFunc)destroy_substatus_win, NULL); |
236 g_hash_table_foreach(edit->hash, (GHFunc)destroy_substatus_win, NULL); |
| |
237 g_list_foreach((GList*)gnt_tree_get_rows(GNT_TREE(edit->tree)), free_key, NULL); |
| 221 g_free(edit); |
238 g_free(edit); |
| 222 } |
239 } |
| |
240 |
| |
241 static void |
| |
242 set_substatuses(EditStatus *edit) |
| |
243 { |
| |
244 const GList *iter; |
| |
245 for (iter = gnt_tree_get_rows(GNT_TREE(edit->tree)); iter; iter = iter->next) { |
| |
246 RowInfo *key = iter->data; |
| |
247 if (gnt_tree_get_choice(GNT_TREE(edit->tree), key)) { |
| |
248 gaim_savedstatus_set_substatus(edit->saved, key->account, key->type, key->message); |
| |
249 } |
| |
250 } |
| |
251 } |
| |
252 |
| 223 |
253 |
| 224 static void |
254 static void |
| 225 use_trans_status_cb(GntWidget *button, EditStatus *edit) |
255 use_trans_status_cb(GntWidget *button, EditStatus *edit) |
| 226 { |
256 { |
| 227 const char *message; |
257 const char *message; |
| 271 |
303 |
| 272 if (edit->saved == NULL) |
304 if (edit->saved == NULL) |
| 273 { |
305 { |
| 274 edit->saved = gaim_savedstatus_new(title, prim); |
306 edit->saved = gaim_savedstatus_new(title, prim); |
| 275 gaim_savedstatus_set_message(edit->saved, message); |
307 gaim_savedstatus_set_message(edit->saved, message); |
| |
308 set_substatuses(edit); |
| 276 if (statuses.tree) |
309 if (statuses.tree) |
| 277 gnt_tree_add_row_last(GNT_TREE(statuses.tree), edit->saved, |
310 gnt_tree_add_row_last(GNT_TREE(statuses.tree), edit->saved, |
| 278 gnt_tree_create_row(GNT_TREE(statuses.tree), title, |
311 gnt_tree_create_row(GNT_TREE(statuses.tree), title, |
| 279 gaim_primitive_get_name_from_type(prim), message), NULL); |
312 gaim_primitive_get_name_from_type(prim), message), NULL); |
| 280 } |
313 } |
| 302 add_substatus(EditStatus *edit, GaimAccount *account) |
335 add_substatus(EditStatus *edit, GaimAccount *account) |
| 303 { |
336 { |
| 304 char *name; |
337 char *name; |
| 305 const char *type = NULL, *message = NULL; |
338 const char *type = NULL, *message = NULL; |
| 306 GaimSavedStatusSub *sub = NULL; |
339 GaimSavedStatusSub *sub = NULL; |
| |
340 RowInfo *key; |
| 307 |
341 |
| 308 if (!edit || !edit->tree) |
342 if (!edit || !edit->tree) |
| 309 return; |
343 return; |
| 310 |
344 |
| 311 if (edit->saved) |
345 if (edit->saved) |
| 312 sub = gaim_savedstatus_get_substatus(edit->saved, account); |
346 sub = gaim_savedstatus_get_substatus(edit->saved, account); |
| 313 |
347 |
| |
348 key = g_new0(RowInfo, 1); |
| |
349 key->account = account; |
| |
350 |
| 314 if (sub) |
351 if (sub) |
| 315 { |
352 { |
| 316 type = gaim_status_type_get_name(gaim_savedstatus_substatus_get_type(sub)); |
353 key->type = gaim_savedstatus_substatus_get_type(sub); |
| |
354 type = gaim_status_type_get_name(key->type); |
| 317 message = gaim_savedstatus_substatus_get_message(sub); |
355 message = gaim_savedstatus_substatus_get_message(sub); |
| |
356 key->message = g_strdup(message); |
| 318 } |
357 } |
| 319 |
358 |
| 320 name = g_strdup_printf("%s (%s)", gaim_account_get_username(account), |
359 name = g_strdup_printf("%s (%s)", gaim_account_get_username(account), |
| 321 gaim_account_get_protocol_name(account)); |
360 gaim_account_get_protocol_name(account)); |
| 322 gnt_tree_add_choice(GNT_TREE(edit->tree), account, |
361 gnt_tree_add_choice(GNT_TREE(edit->tree), key, |
| 323 gnt_tree_create_row(GNT_TREE(edit->tree), name, type, message), NULL, NULL); |
362 gnt_tree_create_row(GNT_TREE(edit->tree), name, type, message), NULL, NULL); |
| 324 |
363 |
| 325 if (sub) |
364 if (sub) |
| 326 gnt_tree_set_choice(GNT_TREE(edit->tree), account, TRUE); |
365 gnt_tree_set_choice(GNT_TREE(edit->tree), key, TRUE); |
| 327 g_free(name); |
366 g_free(name); |
| 328 } |
367 } |
| 329 |
368 |
| 330 static void |
369 static void |
| 331 substatus_window_destroy_cb(GntWidget *window, EditSubStatus *sub) |
370 substatus_window_destroy_cb(GntWidget *window, EditSubStatus *sub) |
| 332 { |
371 { |
| 333 g_hash_table_remove(sub->parent->hash, sub->account); |
372 g_hash_table_remove(sub->parent->hash, sub->key->account); |
| 334 g_free(sub); |
373 g_free(sub); |
| 335 } |
374 } |
| 336 |
375 |
| 337 static void |
376 static void |
| 338 save_substatus_cb(GntWidget *widget, EditSubStatus *sub) |
377 save_substatus_cb(GntWidget *widget, EditSubStatus *sub) |
| 339 { |
378 { |
| 340 GaimSavedStatus *saved = sub->parent->saved; |
379 GaimSavedStatus *saved = sub->parent->saved; |
| 341 GaimAccount *account = sub->account; |
380 RowInfo *row = sub->key; |
| 342 const char *message; |
381 const char *message; |
| 343 GaimStatusType *type; |
382 GaimStatusType *type; |
| 344 |
383 |
| 345 type = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(sub->type)); |
384 type = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(sub->type)); |
| 346 message = gnt_entry_get_text(GNT_ENTRY(sub->message)); |
385 message = gnt_entry_get_text(GNT_ENTRY(sub->message)); |
| 347 |
386 |
| 348 gaim_savedstatus_set_substatus(saved, account, type, message); |
387 row->type = type; |
| 349 |
388 row->message = g_strdup(message); |
| 350 gnt_tree_set_choice(GNT_TREE(sub->parent->tree), account, TRUE); |
389 |
| 351 gnt_tree_change_text(GNT_TREE(sub->parent->tree), account, 1, |
390 if (saved) /* Save the substatus if the savedstatus actually exists. */ |
| |
391 gaim_savedstatus_set_substatus(saved, row->account, type, message); |
| |
392 |
| |
393 gnt_tree_set_choice(GNT_TREE(sub->parent->tree), row, TRUE); |
| |
394 gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 1, |
| 352 gaim_status_type_get_name(type)); |
395 gaim_status_type_get_name(type)); |
| 353 gnt_tree_change_text(GNT_TREE(sub->parent->tree), account, 2, message); |
396 gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 2, message); |
| 354 |
397 |
| 355 gnt_widget_destroy(sub->window); |
398 gnt_widget_destroy(sub->window); |
| 356 } |
399 } |
| 357 |
400 |
| 358 static gboolean |
401 static gboolean |
| 363 EditSubStatus *sub; |
406 EditSubStatus *sub; |
| 364 GntWidget *window, *combo, *entry, *box, *button, *l; |
407 GntWidget *window, *combo, *entry, *box, *button, *l; |
| 365 GaimSavedStatusSub *substatus = NULL; |
408 GaimSavedStatusSub *substatus = NULL; |
| 366 const GList *iter; |
409 const GList *iter; |
| 367 char *name; |
410 char *name; |
| 368 GaimAccount *account = gnt_tree_get_selection_data(tree); |
411 RowInfo *selected = gnt_tree_get_selection_data(tree); |
| 369 |
412 GaimAccount *account = selected->account; |
| 370 if (gnt_tree_get_choice(tree, account)) |
413 |
| |
414 if (gnt_tree_get_choice(tree, selected)) |
| 371 { |
415 { |
| 372 /* There was a savedstatus for this account. Now remove it. */ |
416 /* There was a savedstatus for this account. Now remove it. */ |
| |
417 g_free(selected->message); |
| |
418 selected->type = NULL; |
| |
419 selected->message = NULL; |
| |
420 /* XXX: should we really be saving it right now? */ |
| 373 gaim_savedstatus_unset_substatus(edit->saved, account); |
421 gaim_savedstatus_unset_substatus(edit->saved, account); |
| 374 gnt_tree_change_text(tree, account, 1, NULL); |
422 gnt_tree_change_text(tree, account, 1, NULL); |
| 375 gnt_tree_change_text(tree, account, 2, NULL); |
423 gnt_tree_change_text(tree, account, 2, NULL); |
| 376 return FALSE; |
424 return FALSE; |
| 377 } |
425 } |