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