2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2003 Hiroyuki Yamamoto
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.
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.
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.
25 #include <gtk/gtkscrolledwindow.h>
26 #include <gtk/gtkpixmap.h>
29 # include <gdk-pixbuf/gdk-pixbuf.h>
32 # include <gdk_imlib.h>
34 #endif /* HAVE_GDK_PIXBUF */
41 #include "viewerprefs.h"
43 typedef struct _ImageViewer ImageViewer;
45 MimeViewerFactory image_viewer_factory;
46 static void image_viewer_get_resized_size(gint w, gint h, gint aw, gint ah,
47 gint * sw, gint * sh);
48 static void image_viewer_clear_viewer(MimeViewer *imageviewer);
52 MimeViewer mimeviewer;
57 GtkWidget *scrolledwin;
62 GtkWidget *content_type;
65 static GtkWidget *image_viewer_get_widget(MimeViewer *_mimeviewer)
67 ImageViewer *imageviewer = (ImageViewer *) _mimeviewer;
69 debug_print("image_viewer_get_widget\n");
71 return imageviewer->notebook;
75 static void image_viewer_load_file(ImageViewer *imageviewer, const gchar *imgfile)
78 GdkPixbuf *pixbuf_scaled;
87 debug_print("image_viewer_show_mimepart\n");
89 pixbuf = gdk_pixbuf_new_from_file(imgfile, &error);
91 g_warning(error->message);
95 g_warning("Can't load the image.");
99 if (imageviewerprefs.resize_img) {
100 avail_width = imageviewer->notebook->parent->allocation.width;
101 avail_height = imageviewer->notebook->parent->allocation.height;
102 if (avail_width > 8) avail_width -= 8;
103 if (avail_height > 8) avail_height -= 8;
105 image_viewer_get_resized_size(gdk_pixbuf_get_width(pixbuf),
106 gdk_pixbuf_get_height(pixbuf),
107 avail_width, avail_height,
108 &new_width, &new_height);
110 pixbuf_scaled = gdk_pixbuf_scale_simple
111 (pixbuf, new_width, new_height, GDK_INTERP_BILINEAR);
112 gdk_pixbuf_unref(pixbuf);
113 pixbuf = pixbuf_scaled;
116 gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &mask, 0);
118 if (!imageviewer->image) {
119 imageviewer->image = gtk_pixmap_new(pixmap, mask);
121 gtk_scrolled_window_add_with_viewport
122 (GTK_SCROLLED_WINDOW(imageviewer->scrolledwin),
125 gtk_pixmap_set(GTK_PIXMAP(imageviewer->image), pixmap, mask);
127 gtk_widget_show(imageviewer->image);
129 gdk_pixbuf_unref(pixbuf);
133 static void image_viewer_load_file(ImageViewer *imageviewer, const gchar *imgfile)
141 debug_print("image_viewer_show_mimepart\n");
143 im = gdk_imlib_load_image(imgfile);
145 g_warning("Can't load the image.");
149 if (imageviewerprefs.resize_img) {
150 avail_width = imageviewer->notebook->parent->allocation.width;
151 avail_height = imageviewer->notebook->parent->allocation.height;
152 if (avail_width > 8) avail_width -= 8;
153 if (avail_height > 8) avail_height -= 8;
155 image_viewer_get_resized_size(im->rgb_width, im->rgb_height,
156 avail_width, avail_height,
157 &new_width, &new_height);
159 new_width = im->rgb_width;
160 new_height = im->rgb_height;
163 gdk_imlib_render(im, new_width, new_height);
165 if (!imageviewer->image) {
166 imageviewer->image = gtk_pixmap_new(gdk_imlib_move_image(im),
167 gdk_imlib_move_mask(im));
169 gtk_scrolled_window_add_with_viewport
170 (GTK_SCROLLED_WINDOW(imageviewer->scrolledwin),
173 gtk_pixmap_set(GTK_PIXMAP(imageviewer->image),
174 gdk_imlib_move_image(im),
175 gdk_imlib_move_mask(im));
177 gtk_widget_show(imageviewer->image);
179 gdk_imlib_destroy_image(im);
181 #endif /* HAVE_GDK_IMLIB */
182 #endif /* HAVE_GDK_PIXBUF */
184 static void image_viewer_set_notebook_page(MimeViewer *_mimeviewer)
186 ImageViewer *imageviewer = (ImageViewer *) _mimeviewer;
188 if (!imageviewerprefs.display_img)
189 gtk_notebook_set_page(GTK_NOTEBOOK(imageviewer->notebook), 0);
191 gtk_notebook_set_page(GTK_NOTEBOOK(imageviewer->notebook), 1);
194 static void image_viewer_load_image(ImageViewer *imageviewer)
198 imgfile = procmime_get_tmp_file_name(imageviewer->mimeinfo);
199 if (procmime_get_part(imgfile, imageviewer->file, imageviewer->mimeinfo) < 0) {
200 g_warning("Can't get mimepart file");
204 image_viewer_load_file(imageviewer, imgfile);
209 static void image_viewer_show_mimepart(MimeViewer *_mimeviewer, const gchar *file, MimeInfo *mimeinfo)
211 ImageViewer *imageviewer = (ImageViewer *) _mimeviewer;
213 image_viewer_clear_viewer(_mimeviewer);
214 g_free(imageviewer->file);
215 imageviewer->file = g_strdup(file);
216 imageviewer->mimeinfo = mimeinfo;
218 if (imageviewerprefs.display_img)
219 image_viewer_load_image(imageviewer);
221 gtk_label_set_text(GTK_LABEL(imageviewer->filename), mimeinfo->filename);
222 gtk_label_set_text(GTK_LABEL(imageviewer->filesize), to_human_readable(mimeinfo->size));
223 gtk_label_set_text(GTK_LABEL(imageviewer->content_type), mimeinfo->content_type);
227 static void image_viewer_clear_viewer(MimeViewer *_mimeviewer)
229 ImageViewer *imageviewer = (ImageViewer *) _mimeviewer;
230 GtkAdjustment *hadj, *vadj;
232 debug_print("image_viewer_clear_viewer\n");
234 image_viewer_set_notebook_page(_mimeviewer);
236 if (imageviewer->image != NULL)
237 gtk_pixmap_set(GTK_PIXMAP(imageviewer->image), NULL, NULL);
238 hadj = gtk_scrolled_window_get_hadjustment
239 (GTK_SCROLLED_WINDOW(imageviewer->scrolledwin));
240 gtk_adjustment_set_value(hadj, 0.0);
241 vadj = gtk_scrolled_window_get_vadjustment
242 (GTK_SCROLLED_WINDOW(imageviewer->scrolledwin));
243 gtk_adjustment_set_value(vadj, 0.0);
245 g_free(imageviewer->file);
246 imageviewer->file = NULL;
247 imageviewer->mimeinfo = NULL;
250 static void image_viewer_destroy_viewer(MimeViewer *_mimeviewer)
252 ImageViewer *imageviewer = (ImageViewer *) _mimeviewer;
254 debug_print("image_viewer_destroy_viewer\n");
256 image_viewer_clear_viewer(_mimeviewer);
257 gtk_widget_unref(imageviewer->notebook);
261 static void image_viewer_get_resized_size(gint w, gint h, gint aw, gint ah,
269 wratio = (gfloat)aw / (gfloat)w;
271 hratio = (gfloat)ah / (gfloat)h;
273 ratio = (wratio > hratio) ? hratio : wratio;
275 *sw = (gint)(w * ratio);
276 *sh = (gint)(h * ratio);
279 if (*sw <= 0 || *sh <= 0) {
285 static void load_cb(GtkButton *button, ImageViewer *imageviewer)
287 gtk_notebook_set_page(GTK_NOTEBOOK(imageviewer->notebook), 1);
288 image_viewer_load_image(imageviewer);
291 MimeViewer *image_viewer_create(void)
293 ImageViewer *imageviewer;
295 * glade generated code (do not touch)
303 GtkWidget *load_button;
305 GtkWidget *content_type;
306 GtkWidget *scrolledwin;
308 notebook = gtk_notebook_new();
309 gtk_widget_show(notebook);
310 GTK_WIDGET_UNSET_FLAGS(notebook, GTK_CAN_FOCUS);
311 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
312 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
314 table1 = gtk_table_new(4, 3, FALSE);
315 gtk_widget_show(table1);
316 gtk_container_add(GTK_CONTAINER(notebook), table1);
317 gtk_container_set_border_width(GTK_CONTAINER(table1), 8);
318 gtk_table_set_row_spacings(GTK_TABLE(table1), 4);
319 gtk_table_set_col_spacings(GTK_TABLE(table1), 4);
321 label3 = gtk_label_new(_("Filename:"));
322 gtk_widget_show(label3);
323 gtk_table_attach(GTK_TABLE(table1), label3, 0, 1, 0, 1,
324 (GtkAttachOptions) (GTK_FILL),
325 (GtkAttachOptions) (0), 0, 0);
326 gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
328 label4 = gtk_label_new(_("Filesize:"));
329 gtk_widget_show(label4);
330 gtk_table_attach(GTK_TABLE(table1), label4, 0, 1, 1, 2,
331 (GtkAttachOptions) (GTK_FILL),
332 (GtkAttachOptions) (0), 0, 0);
333 gtk_misc_set_alignment(GTK_MISC(label4), 0, 0.5);
335 filename = gtk_label_new("");
336 gtk_widget_show(filename);
337 gtk_table_attach(GTK_TABLE(table1), filename, 1, 3, 0, 1,
338 (GtkAttachOptions) (GTK_FILL),
339 (GtkAttachOptions) (0), 0, 0);
340 gtk_misc_set_alignment(GTK_MISC(filename), 0, 0.5);
342 filesize = gtk_label_new("");
343 gtk_widget_show(filesize);
344 gtk_table_attach(GTK_TABLE(table1), filesize, 1, 3, 1, 2,
345 (GtkAttachOptions) (GTK_FILL),
346 (GtkAttachOptions) (0), 0, 0);
347 gtk_misc_set_alignment(GTK_MISC(filesize), 0, 0.5);
349 load_button = gtk_button_new_with_label(_("Load Image"));
350 gtk_widget_show(load_button);
351 gtk_table_attach(GTK_TABLE(table1), load_button, 1, 2, 3, 4,
352 (GtkAttachOptions) (GTK_FILL),
353 (GtkAttachOptions) (0), 0, 0);
355 label5 = gtk_label_new(_("Content-Type:"));
356 gtk_widget_show(label5);
357 gtk_table_attach(GTK_TABLE(table1), label5, 0, 1, 2, 3,
358 (GtkAttachOptions) (GTK_FILL),
359 (GtkAttachOptions) (0), 0, 0);
360 gtk_misc_set_alignment(GTK_MISC(label5), 0, 0.5);
362 content_type = gtk_label_new("");
363 gtk_widget_show(content_type);
364 gtk_table_attach(GTK_TABLE(table1), content_type, 1, 3, 2, 3,
365 (GtkAttachOptions) (GTK_FILL),
366 (GtkAttachOptions) (0), 0, 0);
367 gtk_misc_set_alignment(GTK_MISC(content_type), 0, 0.5);
369 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
370 gtk_widget_show(scrolledwin);
371 gtk_container_add(GTK_CONTAINER(notebook), scrolledwin);
372 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
373 GTK_POLICY_AUTOMATIC,
374 GTK_POLICY_AUTOMATIC);
379 debug_print("Creating image view...\n");
380 imageviewer = g_new0(ImageViewer, 1);
381 imageviewer->mimeviewer.factory = &image_viewer_factory;
383 imageviewer->mimeviewer.get_widget = image_viewer_get_widget;
384 imageviewer->mimeviewer.show_mimepart = image_viewer_show_mimepart;
385 imageviewer->mimeviewer.clear_viewer = image_viewer_clear_viewer;
386 imageviewer->mimeviewer.destroy_viewer = image_viewer_destroy_viewer;
388 imageviewer->scrolledwin = scrolledwin;
389 imageviewer->image = NULL;
390 imageviewer->notebook = notebook;
391 imageviewer->filename = filename;
392 imageviewer->filesize = filesize;
393 imageviewer->content_type = content_type;
395 gtk_widget_ref(notebook);
397 gtk_signal_connect(GTK_OBJECT(load_button), "released",
398 GTK_SIGNAL_FUNC(load_cb), imageviewer);
400 image_viewer_set_notebook_page((MimeViewer *)imageviewer);
402 return (MimeViewer *) imageviewer;
405 static gchar *content_types[] =
408 MimeViewerFactory image_viewer_factory =
416 void image_viewer_init(void)
420 gtk_widget_push_visual(gdk_imlib_get_visual());
421 gtk_widget_push_colormap(gdk_imlib_get_colormap());
424 mimeview_register_viewer_factory(&image_viewer_factory);
427 void image_viewer_done(void)
429 mimeview_unregister_viewer_factory(&image_viewer_factory);