1 /*
2  *  caja-image-converter.c
3  *
4  *  Copyright (C) 2004-2005 Jürg Billeter
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Library General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public
17  *  License along with this library; if not, write to the Free
18  *  Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  *  Author: Jürg Billeter <j@bitron.ch>
21  *
22  */
23 
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27 
28 #include <glib/gi18n-lib.h>
29 
30 #include "caja-image-converter.h"
31 #include "caja-image-resizer.h"
32 #include "caja-image-rotator.h"
33 
34 #include <libcaja-extension/caja-menu-provider.h>
35 
36 #include <gtk/gtk.h>
37 
38 #include <string.h> /* for strcmp */
39 
40 static void caja_image_converter_instance_init (CajaImageConverter      *img);
41 static void caja_image_converter_class_init    (CajaImageConverterClass *class);
42 GList *     caja_image_converter_get_file_items (CajaMenuProvider *provider,
43 						     GtkWidget            *window,
44 						     GList                *files);
45 
46 static GType image_converter_type = 0;
47 
48 static gboolean
image_converter_file_is_image(CajaFileInfo * file_info)49 image_converter_file_is_image (CajaFileInfo *file_info)
50 {
51 	gchar            *uri_scheme;
52 	gchar            *mime_type;
53 	gboolean	maybe_image;
54 
55 	maybe_image = TRUE;
56 	uri_scheme = caja_file_info_get_uri_scheme (file_info);
57 	if (strcmp (uri_scheme, "file") != 0)
58 		maybe_image = FALSE;
59 	g_free (uri_scheme);
60 
61 	mime_type = caja_file_info_get_mime_type (file_info);
62 	if (strncmp (mime_type, "image/", 6) != 0)
63 		maybe_image = FALSE;
64 	g_free (mime_type);
65 
66 	return maybe_image;
67 }
68 
69 static GList *
image_converter_filter_images(GList * files)70 image_converter_filter_images (GList *files)
71 {
72 	GList *images;
73 	GList *file;
74 
75 	images = NULL;
76 
77 	for (file = files; file != NULL; file = file->next) {
78 		if (image_converter_file_is_image (file->data))
79 			images = g_list_prepend (images, file->data);
80 	}
81 
82 	return images;
83 }
84 
85 static void
image_resize_callback(CajaMenuItem * item,GList * files)86 image_resize_callback (CajaMenuItem *item,
87 			GList *files)
88 {
89 	CajaImageResizer *resizer = caja_image_resizer_new (image_converter_filter_images (files));
90 	caja_image_resizer_show_dialog (resizer);
91 }
92 
93 static void
image_rotate_callback(CajaMenuItem * item,GList * files)94 image_rotate_callback (CajaMenuItem *item,
95 			GList *files)
96 {
97 	CajaImageRotator *rotator = caja_image_rotator_new (image_converter_filter_images (files));
98 	caja_image_rotator_show_dialog (rotator);
99 }
100 
101 static GList *
caja_image_converter_get_background_items(CajaMenuProvider * provider,GtkWidget * window,CajaFileInfo * file_info)102 caja_image_converter_get_background_items (CajaMenuProvider *provider,
103 					     GtkWidget		  *window,
104 					     CajaFileInfo	  *file_info)
105 {
106 	return NULL;
107 }
108 
109 GList *
caja_image_converter_get_file_items(CajaMenuProvider * provider,GtkWidget * window,GList * files)110 caja_image_converter_get_file_items (CajaMenuProvider *provider,
111 				       GtkWidget            *window,
112 				       GList                *files)
113 {
114 	CajaMenuItem *item;
115 	GList *file;
116 	GList *items = NULL;
117 
118 	for (file = files; file != NULL; file = file->next) {
119 		if (image_converter_file_is_image (file->data)) {
120 			item = caja_menu_item_new ("CajaImageConverter::resize",
121 				        _("_Resize Images..."),
122 				        _("Resize each selected image"),
123 				       NULL);
124 			g_signal_connect (item, "activate",
125 					  G_CALLBACK (image_resize_callback),
126 					  caja_file_info_list_copy (files));
127 
128 			items = g_list_prepend (items, item);
129 
130 			item = caja_menu_item_new ("CajaImageConverter::rotate",
131 				        _("Ro_tate Images..."),
132 				        _("Rotate each selected image"),
133 				       NULL);
134 			g_signal_connect (item, "activate",
135 					  G_CALLBACK (image_rotate_callback),
136 					  caja_file_info_list_copy (files));
137 
138 			items = g_list_prepend (items, item);
139 
140 			items = g_list_reverse (items);
141 
142 			return items;
143 		}
144 	}
145 
146 	return NULL;
147 }
148 
149 static void
caja_image_converter_menu_provider_iface_init(CajaMenuProviderIface * iface)150 caja_image_converter_menu_provider_iface_init (CajaMenuProviderIface *iface)
151 {
152 	iface->get_background_items = caja_image_converter_get_background_items;
153 	iface->get_file_items = caja_image_converter_get_file_items;
154 }
155 
156 static void
caja_image_converter_instance_init(CajaImageConverter * img)157 caja_image_converter_instance_init (CajaImageConverter *img)
158 {
159 }
160 
161 static void
caja_image_converter_class_init(CajaImageConverterClass * class)162 caja_image_converter_class_init (CajaImageConverterClass *class)
163 {
164 }
165 
166 GType
caja_image_converter_get_type(void)167 caja_image_converter_get_type (void)
168 {
169 	return image_converter_type;
170 }
171 
172 void
caja_image_converter_register_type(GTypeModule * module)173 caja_image_converter_register_type (GTypeModule *module)
174 {
175 	static const GTypeInfo info = {
176 		sizeof (CajaImageConverterClass),
177 		(GBaseInitFunc) NULL,
178 		(GBaseFinalizeFunc) NULL,
179 		(GClassInitFunc) caja_image_converter_class_init,
180 		NULL,
181 		NULL,
182 		sizeof (CajaImageConverter),
183 		0,
184 		(GInstanceInitFunc) caja_image_converter_instance_init,
185 	};
186 
187 	static const GInterfaceInfo menu_provider_iface_info = {
188 		(GInterfaceInitFunc) caja_image_converter_menu_provider_iface_init,
189 		NULL,
190 		NULL
191 	};
192 
193 	image_converter_type = g_type_module_register_type (module,
194 						     G_TYPE_OBJECT,
195 						     "CajaImageConverter",
196 						     &info, 0);
197 
198 	g_type_module_add_interface (module,
199 				     image_converter_type,
200 				     CAJA_TYPE_MENU_PROVIDER,
201 				     &menu_provider_iface_info);
202 }
203