about.c: cosmetix
[k8lowj.git] / src / menu.c
blob8f5d1e277c5263446be8afccb5615b79b1ee9a32
1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2004 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5 */
7 #include "gtk-all.h"
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
12 #include "conf.h"
13 #include "network.h"
14 #include "menu.h"
15 #include "jam.h"
16 #include "friends.h"
17 #include "history.h"
18 #include "util-gtk.h"
19 #include "spawn.h"
20 #include "security.h"
21 #include "icons.h"
22 #include "settings.h"
23 #include "pollcreator.h"
24 #include "tools.h"
25 #include "undo.h"
26 #include "usejournal.h"
27 #ifdef HAVE_GTKHTML
28 #include "preview.h"
29 #endif
30 #include "sync.h"
31 #include "html_markup.h"
32 #include "console.h"
34 enum {
35 ACTION_NONE=0,
36 ACTION_WEB_LINKS,
38 ACTION_UNDO,
39 ACTION_REDO,
41 ACTION_CUT,
42 ACTION_COPY,
43 ACTION_PASTE,
45 ACTION_ENTRY_SUBMIT_SEP,
46 ACTION_ENTRY_SUBMIT_NEW,
47 ACTION_ENTRY_SAVE_SERVER,
49 ACTION_VIEW,
50 /* these must match JamViewMeta in meta.h. */
51 ACTION_VIEW_FIRST,
52 ACTION_VIEW_SECURITY,
53 ACTION_VIEW_MOOD,
54 ACTION_VIEW_PICTURE,
55 ACTION_VIEW_MUSIC,
56 ACTION_VIEW_LOCATION,
57 ACTION_VIEW_TAGS,
58 ACTION_VIEW_PREFORMATTED,
59 ACTION_VIEW_DATESEL,
60 ACTION_VIEW_COMMENTS,
61 ACTION_VIEW_SCREENING,
63 ACTION_JOURNAL,
64 ACTION_JOURNAL_USE,
65 ACTION_JOURNAL_USE_SEP,
66 ACTION_CHANGE_USER,
67 ACTION_MANAGER,
69 ACTION_TOOLS_CONSOLE
72 void about_dlg(GtkWidget *mainwin);
73 static void menu_account_changed(JamWin *jw);
75 static void
76 menu_make_link(JamWin *jw) {
77 void link_dialog_run(GtkWindow *win, JamDoc *doc);
78 link_dialog_run(GTK_WINDOW(jw), jw->doc);
80 static void
81 menu_make_journal_link(JamWin *jw) {
82 void link_journal_dialog_run(GtkWindow *win, JamDoc *doc);
83 link_journal_dialog_run(GTK_WINDOW(jw), jw->doc);
85 static void
86 menu_insert_image(JamWin *jw) {
87 void image_dialog_run(GtkWindow *win, JamDoc *doc);
88 image_dialog_run(GTK_WINDOW(jw), jw->doc);
91 static void
92 new_cb(JamWin *jw) {
93 if (!jam_confirm_lose_entry(jw)) return;
94 jam_clear_entry(jw);
96 static void
97 load_last_entry(JamWin *jw) {
98 LJEntry *entry;
100 if (!jam_confirm_lose_entry(jw)) return;
102 entry = history_load_latest(GTK_WINDOW(jw), jw->account, jam_doc_get_usejournal(jw->doc));
103 if (!entry)
104 return;
106 jam_doc_load_entry(jw->doc, entry);
107 lj_entry_free(entry);
108 undomgr_reset(UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw->view))));
110 static void
111 run_history_recent_dlg(JamWin *jw) {
112 LJEntry *entry;
114 if (!jam_confirm_lose_entry(jw)) return;
116 if ((entry = history_recent_dialog_run(GTK_WINDOW(jw), jw->account, jam_doc_get_usejournal(jw->doc))) == NULL)
117 return;
119 jam_doc_load_entry(jw->doc, entry);
120 lj_entry_free(entry);
121 undomgr_reset(UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw->view))));
124 static void
125 run_offline_dlg(JamWin *jw) {
126 LJEntry *offline_dlg_run(GtkWindow *, JamAccount *);
127 LJEntry *entry;
129 if (!jam_confirm_lose_entry(jw)) return;
131 if ((entry = offline_dlg_run(GTK_WINDOW(jw), jw->account)) == NULL)
132 return;
134 jam_doc_load_entry(jw->doc, entry);
135 lj_entry_free(entry);
136 undomgr_reset(UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw->view))));
139 static void menu_save(JamWin *jw) { jam_save(jw); }
140 static void menu_save_as_file(JamWin *jw) { jam_save_as_file(jw); }
141 static void menu_save_as_draft(JamWin *jw) { jam_save_as_draft(jw); }
143 static void
144 menu_view_cb(JamWin *jw, int action, GtkCheckMenuItem *item) {
145 JamView *view = jam_win_get_cur_view(jw);
146 JamViewMeta meta = (JamViewMeta)(action - ACTION_VIEW_FIRST);
147 gboolean show;
149 show = gtk_check_menu_item_get_active(item);
150 conf.options.showmeta[meta] = show;
151 jam_view_toggle_meta(view, meta, show);
154 static void
155 meta_toggle_cb(JamView *view, JamViewMeta meta, gboolean show, JamWin *jw) {
156 GtkCheckMenuItem *item;
157 gboolean oldmeta;
159 item = GTK_CHECK_MENU_ITEM(
160 gtk_item_factory_get_item_by_action(jw->factory,
161 ACTION_VIEW_FIRST+meta));
163 /* don't let view-activated meta changes
164 * actually change the user's meta prefs. */
165 oldmeta = conf.options.showmeta[meta];
166 gtk_check_menu_item_set_active(item, show);
167 conf.options.showmeta[meta] = oldmeta;
170 #if 0
171 static void
172 security_cb(JamWin *jw, int action, GtkCheckMenuItem *item) {
173 LJSecurity sec = jam_doc_get_security(jw->doc);
175 if (!gtk_check_menu_item_get_active(item))
176 return;
178 sec.type = action - ACTION_ENTRY_SECURITY_PUBLIC;
179 if (sec.type == LJ_SECURITY_CUSTOM) {
180 sec.allowmask = custom_security_dlg_run(GTK_WINDOW(jw),
181 sec.allowmask, JAM_ACCOUNT_LJ(jw->account));
182 /* if they didn't include anyone, it's a private entry. */
183 if (sec.allowmask == 0)
184 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
185 gtk_item_factory_get_widget_by_action(jw->factory,
186 ACTION_ENTRY_SECURITY_PRIVATE)), TRUE);
189 jam_doc_set_security(jw->doc, &sec);
192 static void
193 comments_cb(JamWin *jw, int action, GtkCheckMenuItem *item) {
194 if (!gtk_check_menu_item_get_active(item))
195 return;
196 jam_doc_set_comments(jw->doc, action - ACTION_ENTRY_COMMENTS_DEFAULT);
199 static void
200 screening_cb(JamWin *jw, int action, GtkCheckMenuItem *item) {
201 if (!gtk_check_menu_item_get_active(item))
202 return;
203 jam_doc_set_screening(jw->doc, action - ACTION_ENTRY_SCREENING_DEFAULT);
206 static void
207 backdated_cb(JamWin *jw, int action, GtkCheckMenuItem *item) {
208 jam_doc_set_backdated(jw->doc, gtk_check_menu_item_get_active(item));
211 static void
212 preformatted_cb(JamWin *jw, int action, GtkCheckMenuItem *item) {
213 jam_doc_set_preformatted(jw->doc, gtk_check_menu_item_get_active(item));
215 static void
216 picture_cb(GObject *item, JamWin *jw) {
217 char *pic;
218 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)))
219 return;
220 pic = g_object_get_data(item, KEY_PICTUREKEYWORD);
221 jam_doc_set_pickeyword(jw->doc, pic);
224 #endif
226 static void
227 cutcopypaste_cb(JamWin *jw, int action) {
228 GtkWidget *target;
229 const char* signalname;
230 guint signalid;
232 switch (action) {
233 case ACTION_CUT: signalname = "cut_clipboard"; break;
234 case ACTION_COPY: signalname = "copy_clipboard"; break;
235 case ACTION_PASTE: signalname = "paste_clipboard"; break;
236 default: return;
239 /* verify that the focused widget actually responds to this signal
240 * before emitting it, because if it doesn't we get an ugly error. */
241 target = gtk_window_get_focus(GTK_WINDOW(jw));
242 signalid = g_signal_lookup(signalname, G_OBJECT_TYPE(target));
243 if (signalid)
244 g_signal_emit(target, signalid, 0); /* the last param appears to only
245 be used for property signals. */
248 static void
249 undoredo_cb(JamWin *jw, int action) {
250 UndoMgr *um = UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw->view)));
251 if (action == ACTION_UNDO) {
252 if (undomgr_can_undo(um)) {
253 undomgr_undo(um);
255 } else if (action == ACTION_REDO) {
256 if (undomgr_can_redo(um)) {
257 undomgr_redo(um);
262 static void
263 menu_insert_file(JamWin *jw) {
264 tools_insert_file(GTK_WINDOW(jw), jw->doc);
267 static void
268 menu_insert_command_output(JamWin *jw) {
269 tools_insert_command_output(GTK_WINDOW(jw), jw->doc);
272 static void
273 menu_html_escape(JamWin *jw) {
274 tools_html_escape(GTK_WINDOW(jw), jw->doc);
276 static void
277 menu_remove_linebreaks(JamWin *jw) {
278 tools_remove_linebreaks(GTK_WINDOW(jw), jw->doc);
280 static void
281 menu_ljcut(JamWin *jw) {
282 tools_ljcut(GTK_WINDOW(jw), jw->doc);
284 static void
285 menu_validate_xml(JamWin *jw) {
286 tools_validate_xml(GTK_WINDOW(jw), jw->doc);
288 static void
289 menu_sync(JamWin *jw) {
290 sync_run(JAM_ACCOUNT_LJ(jw->account), GTK_WINDOW(jw));
293 static void
294 menu_console(JamWin *jw) {
295 g_assert(JAM_ACCOUNT_IS_LJ(jw->account));
296 console_dialog_run(GTK_WINDOW(jw), JAM_ACCOUNT_LJ(jw->account));
299 void
300 menu_friends_manager(JamWin *jw) {
301 g_assert(JAM_ACCOUNT_IS_LJ(jw->account));
302 friends_manager_show(GTK_WINDOW(jw), JAM_ACCOUNT_LJ(jw->account));
305 static void
306 menu_html_mark_bold(JamWin *jw) {
307 html_mark_bold(jw->doc);
309 static void
310 menu_html_mark_italic(JamWin *jw) {
311 html_mark_italic(jw->doc);
313 static void
314 menu_html_mark_underline(JamWin *jw) {
315 html_mark_underline(jw->doc);
317 static void
318 menu_html_mark_strikeout(JamWin *jw) {
319 html_mark_strikeout(jw->doc);
321 static void
322 menu_html_mark_monospaced(JamWin *jw) {
323 html_mark_monospaced(jw->doc);
325 static void
326 menu_html_mark_para(JamWin *jw) {
327 html_mark_para(jw->doc);
329 static void
330 menu_html_mark_smallcaps(JamWin *jw) {
331 html_mark_smallcaps(jw->doc);
333 static void
334 menu_html_mark_superscript(JamWin *jw) {
335 html_mark_superscript(jw->doc);
337 static void
338 menu_html_mark_subscript(JamWin *jw) {
339 html_mark_subscript(jw->doc);
341 static void
342 menu_html_mark_blockquote(JamWin *jw) {
343 html_mark_blockquote(jw->doc);
345 static void
346 menu_html_mark_small(JamWin *jw) {
347 html_mark_small(jw->doc);
349 static void
350 menu_html_mark_big(JamWin *jw) {
351 html_mark_big(jw->doc);
353 static void
354 menu_html_mark_ulist(JamWin *jw) {
355 html_mark_ulist(jw->doc);
357 static void
358 menu_html_mark_olist(JamWin *jw) {
359 html_mark_olist(jw->doc);
361 static void
362 menu_html_mark_listitem(JamWin *jw) {
363 html_mark_listitem(jw->doc);
365 static void
366 menu_html_mark_h2(JamWin *jw) {
367 html_mark_h3(jw->doc);
369 static void
370 menu_html_mark_h3(JamWin *jw) {
371 html_mark_h3(jw->doc);
373 static void
374 menu_html_mark_h4(JamWin *jw) {
375 html_mark_h4(jw->doc);
378 void manager_dialog(GtkWidget *parent);
380 static void
381 menu_usejournal_changed(JamWin *jw) {
382 JamAccount *acc;
383 GtkWidget *menu, *musejournal, *musejournalsep;
384 LJUser *u = NULL;
386 acc = jam_doc_get_account(jw->doc);
387 if (JAM_ACCOUNT_IS_LJ(acc))
388 u = jam_account_lj_get_user(JAM_ACCOUNT_LJ(acc));
390 musejournal = gtk_item_factory_get_item_by_action(jw->factory,
391 ACTION_JOURNAL_USE);
392 musejournalsep = gtk_item_factory_get_item_by_action(jw->factory,
393 ACTION_JOURNAL_USE_SEP);
395 if (!u || !u->usejournals) {
396 gtk_widget_hide(musejournal);
397 gtk_widget_hide(musejournalsep);
398 return;
401 menu = usejournal_build_menu(u->username,
402 jam_doc_get_usejournal(jw->doc),
403 u->usejournals,
404 jam_win_get_cur_doc(jw));
405 gtk_menu_item_set_submenu(GTK_MENU_ITEM(musejournal), menu);
406 gtk_widget_show(musejournal);
407 gtk_widget_show(musejournalsep);
410 GtkWidget*
411 menu_make_bar(JamWin *jw) {
412 GtkWidget *bar;
413 GtkAccelGroup *accelgroup = NULL;
415 /* a note on accelerators:
416 * shift-ctl-[x] is used to type in UTF-8 chars;
417 * this means we can't use any shift-ctl accels
418 * using letters in the hex range [a-f]. */
419 static GtkItemFactoryEntry menu_items[] = {
420 { N_("/_LogJam"), NULL, NULL, 0, "<Branch>" },
421 { N_("/_Edit"), NULL, NULL, 0, "<Branch>" },
422 { N_("/_View"), NULL, NULL, ACTION_VIEW, "<Branch>" },
423 { N_("/_Journal"), NULL, NULL, ACTION_JOURNAL, "<Branch>" },
424 { N_("/E_ntry"), NULL, NULL, 0, "<Branch>" },
425 { N_("/_Insert"), NULL, NULL, 0, "<Branch>" },
426 { N_("/_HTML"), NULL, NULL, 0, "<Branch>" },
428 { N_("/LogJam/_About LogJam..."), NULL, about_dlg, 0, "<StockItem>", "logjam-goat" },
429 { N_("/LogJam/_Servers and Users..."), NULL, manager_dialog, ACTION_MANAGER, NULL },
430 { N_("/LogJam/_Change User..."), NULL, jam_do_changeuser, ACTION_CHANGE_USER, NULL },
431 { N_("/LogJam/_Preferences..."), NULL, settings_run, 0, "<StockItem>", GTK_STOCK_PREFERENCES },
432 { "/LogJam/---", NULL, NULL, 0, "<Separator>" },
433 { N_("/LogJam/_Quit"), "<ctl>Q", jam_quit, 0, "<StockItem>", GTK_STOCK_QUIT },
435 { N_("/Entry/_New"), NULL, new_cb, 0, "<StockItem>", GTK_STOCK_NEW },
436 { N_("/Entry/_Open"), NULL, NULL, 0, "<Branch>" },
437 { N_("/Entry/Open/File..."), NULL, jam_open_entry, 0, "<StockItem>", GTK_STOCK_OPEN },
438 { N_("/Entry/Open/Draft..."), "<ctl>D", jam_open_draft, 0, NULL },
439 { N_("/Entry/_Save"), NULL, menu_save, 0, "<StockItem>", GTK_STOCK_SAVE },
440 { N_("/Entry/Save _As"), NULL, NULL, 0, "<Branch>" },
441 { N_("/Entry/Save As/_File..."), NULL, menu_save_as_file, 0, "<StockItem>", GTK_STOCK_SAVE_AS },
442 { N_("/Entry/Save As/_Draft..."), NULL, menu_save_as_draft, 0, NULL },
444 { "/Entry/---", NULL, NULL, 0, "<Separator>" },
445 { N_("/Entry/_Validate XML"), NULL, menu_validate_xml, 0, NULL },
446 #ifdef HAVE_GTKHTML
447 { N_("/Entry/_Preview HTML..."), NULL, preview_ui_show, 0, NULL },
448 #endif
449 { "/Entry/---", NULL, NULL, ACTION_ENTRY_SUBMIT_SEP, "<Separator>" },
450 { N_("/Entry/S_ubmit as New"), NULL, jam_submit_entry, ACTION_ENTRY_SUBMIT_NEW, NULL },
451 { N_("/Entry/_Save Changes to Server"), NULL, jam_save_entry_server, ACTION_ENTRY_SAVE_SERVER, NULL },
453 { N_("/Edit/_Undo"), "<ctl>Z", undoredo_cb, ACTION_UNDO, "<StockItem>", GTK_STOCK_UNDO },
454 { N_("/Edit/_Redo"), "<ctl>R", undoredo_cb, ACTION_REDO, "<StockItem>", GTK_STOCK_REDO },
455 { "/Edit/---", NULL, NULL, 0, "<Separator>" },
456 { N_("/Edit/Cu_t"), NULL, cutcopypaste_cb, ACTION_CUT, "<StockItem>", GTK_STOCK_CUT },
457 { N_("/Edit/_Copy"), NULL, cutcopypaste_cb, ACTION_COPY, "<StockItem>", GTK_STOCK_COPY },
458 { N_("/Edit/_Paste"), NULL, cutcopypaste_cb, ACTION_PASTE, "<StockItem>", GTK_STOCK_PASTE },
459 { "/Edit/---", NULL, NULL, 0, "<Separator>" },
460 { N_("/Edit/_HTML Escape"), NULL, menu_html_escape, 0, NULL },
461 { N_("/Edit/_Remove Linebreaks"), NULL, menu_remove_linebreaks, 0, NULL },
463 { N_("/Insert/_Poll..."), NULL, run_poll_creator_dlg, 0, NULL },
464 { N_("/Insert/_File..."), NULL, menu_insert_file, 0, NULL },
465 { N_("/Insert/Command _Output..."), NULL, menu_insert_command_output, 0, NULL },
466 { "/Insert/---", NULL, NULL, 0, "<Separator>" },
467 { N_("/Insert/_Link..."), "<ctl>L", menu_make_link },
468 { N_("/Insert/_Image..."), "<ctl>I", menu_insert_image },
469 { N_("/Insert/_Journal Link..."), "<ctl><alt>L", menu_make_journal_link },
470 { N_("/Insert/lj-_cut..."), "<ctl><alt>X", menu_ljcut, 0, NULL },
472 { N_("/View/_Security"), NULL, menu_view_cb, ACTION_VIEW_SECURITY, "<CheckItem>" },
473 { N_("/View/Entry _Date"), NULL, menu_view_cb, ACTION_VIEW_DATESEL, "<CheckItem>" },
474 { N_("/View/_Mood"), NULL, menu_view_cb, ACTION_VIEW_MOOD, "<CheckItem>" },
475 { N_("/View/_Picture"), NULL, menu_view_cb, ACTION_VIEW_PICTURE, "<CheckItem>" },
476 { N_("/View/_Tags"), NULL, menu_view_cb, ACTION_VIEW_TAGS, "<CheckItem>" },
477 { N_("/View/M_usic"), NULL, menu_view_cb, ACTION_VIEW_MUSIC, "<CheckItem>" },
478 { N_("/View/_Location"), NULL, menu_view_cb, ACTION_VIEW_LOCATION, "<CheckItem>" },
479 { N_("/View/_Preformatted"), NULL, menu_view_cb, ACTION_VIEW_PREFORMATTED, "<CheckItem>" },
480 { N_("/View/_Comments"), NULL, menu_view_cb, ACTION_VIEW_COMMENTS, "<CheckItem>" },
481 { N_("/View/Scr_eening"), NULL, menu_view_cb, ACTION_VIEW_SCREENING, "<CheckItem>" },
483 { N_("/HTML/_Bold"), "<ctl><alt>B", menu_html_mark_bold },
484 { N_("/HTML/_Italic"), "<ctl><alt>I", menu_html_mark_italic },
485 { N_("/HTML/_Strikeout"), "<ctl><alt>S", menu_html_mark_strikeout },
486 { N_("/HTML/_Monospaced"), "<ctl><alt>M", menu_html_mark_monospaced },
487 { N_("/HTML/_Underline"), "<ctl><alt>U", menu_html_mark_underline },
488 { N_("/HTML/Small _Caps"), "<ctl><alt>C", menu_html_mark_smallcaps },
489 { N_("/HTML/Block_quote"), "<ctl><alt>Q", menu_html_mark_blockquote },
490 { N_("/HTML/_Paragraph"), "<ctl><shift>P", menu_html_mark_para },
491 { "/HTML/---", NULL, NULL, 0, "<Separator>" },
492 { N_("/HTML/Heading _2"), "<ctl><alt>2", menu_html_mark_h2 },
493 { N_("/HTML/Heading _3"), "<ctl><alt>3", menu_html_mark_h3 },
494 { N_("/HTML/Heading _4"), "<ctl><alt>4", menu_html_mark_h4 },
495 { N_("/HTML/Bi_gger"), "<ctl><shift>B", menu_html_mark_big },
496 { N_("/HTML/S_maller"), "<ctl><shift>S", menu_html_mark_small },
497 { N_("/HTML/Superscrip_t"), "<ctl><shift>T", menu_html_mark_superscript },
498 { N_("/HTML/S_ubscript"), "<ctl><shift>U", menu_html_mark_subscript },
499 { "/HTML/---", NULL, NULL, 0, "<Separator>" },
500 { N_("/HTML/U_nordered List"), "<ctl><shift>N", menu_html_mark_ulist },
501 { N_("/HTML/_Ordered list"), "<ctl><shift>O", menu_html_mark_olist },
502 { N_("/HTML/_List item"), "<ctl><shift>L", menu_html_mark_listitem },
504 { N_("/Journal/_Use Journal"), NULL, NULL, ACTION_JOURNAL_USE, NULL },
505 { "/Journal/---", NULL, NULL, ACTION_JOURNAL_USE_SEP, "<Separator>" },
506 { N_("/Journal/_Friends..."), "<ctl>F", menu_friends_manager, 0, NULL },
507 { "/Journal/---", NULL, NULL, 0, "<Separator>" },
508 { N_("/Journal/_Load Last Entry"), NULL, load_last_entry, 0, NULL },
509 { N_("/Journal/_Load Recent Entry..."), NULL, run_history_recent_dlg, 0, NULL },
510 { N_("/Journal/_Load Offline Entry..."), NULL, run_offline_dlg, 0, NULL },
511 { N_("/Journal/_Synchronize Offline Copy..."), NULL, menu_sync, 0, NULL },
512 { "/Journal/---", NULL, NULL, 0, "<Separator>" },
513 { N_("/Journal/_LiveJournal Console..."), NULL, menu_console, ACTION_TOOLS_CONSOLE, NULL },
514 { N_("/Journal/_Web Links"), NULL, NULL, ACTION_WEB_LINKS, "<Branch>" },
517 int itemcount = sizeof(menu_items) / sizeof(menu_items[0]);
518 JamView *view;
520 accelgroup = gtk_accel_group_new();
521 jw->factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accelgroup);
522 g_object_ref(jw->factory);
523 gtk_item_factory_set_translate_func(jw->factory, gettext_translate_func, NULL, NULL);
524 gtk_item_factory_create_items(jw->factory, itemcount, menu_items, jw);
525 gtk_window_add_accel_group(GTK_WINDOW(jw), accelgroup);
527 bar = gtk_item_factory_get_widget(jw->factory, "<main>");
529 /* Entry menu */
530 jw->msubmitsep = gtk_item_factory_get_widget_by_action(jw->factory,
531 ACTION_ENTRY_SUBMIT_SEP);
532 jw->msubmit = gtk_item_factory_get_widget_by_action(jw->factory,
533 ACTION_ENTRY_SUBMIT_NEW);
534 jw->msaveserver = gtk_item_factory_get_widget_by_action(jw->factory,
535 ACTION_ENTRY_SAVE_SERVER);
536 gtk_widget_hide(jw->msaveserver);
538 /* Edit menu */
539 jw->mundo = gtk_item_factory_get_widget_by_action(jw->factory,
540 ACTION_UNDO);
541 jw->mredo = gtk_item_factory_get_widget_by_action(jw->factory,
542 ACTION_REDO);
544 /* Journal menu */
545 jw->mweb = gtk_item_factory_get_item_by_action(jw->factory, ACTION_WEB_LINKS);
547 view = jam_win_get_cur_view(jw);
548 g_signal_connect(G_OBJECT(view), "meta_toggle",
549 G_CALLBACK(meta_toggle_cb), jw);
550 /* the view has already loaded which metas are available;
551 * we tell it to emit those signals again. */
552 jam_view_emit_conf(view);
554 menu_new_doc(jw);
556 gtk_widget_show(bar);
557 return bar;
560 void
561 menu_new_doc(JamWin *jw) {
562 JamDoc *doc = jw->doc;
563 g_signal_connect_swapped(doc, "notify::account",
564 G_CALLBACK(menu_account_changed), jw);
565 g_signal_connect_swapped(doc, "notify::usejournal",
566 G_CALLBACK(menu_usejournal_changed), jw);
567 menu_account_changed(jw);
568 menu_usejournal_changed(jw);
571 static void
572 menu_spawn_url(GtkWidget *w, GtkWindow *jw) {
573 char *url;
574 url = g_object_get_data(G_OBJECT(w), "url");
575 if (url)
576 spawn_url(jw, url);
579 static GtkWidget* webmenu_widget(JamWin *jw, GSList *webmenu);
581 static GtkWidget*
582 webmenuitem_widget(JamWin *jw, LJWebMenuItem *wmi) {
583 GtkWidget *item = NULL;
584 if (!wmi->text) { /* separator */
585 item = gtk_menu_item_new();
586 } else if (wmi->url) { /* url menu item */
587 item = gtk_image_menu_item_new_with_label(wmi->text);
588 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
589 gtk_image_new_from_stock(GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU));
591 g_object_set_data_full(G_OBJECT(item), "url", wmi->url, NULL);
592 g_signal_connect(G_OBJECT(item), "activate",
593 G_CALLBACK(menu_spawn_url), jw);
594 } else if (wmi->subitems) { /* submenu */
595 GtkWidget *submenu;
597 item = gtk_menu_item_new_with_mnemonic(wmi->text);
598 submenu = webmenu_widget(jw, wmi->subitems);
599 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
601 return item;
604 static GtkWidget*
605 webmenu_widget(JamWin *jw, GSList *webmenu) {
606 GtkWidget *menu, *item;
607 GSList *l;
609 menu = gtk_menu_new();
610 for (l = webmenu; l != NULL; l = l->next) {
611 item = webmenuitem_widget(jw, l->data);
612 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
614 return menu;
617 static void
618 menu_update_web(JamWin *jw, JamAccount *acc) {
619 LJUser *u = NULL;
621 if (JAM_ACCOUNT_IS_LJ(acc))
622 u = jam_account_lj_get_user(JAM_ACCOUNT_LJ(acc));
624 if (!u || !u->webmenu) {
625 gtk_widget_hide(jw->mweb);
626 return;
629 gtk_menu_item_set_submenu(GTK_MENU_ITEM(jw->mweb),
630 webmenu_widget(jw, u->webmenu));
631 gtk_widget_show_all(jw->mweb);
634 static void
635 menu_account_changed(JamWin *jw) {
636 JamAccount *acc = jam_doc_get_account(jw->doc);
638 if (JAM_ACCOUNT_IS_LJ(acc)) {
639 menu_update_web(jw, acc);
640 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw->factory,
641 ACTION_VIEW), TRUE);
642 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw->factory,
643 ACTION_JOURNAL), TRUE);
644 } else {
645 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw->factory,
646 ACTION_VIEW), FALSE);
647 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw->factory,
648 ACTION_JOURNAL), FALSE);