Mercurial > pidgin
comparison src/gtkdialogs.c @ 9709:4d05b6e9e9cd
[gaim-migrate @ 10570]
This patch is freaking massive.
Renamed ui.h to gtkdialogs.h
Renamed dialogs.c to gtkdialogs.c
sed'ed the hell out of the .po files
These files are similar to gtkutil.c/.h. They are meant to contain
dialogs such as the "New Instant Message" window, which does not
belong in gtkblist.c or gtkconv.c, and is called from both places.
Eventually the functions in gtkdialogs.c/.h should be changed to
conform to Gaim's naming convention.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 08 Aug 2004 00:48:19 +0000 |
parents | |
children | 2273790bb518 |
comparison
equal
deleted
inserted
replaced
9708:d49a19e8320c | 9709:4d05b6e9e9cd |
---|---|
1 /* | |
2 * gaim | |
3 * | |
4 * Gaim is the legal property of its developers, whose names are too numerous | |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 */ | |
22 #include "gtkinternal.h" | |
23 | |
24 #include "debug.h" | |
25 #include "notify.h" | |
26 #include "prefs.h" | |
27 #include "prpl.h" | |
28 #include "request.h" | |
29 #include "status.h" | |
30 #include "util.h" | |
31 | |
32 #include "gtkdialogs.h" | |
33 #include "gtkimhtml.h" | |
34 #include "gtkimhtmltoolbar.h" | |
35 #include "gtklog.h" | |
36 #include "gtkutils.h" | |
37 #include "stock.h" | |
38 | |
39 /* XXX */ | |
40 #include "gaim.h" | |
41 | |
42 static GList *dialogwindows = NULL; | |
43 | |
44 struct confirm_del { | |
45 GtkWidget *window; | |
46 GtkWidget *label; | |
47 GtkWidget *ok; | |
48 GtkWidget *cancel; | |
49 char name[1024]; | |
50 GaimConnection *gc; | |
51 }; | |
52 | |
53 struct create_away { | |
54 GtkWidget *window; | |
55 GtkWidget *toolbar; | |
56 GtkWidget *entry; | |
57 GtkWidget *text; | |
58 struct away_message *mess; | |
59 }; | |
60 | |
61 struct warning { | |
62 GtkWidget *window; | |
63 GtkWidget *anon; | |
64 char *who; | |
65 GaimConnection *gc; | |
66 }; | |
67 | |
68 struct getuserinfo { | |
69 GtkWidget *window; | |
70 GtkWidget *entry; | |
71 GtkWidget *account; | |
72 GaimConnection *gc; | |
73 }; | |
74 | |
75 struct view_log { | |
76 long offset; | |
77 int options; | |
78 char *name; | |
79 GtkWidget *bbox; | |
80 GtkWidget *window; | |
81 GtkWidget *layout; | |
82 void *clear_handle; | |
83 }; | |
84 | |
85 /* Wrapper to get all the text from a GtkTextView */ | |
86 gchar* gtk_text_view_get_text(GtkTextView *text, gboolean include_hidden_chars) | |
87 { | |
88 GtkTextBuffer *buffer; | |
89 GtkTextIter start, end; | |
90 | |
91 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); | |
92 gtk_text_buffer_get_start_iter(buffer, &start); | |
93 gtk_text_buffer_get_end_iter(buffer, &end); | |
94 | |
95 return gtk_text_buffer_get_text(buffer, &start, &end, include_hidden_chars); | |
96 } | |
97 | |
98 /*------------------------------------------------------------------------*/ | |
99 /* Destroys */ | |
100 /*------------------------------------------------------------------------*/ | |
101 | |
102 static void destroy_dialog(GtkWidget *w, GtkWidget *w2) | |
103 { | |
104 GtkWidget *dest; | |
105 | |
106 if (!GTK_IS_WIDGET(w2)) | |
107 dest = w; | |
108 else | |
109 dest = w2; | |
110 | |
111 dialogwindows = g_list_remove(dialogwindows, dest); | |
112 gtk_widget_destroy(dest); | |
113 } | |
114 | |
115 void destroy_all_dialogs() | |
116 { | |
117 while (dialogwindows) | |
118 destroy_dialog(NULL, dialogwindows->data); | |
119 | |
120 if (awaymessage) | |
121 do_im_back(NULL, NULL); | |
122 } | |
123 | |
124 static void do_warn(GtkWidget *widget, gint resp, struct warning *w) | |
125 { | |
126 if (resp == GTK_RESPONSE_OK) | |
127 serv_warn(w->gc, w->who, (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->anon))) ? 1 : 0); | |
128 | |
129 destroy_dialog(NULL, w->window); | |
130 g_free(w->who); | |
131 g_free(w); | |
132 } | |
133 | |
134 void show_warn_dialog(GaimConnection *gc, const char *who) | |
135 { | |
136 char *labeltext; | |
137 GtkWidget *hbox, *vbox; | |
138 GtkWidget *label; | |
139 GtkWidget *img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); | |
140 GaimConversation *c = gaim_find_conversation_with_account(who, gc->account); | |
141 | |
142 struct warning *w = g_new0(struct warning, 1); | |
143 w->who = g_strdup(who); | |
144 w->gc = gc; | |
145 | |
146 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
147 | |
148 w->window = gtk_dialog_new_with_buttons(_("Warn User"), | |
149 GTK_WINDOW(GAIM_GTK_WINDOW(c->window)->window), 0, | |
150 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
151 GAIM_STOCK_WARN, GTK_RESPONSE_OK, NULL); | |
152 gtk_dialog_set_default_response (GTK_DIALOG(w->window), GTK_RESPONSE_OK); | |
153 g_signal_connect(G_OBJECT(w->window), "response", G_CALLBACK(do_warn), w); | |
154 | |
155 gtk_container_set_border_width (GTK_CONTAINER(w->window), 6); | |
156 gtk_window_set_resizable(GTK_WINDOW(w->window), FALSE); | |
157 gtk_dialog_set_has_separator(GTK_DIALOG(w->window), FALSE); | |
158 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(w->window)->vbox), 12); | |
159 gtk_container_set_border_width (GTK_CONTAINER(GTK_DIALOG(w->window)->vbox), 6); | |
160 | |
161 hbox = gtk_hbox_new(FALSE, 12); | |
162 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(w->window)->vbox), hbox); | |
163 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
164 | |
165 vbox = gtk_vbox_new(FALSE, 0); | |
166 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
167 labeltext = g_strdup_printf(_("<span weight=\"bold\" size=\"larger\">Warn %s?</span>\n\n" | |
168 "This will increase %s's warning level and he or she will be subject to harsher rate limiting.\n"), who, who); | |
169 label = gtk_label_new(NULL); | |
170 gtk_label_set_markup(GTK_LABEL(label), labeltext); | |
171 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
172 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
173 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
174 g_free(labeltext); | |
175 | |
176 w->anon = gtk_check_button_new_with_mnemonic(_("Warn _anonymously?")); | |
177 gtk_box_pack_start(GTK_BOX(vbox), w->anon, FALSE, FALSE, 0); | |
178 | |
179 hbox = gtk_hbox_new(FALSE, 6); | |
180 gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
181 img = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_MENU); | |
182 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
183 labeltext = _("<b>Anonymous warnings are less severe.</b>"); | |
184 label = gtk_label_new(NULL); | |
185 gtk_label_set_markup(GTK_LABEL(label), labeltext); | |
186 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
187 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
188 | |
189 dialogwindows = g_list_prepend(dialogwindows, w->window); | |
190 gtk_widget_show_all(w->window); | |
191 } | |
192 | |
193 static void | |
194 do_remove_chat(GaimChat *chat) | |
195 { | |
196 gaim_blist_remove_chat(chat); | |
197 } | |
198 | |
199 static void | |
200 do_remove_buddy(GaimBuddy *buddy) | |
201 { | |
202 GaimGroup *group; | |
203 GaimConversation *conv; | |
204 gchar *name; | |
205 GaimAccount *account; | |
206 | |
207 if (!buddy) | |
208 return; | |
209 | |
210 group = gaim_find_buddys_group(buddy); | |
211 name = g_strdup(buddy->name); /* b->name is a crasher after remove_buddy */ | |
212 account = buddy->account; | |
213 | |
214 gaim_debug(GAIM_DEBUG_INFO, "blist", | |
215 "Removing '%s' from buddy list.\n", buddy->name); | |
216 /* XXX - Should remove from blist first... then call serv_remove_buddy()? */ | |
217 serv_remove_buddy(buddy->account->gc, buddy, group); | |
218 gaim_blist_remove_buddy(buddy); | |
219 | |
220 conv = gaim_find_conversation_with_account(name, account); | |
221 | |
222 if (conv != NULL) | |
223 gaim_conversation_update(conv, GAIM_CONV_UPDATE_REMOVE); | |
224 | |
225 g_free(name); | |
226 } | |
227 | |
228 static void do_remove_contact(GaimContact *contact) | |
229 { | |
230 GaimBlistNode *bnode, *cnode; | |
231 GaimGroup *group; | |
232 | |
233 if (!contact) | |
234 return; | |
235 | |
236 cnode = (GaimBlistNode *)contact; | |
237 group = (GaimGroup*)cnode->parent; | |
238 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
239 GaimBuddy *buddy = (GaimBuddy*)bnode; | |
240 if (gaim_account_is_connected(buddy->account)) | |
241 serv_remove_buddy(buddy->account->gc, buddy, group); | |
242 } | |
243 gaim_blist_remove_contact(contact); | |
244 } | |
245 | |
246 void do_remove_group(GaimGroup *group) | |
247 { | |
248 GaimBlistNode *cnode, *bnode; | |
249 | |
250 cnode = ((GaimBlistNode*)group)->child; | |
251 | |
252 while (cnode) { | |
253 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
254 bnode = cnode->child; | |
255 cnode = cnode->next; | |
256 while (bnode) { | |
257 GaimBuddy *buddy; | |
258 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
259 GaimConversation *conv; | |
260 buddy = (GaimBuddy*)bnode; | |
261 bnode = bnode->next; | |
262 conv = gaim_find_conversation_with_account(buddy->name, buddy->account); | |
263 if (gaim_account_is_connected(buddy->account)) { | |
264 serv_remove_buddy(buddy->account->gc, buddy, group); | |
265 gaim_blist_remove_buddy(buddy); | |
266 if (conv) | |
267 gaim_conversation_update(conv, | |
268 GAIM_CONV_UPDATE_REMOVE); | |
269 } | |
270 } else { | |
271 bnode = bnode->next; | |
272 } | |
273 } | |
274 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
275 GaimChat *chat = (GaimChat *)cnode; | |
276 cnode = cnode->next; | |
277 if (gaim_account_is_connected(chat->account)) | |
278 gaim_blist_remove_chat(chat); | |
279 } else { | |
280 cnode = cnode->next; | |
281 } | |
282 } | |
283 | |
284 gaim_blist_remove_group(group); | |
285 } | |
286 | |
287 void show_confirm_del(GaimBuddy *buddy) | |
288 { | |
289 char *text; | |
290 | |
291 if (!buddy) | |
292 return; | |
293 | |
294 text = g_strdup_printf(_("You are about to remove %s from your buddy list. Do you want to continue?"), buddy->name); | |
295 | |
296 gaim_request_action(NULL, NULL, _("Remove Buddy"), text, -1, buddy, 2, | |
297 _("Remove Buddy"), G_CALLBACK(do_remove_buddy), | |
298 _("Cancel"), NULL); | |
299 | |
300 g_free(text); | |
301 } | |
302 | |
303 void show_confirm_del_blist_chat(GaimChat *chat) | |
304 { | |
305 char *name = gaim_chat_get_display_name(chat); | |
306 char *text = g_strdup_printf(_("You are about to remove the chat %s from your buddy list. Do you want to continue?"), name); | |
307 | |
308 gaim_request_action(NULL, NULL, _("Remove Chat"), text, -1, chat, 2, | |
309 _("Remove Chat"), G_CALLBACK(do_remove_chat), | |
310 _("Cancel"), NULL); | |
311 | |
312 g_free(name); | |
313 g_free(text); | |
314 } | |
315 | |
316 void show_confirm_del_group(GaimGroup *group) | |
317 { | |
318 char *text = g_strdup_printf(_("You are about to remove the group %s and all its members from your buddy list. Do you want to continue?"), | |
319 group->name); | |
320 | |
321 gaim_request_action(NULL, NULL, _("Remove Group"), text, -1, group, 2, | |
322 _("Remove Group"), G_CALLBACK(do_remove_group), | |
323 _("Cancel"), NULL); | |
324 | |
325 g_free(text); | |
326 } | |
327 | |
328 void show_confirm_del_contact(GaimContact *contact) | |
329 { | |
330 GaimBuddy *buddy = gaim_contact_get_priority_buddy(contact); | |
331 | |
332 if (!buddy) | |
333 return; | |
334 | |
335 if (((GaimBlistNode*)contact)->child == (GaimBlistNode*)buddy && | |
336 !((GaimBlistNode*)buddy)->next) { | |
337 show_confirm_del(buddy); | |
338 } else { | |
339 char *text = g_strdup_printf(_("You are about to remove the contact containing %s and %d other buddies from your buddy list. Do you want to continue?"), | |
340 buddy->name, contact->totalsize - 1); | |
341 | |
342 gaim_request_action(NULL, NULL, _("Remove Contact"), text, -1, contact, 2, | |
343 _("Remove Contact"), G_CALLBACK(do_remove_contact), | |
344 _("Cancel"), NULL); | |
345 | |
346 g_free(text); | |
347 } | |
348 } | |
349 | |
350 static gboolean show_ee_dialog(const char *ee) | |
351 { | |
352 GtkWidget *window; | |
353 GtkWidget *hbox; | |
354 GtkWidget *label; | |
355 GtkWidget *img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_COOL, GTK_ICON_SIZE_DIALOG); | |
356 gchar *norm = gaim_strreplace(ee, "rocksmyworld", ""); | |
357 | |
358 label = gtk_label_new(NULL); | |
359 if (!strcmp(norm, "zilding")) | |
360 gtk_label_set_markup(GTK_LABEL(label), | |
361 "<span weight=\"bold\" size=\"large\" foreground=\"purple\">Amazing! Simply Amazing!</span>"); | |
362 else if (!strcmp(norm, "robflynn")) | |
363 gtk_label_set_markup(GTK_LABEL(label), | |
364 "<span weight=\"bold\" size=\"large\" foreground=\"#1f6bad\">Pimpin\' Penguin Style! *Waddle Waddle*</span>"); | |
365 else if (!strcmp(norm, "flynorange")) | |
366 gtk_label_set_markup(GTK_LABEL(label), | |
367 "<span weight=\"bold\" size=\"large\" foreground=\"blue\">You should be me. I'm so cute!</span>"); | |
368 else if (!strcmp(norm, "ewarmenhoven")) | |
369 gtk_label_set_markup(GTK_LABEL(label), | |
370 "<span weight=\"bold\" size=\"large\" foreground=\"orange\">Now that's what I like!</span>"); | |
371 else if (!strcmp(norm, "markster97")) | |
372 gtk_label_set_markup(GTK_LABEL(label), | |
373 "<span weight=\"bold\" size=\"large\" foreground=\"brown\">Ahh, and excellent choice!</span>"); | |
374 else if (!strcmp(norm, "seanegn")) | |
375 gtk_label_set_markup(GTK_LABEL(label), | |
376 "<span weight=\"bold\" size=\"large\" foreground=\"#009900\">Everytime you click my name, an angel gets its wings.</span>"); | |
377 else if (!strcmp(norm, "chipx86")) | |
378 gtk_label_set_markup(GTK_LABEL(label), | |
379 "<span weight=\"bold\" size=\"large\" foreground=\"red\">This sunflower seed taste like pizza.</span>"); | |
380 else if (!strcmp(norm, "markdoliner")) | |
381 gtk_label_set_markup(GTK_LABEL(label), | |
382 "<span weight=\"bold\" size=\"large\" foreground=\"#6364B1\">Hey! I was in that tumbleweed!</span>"); | |
383 else if (!strcmp(norm, "lschiere")) | |
384 gtk_label_set_markup(GTK_LABEL(label), | |
385 "<span weight=\"bold\" size=\"large\" foreground=\"gray\">I'm not anything.</span>"); | |
386 g_free(norm); | |
387 | |
388 if (strlen(gtk_label_get_label(GTK_LABEL(label))) <= 0) | |
389 return FALSE; | |
390 | |
391 window = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, NULL, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL); | |
392 gtk_dialog_set_default_response (GTK_DIALOG(window), GTK_RESPONSE_OK); | |
393 g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(gtk_widget_destroy), NULL); | |
394 | |
395 gtk_container_set_border_width (GTK_CONTAINER(window), 6); | |
396 gtk_window_set_resizable(GTK_WINDOW(window), FALSE); | |
397 gtk_dialog_set_has_separator(GTK_DIALOG(window), FALSE); | |
398 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(window)->vbox), 12); | |
399 gtk_container_set_border_width (GTK_CONTAINER(GTK_DIALOG(window)->vbox), 6); | |
400 | |
401 hbox = gtk_hbox_new(FALSE, 12); | |
402 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), hbox); | |
403 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
404 | |
405 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
406 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
407 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
408 | |
409 gtk_widget_show_all(window); | |
410 return TRUE; | |
411 } | |
412 | |
413 void | |
414 gaim_gtkdialogs_new_im(GaimAccount *account, const char *username) | |
415 { | |
416 GaimConversation *conv; | |
417 GaimConvWindow *win; | |
418 | |
419 conv = gaim_find_conversation_with_account(username, account); | |
420 | |
421 if (conv == NULL) | |
422 conv = gaim_conversation_new(GAIM_CONV_IM, account, username); | |
423 | |
424 win = gaim_conversation_get_window(conv); | |
425 | |
426 gaim_conv_window_raise(win); | |
427 gaim_conv_window_switch_conversation(win, gaim_conversation_get_index(conv)); | |
428 } | |
429 | |
430 static void | |
431 new_im_cb(gpointer data, GaimRequestFields *fields) | |
432 { | |
433 GaimAccount *account; | |
434 const char *username; | |
435 | |
436 account = gaim_request_fields_get_account(fields, "account"); | |
437 username = gaim_request_fields_get_string(fields, "screenname"); | |
438 | |
439 gaim_gtkdialogs_new_im(account, username); | |
440 } | |
441 | |
442 void | |
443 show_im_dialog(void) | |
444 { | |
445 GaimRequestFields *fields; | |
446 GaimRequestFieldGroup *group; | |
447 GaimRequestField *field; | |
448 | |
449 fields = gaim_request_fields_new(); | |
450 | |
451 group = gaim_request_field_group_new(NULL); | |
452 gaim_request_fields_add_group(fields, group); | |
453 | |
454 field = gaim_request_field_string_new("screenname", _("_Screen name"), | |
455 NULL, FALSE); | |
456 gaim_request_field_set_required(field, TRUE); | |
457 gaim_request_field_set_type_hint(field, "screenname"); | |
458 gaim_request_field_group_add_field(group, field); | |
459 | |
460 field = gaim_request_field_account_new("account", _("_Account"), NULL); | |
461 gaim_request_field_set_visible(field, | |
462 (gaim_connections_get_all() != NULL && | |
463 gaim_connections_get_all()->next != NULL)); | |
464 gaim_request_field_set_required(field, TRUE); | |
465 gaim_request_field_group_add_field(group, field); | |
466 | |
467 gaim_request_fields(gaim_get_blist(), _("New Instant Message"), | |
468 NULL, | |
469 _("Please enter the screen name of the person you " | |
470 "would like to IM."), | |
471 fields, | |
472 _("OK"), G_CALLBACK(new_im_cb), | |
473 _("Cancel"), NULL, | |
474 NULL); | |
475 } | |
476 | |
477 static void | |
478 get_info_cb(gpointer data, GaimRequestFields *fields) | |
479 { | |
480 char *username; | |
481 gboolean found = FALSE; | |
482 GaimAccount *account; | |
483 | |
484 account = gaim_request_fields_get_account(fields, "account"); | |
485 | |
486 username = g_strdup(gaim_normalize(account, | |
487 gaim_request_fields_get_string(fields, "screenname"))); | |
488 | |
489 if (username != NULL && gaim_str_has_suffix(username, "rocksmyworld")) | |
490 found = show_ee_dialog(username); | |
491 | |
492 if (!found && username != NULL && *username != '\0' && account != NULL) | |
493 serv_get_info(gaim_account_get_connection(account), username); | |
494 | |
495 g_free(username); | |
496 } | |
497 | |
498 void | |
499 show_info_dialog(void) | |
500 { | |
501 GaimRequestFields *fields; | |
502 GaimRequestFieldGroup *group; | |
503 GaimRequestField *field; | |
504 | |
505 fields = gaim_request_fields_new(); | |
506 | |
507 group = gaim_request_field_group_new(NULL); | |
508 gaim_request_fields_add_group(fields, group); | |
509 | |
510 field = gaim_request_field_string_new("screenname", _("_Screen name"), | |
511 NULL, FALSE); | |
512 gaim_request_field_set_type_hint(field, "screenname"); | |
513 gaim_request_field_set_required(field, TRUE); | |
514 gaim_request_field_group_add_field(group, field); | |
515 | |
516 field = gaim_request_field_account_new("account", _("_Account"), NULL); | |
517 gaim_request_field_set_visible(field, | |
518 (gaim_connections_get_all() != NULL && | |
519 gaim_connections_get_all()->next != NULL)); | |
520 gaim_request_field_set_required(field, TRUE); | |
521 gaim_request_field_group_add_field(group, field); | |
522 | |
523 gaim_request_fields(gaim_get_blist(), _("Get User Info"), | |
524 NULL, | |
525 _("Please enter the screen name of the person whose " | |
526 "info you would like to view."), | |
527 fields, | |
528 _("OK"), G_CALLBACK(get_info_cb), | |
529 _("Cancel"), NULL, | |
530 NULL); | |
531 } | |
532 | |
533 static void | |
534 get_log_cb(gpointer data, GaimRequestFields *fields) | |
535 { | |
536 char *username; | |
537 GaimAccount *account; | |
538 | |
539 account = gaim_request_fields_get_account(fields, "account"); | |
540 | |
541 username = g_strdup(gaim_normalize(account, | |
542 gaim_request_fields_get_string(fields, "screenname"))); | |
543 | |
544 if( username != NULL && *username != '\0' && account != NULL ) | |
545 gaim_gtk_log_show( username, account ); | |
546 | |
547 g_free(username); | |
548 } | |
549 | |
550 void | |
551 show_log_dialog(void) | |
552 { | |
553 GaimRequestFields *fields; | |
554 GaimRequestFieldGroup *group; | |
555 GaimRequestField *field; | |
556 | |
557 fields = gaim_request_fields_new(); | |
558 | |
559 group = gaim_request_field_group_new(NULL); | |
560 gaim_request_fields_add_group(fields, group); | |
561 | |
562 field = gaim_request_field_string_new("screenname", _("_Screen name"), | |
563 NULL, FALSE); | |
564 gaim_request_field_set_type_hint(field, "screenname"); | |
565 gaim_request_field_set_required(field, TRUE); | |
566 gaim_request_field_group_add_field(group, field); | |
567 | |
568 field = gaim_request_field_account_new("account", _("_Account"), NULL); | |
569 gaim_request_field_account_set_show_all(field, TRUE); | |
570 gaim_request_field_set_visible(field, | |
571 (gaim_accounts_get_all() != NULL && | |
572 gaim_accounts_get_all()->next != NULL)); | |
573 gaim_request_field_set_required(field, TRUE); | |
574 gaim_request_field_group_add_field(group, field); | |
575 | |
576 gaim_request_fields(gaim_get_blist(), _("Get User Log"), | |
577 NULL, | |
578 _("Please enter the screen name of the person whose " | |
579 "log you would like to view."), | |
580 fields, | |
581 _("OK"), G_CALLBACK(get_log_cb), | |
582 _("Cancel"), NULL, | |
583 NULL); | |
584 } | |
585 | |
586 /*------------------------------------------------------------------------*/ | |
587 /* The dialog for new away messages */ | |
588 /*------------------------------------------------------------------------*/ | |
589 | |
590 static void away_mess_destroy(GtkWidget *widget, struct create_away *ca) | |
591 { | |
592 destroy_dialog(NULL, ca->window); | |
593 g_free(ca); | |
594 } | |
595 | |
596 static void away_mess_destroy_ca(GtkWidget *widget, GdkEvent *event, struct create_away *ca) | |
597 { | |
598 away_mess_destroy(NULL, ca); | |
599 } | |
600 | |
601 static gint sort_awaymsg_list(gconstpointer a, gconstpointer b) | |
602 { | |
603 struct away_message *msg_a; | |
604 struct away_message *msg_b; | |
605 | |
606 msg_a = (struct away_message *)a; | |
607 msg_b = (struct away_message *)b; | |
608 | |
609 return (strcmp(msg_a->name, msg_b->name)); | |
610 } | |
611 | |
612 static struct away_message *save_away_message(struct create_away *ca) | |
613 { | |
614 struct away_message *am; | |
615 gchar *away_message; | |
616 | |
617 if (!ca->mess) | |
618 am = g_new0(struct away_message, 1); | |
619 else { | |
620 am = ca->mess; | |
621 } | |
622 | |
623 g_snprintf(am->name, sizeof(am->name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry))); | |
624 away_message = gtk_imhtml_get_markup(GTK_IMHTML(ca->text)); | |
625 | |
626 g_snprintf(am->message, sizeof(am->message), "%s", away_message); | |
627 g_free(away_message); | |
628 | |
629 if (!ca->mess) | |
630 away_messages = g_slist_insert_sorted(away_messages, am, sort_awaymsg_list); | |
631 | |
632 do_away_menu(NULL); | |
633 gaim_status_sync(); | |
634 | |
635 return am; | |
636 } | |
637 | |
638 int check_away_mess(struct create_away *ca, int type) | |
639 { | |
640 gchar *msg; | |
641 if ((strlen(gtk_entry_get_text(GTK_ENTRY(ca->entry))) == 0) && (type == 1)) { | |
642 /* We shouldn't allow a blank title */ | |
643 gaim_notify_error(NULL, NULL, | |
644 _("You cannot save an away message with a " | |
645 "blank title"), | |
646 _("Please give the message a title, or choose " | |
647 "\"Use\" to use without saving.")); | |
648 return 0; | |
649 } | |
650 | |
651 msg = gtk_imhtml_get_text(GTK_IMHTML(ca->text), NULL, NULL); | |
652 | |
653 if ((type <= 1) && ((msg == NULL) || (*msg == '\0'))) { | |
654 /* We shouldn't allow a blank message */ | |
655 gaim_notify_error(NULL, NULL, | |
656 _("You cannot create an empty away message"), NULL); | |
657 return 0; | |
658 } | |
659 | |
660 g_free(msg); | |
661 | |
662 return 1; | |
663 } | |
664 | |
665 void save_away_mess(GtkWidget *widget, struct create_away *ca) | |
666 { | |
667 if (!check_away_mess(ca, 1)) | |
668 return; | |
669 | |
670 save_away_message(ca); | |
671 | |
672 away_mess_destroy(NULL, ca); | |
673 } | |
674 | |
675 void use_away_mess(GtkWidget *widget, struct create_away *ca) | |
676 { | |
677 static struct away_message am; | |
678 gchar *away_message; | |
679 | |
680 if (!check_away_mess(ca, 0)) | |
681 return; | |
682 | |
683 g_snprintf(am.name, sizeof(am.name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry))); | |
684 away_message = gtk_imhtml_get_markup(GTK_IMHTML(ca->text)); | |
685 | |
686 g_snprintf(am.message, sizeof(am.message), "%s", away_message); | |
687 g_free(away_message); | |
688 | |
689 do_away_message(NULL, &am); | |
690 | |
691 away_mess_destroy(NULL, ca); | |
692 } | |
693 | |
694 void su_away_mess(GtkWidget *widget, struct create_away *ca) | |
695 { | |
696 if (!check_away_mess(ca, 1)) | |
697 return; | |
698 | |
699 do_away_message(NULL, save_away_message(ca)); | |
700 | |
701 away_mess_destroy(NULL, ca); | |
702 } | |
703 | |
704 void create_away_mess(GtkWidget *widget, void *dummy) | |
705 { | |
706 GtkWidget *vbox, *hbox; | |
707 GtkWidget *label; | |
708 GtkWidget *sw; | |
709 GtkWidget *button; | |
710 GList *focus_chain = NULL; | |
711 struct create_away *ca = g_new0(struct create_away, 1); | |
712 | |
713 /* Set up window */ | |
714 GAIM_DIALOG(ca->window); | |
715 gtk_widget_set_size_request(ca->window, -1, 250); | |
716 gtk_window_set_role(GTK_WINDOW(ca->window), "away_mess"); | |
717 gtk_window_set_title(GTK_WINDOW(ca->window), _("New away message")); | |
718 g_signal_connect(G_OBJECT(ca->window), "delete_event", | |
719 G_CALLBACK(away_mess_destroy_ca), ca); | |
720 | |
721 hbox = gtk_hbox_new(FALSE, 12); | |
722 gtk_container_set_border_width(GTK_CONTAINER(hbox), 12); | |
723 gtk_container_add(GTK_CONTAINER(ca->window), hbox); | |
724 | |
725 vbox = gtk_vbox_new(FALSE, 12); | |
726 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
727 | |
728 /* Away message title */ | |
729 hbox = gtk_hbox_new(FALSE, 0); | |
730 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
731 | |
732 label = gtk_label_new(_("Away title: ")); | |
733 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
734 | |
735 ca->entry = gtk_entry_new(); | |
736 gtk_box_pack_start(GTK_BOX(hbox), ca->entry, TRUE, TRUE, 0); | |
737 gaim_set_accessible_label (ca->entry, label); | |
738 focus_chain = g_list_append(focus_chain, hbox); | |
739 | |
740 /* Toolbar */ | |
741 ca->toolbar = gtk_imhtmltoolbar_new(); | |
742 gtk_box_pack_start(GTK_BOX(vbox), ca->toolbar, FALSE, FALSE, 0); | |
743 | |
744 /* Away message text */ | |
745 sw = gtk_scrolled_window_new(NULL, NULL); | |
746 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
747 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
748 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
749 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
750 | |
751 ca->text = gtk_imhtml_new(NULL, NULL); | |
752 gtk_imhtml_set_editable(GTK_IMHTML(ca->text), TRUE); | |
753 gtk_imhtml_set_format_functions(GTK_IMHTML(ca->text), GTK_IMHTML_ALL ^ GTK_IMHTML_IMAGE); | |
754 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(ca->text), GTK_WRAP_WORD_CHAR); | |
755 | |
756 gtk_imhtml_smiley_shortcuts(GTK_IMHTML(ca->text), | |
757 gaim_prefs_get_bool("/gaim/gtk/conversations/smiley_shortcuts")); | |
758 gtk_imhtml_html_shortcuts(GTK_IMHTML(ca->text), | |
759 gaim_prefs_get_bool("/gaim/gtk/conversations/html_shortcuts")); | |
760 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) | |
761 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(ca->text)); | |
762 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(ca->toolbar), ca->text); | |
763 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(ca->toolbar), "default"); | |
764 gaim_setup_imhtml(ca->text); | |
765 | |
766 gtk_container_add(GTK_CONTAINER(sw), ca->text); | |
767 focus_chain = g_list_append(focus_chain, sw); | |
768 | |
769 if (dummy) { | |
770 struct away_message *amt; | |
771 GtkTreeIter iter; | |
772 GtkListStore *ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dummy))); | |
773 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(dummy)); | |
774 GValue val = { 0, }; | |
775 | |
776 if (! gtk_tree_selection_get_selected (sel, (GtkTreeModel**)&ls, &iter)) | |
777 return; | |
778 gtk_tree_model_get_value (GTK_TREE_MODEL(ls), &iter, 1, &val); | |
779 amt = g_value_get_pointer (&val); | |
780 gtk_entry_set_text(GTK_ENTRY(ca->entry), amt->name); | |
781 gtk_imhtml_append_text_with_images(GTK_IMHTML(ca->text), amt->message, 0, NULL); | |
782 ca->mess = amt; | |
783 } | |
784 | |
785 hbox = gtk_hbox_new(FALSE, 5); | |
786 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
787 | |
788 button = gaim_pixbuf_button_from_stock(_("_Save"), GTK_STOCK_SAVE, GAIM_BUTTON_HORIZONTAL); | |
789 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(save_away_mess), ca); | |
790 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
791 | |
792 button = gaim_pixbuf_button_from_stock(_("Sa_ve & Use"), GTK_STOCK_OK, GAIM_BUTTON_HORIZONTAL); | |
793 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(su_away_mess), ca); | |
794 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
795 | |
796 button = gaim_pixbuf_button_from_stock(_("_Use"), GTK_STOCK_EXECUTE, GAIM_BUTTON_HORIZONTAL); | |
797 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(use_away_mess), ca); | |
798 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
799 | |
800 button = gaim_pixbuf_button_from_stock(_("_Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); | |
801 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(away_mess_destroy), ca); | |
802 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
803 focus_chain = g_list_prepend(focus_chain, hbox); | |
804 | |
805 gtk_widget_show_all(ca->window); | |
806 gtk_container_set_focus_chain(GTK_CONTAINER(vbox), focus_chain); | |
807 } | |
808 | |
809 static void | |
810 alias_chat_cb(GaimChat *chat, const char *new_alias) | |
811 { | |
812 gaim_blist_alias_chat(chat, new_alias); | |
813 } | |
814 | |
815 void | |
816 alias_dialog_blist_chat(GaimChat *chat) | |
817 { | |
818 gaim_request_input(NULL, _("Alias Chat"), NULL, | |
819 _("Enter an alias for this chat."), | |
820 chat->alias, FALSE, FALSE, NULL, | |
821 _("Alias"), G_CALLBACK(alias_chat_cb), | |
822 _("Cancel"), NULL, chat); | |
823 } | |
824 | |
825 static void | |
826 alias_contact_cb(GaimContact *contact, const char *new_alias) | |
827 { | |
828 gaim_contact_set_alias(contact, new_alias); | |
829 } | |
830 | |
831 void | |
832 alias_dialog_contact(GaimContact *contact) | |
833 { | |
834 gaim_request_input(NULL, _("Alias Contact"), NULL, | |
835 _("Enter an alias for this contact."), | |
836 contact->alias, FALSE, FALSE, NULL, | |
837 _("Alias"), G_CALLBACK(alias_contact_cb), | |
838 _("Cancel"), NULL, contact); | |
839 } | |
840 | |
841 static void | |
842 alias_buddy_cb(GaimBuddy *buddy, const char *alias) | |
843 { | |
844 gaim_blist_alias_buddy(buddy, (alias != NULL && *alias != '\0') ? alias : NULL); | |
845 serv_alias_buddy(buddy); | |
846 } | |
847 | |
848 void | |
849 alias_dialog_bud(GaimBuddy *b) | |
850 { | |
851 char *secondary = g_strdup_printf(_("Enter an alias for %s."), b->name); | |
852 | |
853 gaim_request_input(NULL, _("Alias Buddy"), NULL, | |
854 secondary, b->alias, FALSE, FALSE, NULL, | |
855 _("Alias"), G_CALLBACK(alias_buddy_cb), | |
856 _("Cancel"), NULL, b); | |
857 | |
858 g_free(secondary); | |
859 } |