1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2004 Evan Martin <evan@livejournal.com>
14 GtkWidget
*url
, *get
, *width
, *height
;
18 static void url_changed_cb (ImageDlg
*idlg
) {
19 const char *text
= gtk_entry_get_text(GTK_ENTRY(idlg
->url
));
20 gtk_widget_set_sensitive(idlg
->get
, text
&& text
[0]);
21 gtk_dialog_set_response_sensitive(GTK_DIALOG(idlg
->dlg
), GTK_RESPONSE_OK
, text
&& text
[0]);
25 static void size_cb (ImageDlg
*idlg
, gint width
, gint height
) {
26 char *text
= g_strdup_printf("%d", width
);
27 gtk_entry_set_text(GTK_ENTRY(idlg
->width
), text
);
29 text
= g_strdup_printf("%d", height
);
30 gtk_entry_set_text(GTK_ENTRY(idlg
->height
), text
);
35 static void get_url_cb (ImageDlg
*idlg
) {
36 GdkPixbufLoader
*loader
;
40 /* XXX suboptimal: we retrieve the entire image when we only need a few bytes. */
41 url
= gtk_entry_get_text(GTK_ENTRY(idlg
->url
));
42 img
= net_get_run(_("Retrieving Image..."), GTK_WINDOW(idlg
->dlg
), url
);
44 loader
= gdk_pixbuf_loader_new();
45 g_signal_connect_swapped(G_OBJECT(loader
), "size-prepared", G_CALLBACK(size_cb
), idlg
);
46 if (!gdk_pixbuf_loader_write(loader
, (unsigned char *)img
->str
, img
->len
, &err
)) {
47 jam_warning(GTK_WINDOW(idlg
->dlg
), _("Error loading image: %s."), err
->message
);
50 gdk_pixbuf_loader_close(loader
, NULL
);
51 g_object_unref(G_OBJECT(loader
));
55 static void make_dialog (ImageDlg
*idlg
, GtkWindow
*win
) {
56 GtkWidget
*vbox
, *hbox
, *dimbox
;
59 idlg
->dlg
= gtk_dialog_new_with_buttons(_("Insert Image"),
60 win
, GTK_DIALOG_MODAL
, GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
, GTK_STOCK_OK
, GTK_RESPONSE_OK
, NULL
);
61 gtk_dialog_set_default_response(GTK_DIALOG(idlg
->dlg
), GTK_RESPONSE_OK
);
62 g_signal_connect_swapped(G_OBJECT(idlg
->dlg
), "show", G_CALLBACK(url_changed_cb
), idlg
);
64 sg
= gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL
);
66 vbox
= gtk_vbox_new(FALSE
, 12);
68 idlg
->url
= gtk_entry_new();
69 g_signal_connect_swapped(G_OBJECT(idlg
->url
), "changed", G_CALLBACK(url_changed_cb
), idlg
);
70 gtk_box_pack_start(GTK_BOX(vbox
), labelled_box_new_sg(_("_URL:"), idlg
->url
, sg
), FALSE
, FALSE
, 0);
72 hbox
= gtk_hbox_new(FALSE
, 6);
74 dimbox
= gtk_vbox_new(FALSE
, 6);
75 idlg
->width
= gtk_entry_new();
76 gtk_entry_set_width_chars(GTK_ENTRY(idlg
->width
), 6);
77 gtk_box_pack_start(GTK_BOX(dimbox
), labelled_box_new_sg(_("_Width:"), idlg
->width
, sg
), FALSE
, FALSE
, 0);
79 idlg
->height
= gtk_entry_new();
80 gtk_entry_set_width_chars(GTK_ENTRY(idlg
->height
), 6);
81 gtk_box_pack_start(GTK_BOX(dimbox
), labelled_box_new_sg(_("_Height:"), idlg
->height
, sg
), FALSE
, FALSE
, 0);
83 gtk_box_pack_start(GTK_BOX(hbox
), dimbox
, FALSE
, FALSE
, 0);
85 dimbox
= gtk_vbox_new(FALSE
, 6);
86 idlg
->get
= gtk_button_new_with_mnemonic(_("_Retrieve Dimensions from Network"));
87 g_signal_connect_swapped(G_OBJECT(idlg
->get
), "clicked", G_CALLBACK(get_url_cb
), idlg
);
88 gtk_box_pack_start(GTK_BOX(dimbox
), idlg
->get
, TRUE
, FALSE
, 0);
90 gtk_box_pack_end(GTK_BOX(hbox
), dimbox
, FALSE
, FALSE
, 0);
92 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
94 jam_dialog_set_contents(GTK_DIALOG(idlg
->dlg
), vbox
);
98 static gboolean
is_image_link (const char *str
) {
99 if (!str
) return FALSE
;
100 return (g_str_has_prefix(str
, "http://") || g_str_has_prefix(str
, "https://") || g_str_has_prefix(str
, "ftp://"));
104 void image_dialog_run (GtkWindow
*win
, JamDoc
*doc
) {
105 STACK(ImageDlg
, idlg
);
106 GtkTextBuffer
*buffer
;
107 GtkTextIter start
, end
;
108 char *sel
= NULL
, *url
= NULL
;
110 int width
= -1, height
= -1;
112 make_dialog(idlg
, win
);
114 buffer
= jam_doc_get_text_buffer(doc
);
115 if (gtk_text_buffer_get_selection_bounds(buffer
, &start
, &end
)) {
116 sel
= gtk_text_buffer_get_text(buffer
, &start
, &end
, FALSE
);
117 if (is_image_link(sel
)) gtk_entry_set_text(GTK_ENTRY(idlg
->url
), sel
);
120 clip
= jam_clipboard_wait_for_text_timeout(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD
), 50/*ms*/);
121 if (is_image_link(clip
)) gtk_entry_set_text(GTK_ENTRY(idlg
->url
), clip
);
125 if (gtk_dialog_run(GTK_DIALOG(idlg
->dlg
)) == GTK_RESPONSE_OK
) {
126 if (sel
) gtk_text_buffer_delete(buffer
, &start
, &end
);
127 else gtk_text_buffer_get_iter_at_mark(buffer
, &start
, gtk_text_buffer_get_insert(buffer
));
129 url
= g_strdup(gtk_entry_get_text(GTK_ENTRY(idlg
->url
)));
131 gtk_text_buffer_insert(buffer
, &start
, "<img src='", -1);
132 gtk_text_buffer_insert(buffer
, &start
, url
, -1);
133 gtk_text_buffer_insert(buffer
, &start
, "'", -1);
136 data
= gtk_entry_get_text(GTK_ENTRY(idlg
->width
));
139 data
= gtk_entry_get_text(GTK_ENTRY(idlg
->height
));
143 char *data
= g_strdup_printf(" width='%d'", width
);
144 gtk_text_buffer_insert(buffer
, &start
, data
, -1);
148 char *data
= g_strdup_printf(" height='%d'", height
);
149 gtk_text_buffer_insert(buffer
, &start
, data
, -1);
152 gtk_text_buffer_insert(buffer
, &start
, " />", -1);
157 gtk_widget_destroy(idlg
->dlg
);