1 /* Hey EMACS -*- linux-c -*- */
2 /* $Id$ */
3
4 /* TiLP - Tilp Is a Linking Program
5 * Copyright (C) 1999-2007 Romain Lievin
6 *
7 * This program is free software you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #ifdef HAVE_CONFIG_H
23 # include <config.h>
24 #endif /* */
25
26 #include <stdio.h>
27 #include <string.h>
28 #include <gtk/gtk.h>
29 #ifdef __WIN32__
30 #include <direct.h> // _getdrive
31 #include <windows.h>
32 #endif
33
34 #include "support.h"
35 #include "clist.h"
36 #include "clist_rbm.h"
37 #include "labels.h"
38 #include "dboxes.h"
39 #include "tilp.h"
40 #include "tilp_core.h"
41 #include "fileprop.h"
42 #include "toolbar.h"
43
44 /* Create/update menu */
45
46 #ifdef __WIN32__
rbm_change_drive_activate(GtkMenuItem * menuitem,gpointer user_data)47 static void rbm_change_drive_activate(GtkMenuItem* menuitem, gpointer user_data)
48 {
49 tilp_drive_change((char) GPOINTER_TO_INT(user_data));
50 clist_refresh();
51 labels_refresh();
52 }
53
set_drives(GtkWidget * widget,gpointer user_data)54 static void set_drives(GtkWidget* widget, gpointer user_data)
55 {
56 GtkWidget *menu = GTK_WIDGET(user_data);
57 GtkWidget *change_drive;
58 GtkWidget *change_drive_menu;
59 GtkWidget *c_drive;
60 int drive;
61 gchar buffer[8];
62 DWORD dwDrives;
63 // A..Z -> 26 letters
64 gint available_drives[27];
65
66 change_drive = gtk_menu_item_new_with_label(_("Change drive"));
67 g_object_set_data_full(G_OBJECT(menu), "change_drive",
68 g_object_ref(change_drive),
69 (GDestroyNotify)g_object_unref);
70 gtk_widget_show(change_drive);
71
72 gtk_container_add(GTK_CONTAINER(menu), change_drive);
73 change_drive_menu = gtk_menu_new();
74 g_object_set_data_full(G_OBJECT(menu), "change_drive_menu",
75 g_object_ref(change_drive_menu),
76 (GDestroyNotify)g_object_unref);
77 gtk_menu_item_set_submenu(GTK_MENU_ITEM(change_drive), change_drive_menu);
78
79 dwDrives = GetLogicalDrives ();
80 for (drive = 0; drive < 26; drive++)
81 available_drives[drive] = 0;
82
83 for (drive = 0; drive < 26; drive++)
84 {
85 if (dwDrives & (1 << drive))
86 {
87 g_snprintf(buffer, 8, "%c:", drive + 'A');
88 available_drives[drive] = drive + 'A';
89
90 c_drive = gtk_menu_item_new_with_label(buffer);
91 g_object_set_data_full(G_OBJECT(menu), "c_drive",
92 g_object_ref(c_drive),
93 (GDestroyNotify)g_object_unref);
94 gtk_widget_show(c_drive);
95
96 gtk_container_add(GTK_CONTAINER(change_drive_menu),
97 c_drive);
98 g_signal_connect((gpointer)c_drive, "activate",
99 G_CALLBACK(rbm_change_drive_activate),
100 GINT_TO_POINTER(available_drives[drive]));
101 }
102 }
103 }
104 #endif /* __WIN32__ */
105
106 /* Callbacks */
107
rbm_cut1_activate(GtkMenuItem * menuitem,gpointer user_data)108 TILP_EXPORT void rbm_cut1_activate(GtkMenuItem* menuitem, gpointer user_data)
109 {
110 local.copy_cut = CUT_FILE;
111 }
112
rbm_copy1_activate(GtkMenuItem * menuitem,gpointer user_data)113 TILP_EXPORT void rbm_copy1_activate(GtkMenuItem* menuitem, gpointer user_data)
114 {
115 local.copy_cut = COPY_FILE;
116 }
117
rbm_paste1_activate(GtkMenuItem * menuitem,gpointer user_data)118 TILP_EXPORT void rbm_paste1_activate(GtkMenuItem* menuitem, gpointer user_data)
119 {
120 GList *ptr;
121 gchar *src;
122 gchar *dst;
123
124 /* If no selection, quits */
125 if (local.file_selection == NULL)
126 return;
127
128 /* Move every file */
129 ptr = local.file_selection;
130 while (ptr != NULL)
131 {
132 src = (gchar *) (ptr->data);
133 dst = g_strconcat(local.cwdir, G_DIR_SEPARATOR_S, g_path_get_basename(src), NULL);
134 if (local.copy_cut == COPY_FILE)
135 {
136 tilp_file_copy(src, dst);
137 g_free(dst);
138 }
139 else
140 {
141 tilp_file_move_with_check(src, dst);
142 g_free(dst);
143 }
144 ptr = ptr->next;
145 }
146
147 /* No action */
148 local.copy_cut = 0;
149
150 /* Destroy the file selection and refresh */
151 tilp_file_selection_destroy();
152 clist_refresh();
153 labels_refresh();
154 }
155
156 /*TILP_EXPORT void rbm_move_to_parent_dir1_activate(GtkMenuItem* menuitem, gpointer user_data)
157 {
158 tilp_file_chdir("..");
159
160 g_free(local.cwdir);
161 local.cwdir = g_get_current_dir();
162
163 clist_refresh();
164 labels_refresh();
165 }*/
166
167 /*TILP_EXPORT void rbm_select_all1_activate(GtkMenuItem* menuitem, gpointer user_data)
168 {
169 GtkTreeView *view = GTK_TREE_VIEW(clist_wnd);
170 GtkTreeSelection *sel;
171
172 sel = gtk_tree_view_get_selection(view);
173 gtk_tree_selection_select_all(sel);
174 }*/
175
176 /*TILP_EXPORT void rbm_unselect_all1_activate(GtkMenuItem* menuitem, gpointer user_data)
177 {
178 GtkTreeView *view = GTK_TREE_VIEW(clist_wnd);
179 GtkTreeSelection *sel;
180
181 sel = gtk_tree_view_get_selection(view);
182 gtk_tree_selection_unselect_all(sel);
183 }*/
184
185 #ifdef __WIN32__
get_gfm_path(void)186 static const char* get_gfm_path(void)
187 {
188 HKEY hKey;
189 static char szKeyBuf[1024];
190 long lResult;
191 DWORD dwType, cbData;
192 gchar *str = NULL;
193
194 // Create and open key and subkey.
195 lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\gfm.exe",
196 0, KEY_READ, &hKey);
197 if(lResult != ERROR_SUCCESS)
198 return NULL;
199
200 // Get value of key
201 cbData = sizeof(szKeyBuf);
202 lResult = RegQueryValueEx(hKey, NULL, 0, &dwType, szKeyBuf, &cbData);
203 if(lResult != ERROR_SUCCESS)
204 return NULL;
205
206 // Close key
207 RegCloseKey(hKey);
208
209 return szKeyBuf;
210 }
211 #endif
212
rbm_opengfm_activate(GtkMenuItem * menuitem,gpointer user_data)213 TILP_EXPORT void rbm_opengfm_activate(GtkMenuItem* menuitem, gpointer user_data)
214 {
215 #ifdef __WIN32__
216 const char *app_path = get_gfm_path();
217 #else
218 const char *app_path1 = "/usr/bin/gfm";
219 const char *app_path2 = "/usr/local/bin/gfm";
220 const char *app_path = app_path1;
221 #endif
222 GList *sel;
223
224 if (local.file_selection == NULL)
225 return;
226
227 #ifdef __LINUX__
228 if(tilp_file_exist(app_path1))
229 app_path = app_path1;
230 else if(tilp_file_exist(app_path2))
231 app_path = app_path2;
232 #endif
233 if(!tilp_file_exist(app_path))
234 {
235 msg_box1(_("Error"), _("The Group File Manager doesn't seem to be installed on your system.\nDownload it from <http://lpg.ticalc.org/prj_gfm/> or take a look at the TiLP user manual for more information."));
236 return;
237 }
238
239 for(sel = local.file_selection; sel; sel = sel->next)
240 {
241 gchar **argv = g_malloc0(3 * sizeof(gchar *));
242 gint result;
243 GError *error;
244 char *filename = (char *)sel->data;
245
246 argv[0] = g_strdup(app_path);
247 argv[1] = g_strdup(filename);
248 argv[2] = NULL;
249
250 result = g_spawn_async(NULL/*local.cwdir*/, argv, NULL, 0, NULL, NULL, NULL, &error);
251 g_strfreev(argv);
252
253 if(result == FALSE)
254 {
255 msg_box1(_("Error"), error->message);
256 }
257 }
258 }
259
rbm_rename1_activate(GtkMenuItem * menuitem,gpointer user_data)260 TILP_EXPORT void rbm_rename1_activate(GtkMenuItem* menuitem, gpointer user_data)
261 {
262 tilp_file_selection_rename();
263 clist_refresh();
264 labels_refresh();
265 }
266
267 /*TILP_EXPORT void rbm_update_window1_activate(GtkMenuItem* menuitem, gpointer user_data)
268 {
269 on_tilp_button12_clicked(NULL, NULL);
270 }*/
271
272 /*TILP_EXPORT void rbm_make_a_new_dir1_activate(GtkMenuItem* menuitem, gpointer user_data)
273 {
274 gchar *utf8 = NULL;
275 gsize br, bw;
276 gchar *dirname;
277
278 utf8 = gif->msg_entry(_("Make a new directory"), _("Name: "), _("new_directory"));
279 if (utf8 == NULL)
280 return;
281
282 dirname = g_filename_from_utf8(utf8, -1, &br, &bw, NULL);
283 g_free(utf8);
284
285 tilp_file_mkdir(dirname);
286 g_free(dirname);
287
288 clist_refresh();
289 labels_refresh();
290 }*/
291
rbm_delete_file1_activate(GtkMenuItem * menuitem,gpointer user_data)292 TILP_EXPORT void rbm_delete_file1_activate(GtkMenuItem* menuitem, gpointer user_data)
293 {
294 on_tilp_button11_clicked(NULL, NULL);
295 }
296
rbm_set_as_working_dir1_activate(GtkMenuItem * menuitem,gpointer user_data)297 TILP_EXPORT void rbm_set_as_working_dir1_activate(GtkMenuItem* menuitem, gpointer user_data)
298 {
299 g_free(options.working_dir);
300 options.working_dir = g_get_current_dir();
301
302 tilp_config_write();
303 }
304
rbm_show_all_files1_activate(GtkCheckMenuItem * menuitem,gpointer user_data)305 TILP_EXPORT void rbm_show_all_files1_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
306 {
307 options.show_all = gtk_check_menu_item_get_active(menuitem);
308 toolbar_refresh_buttons();
309 clist_refresh();
310 }
311
rbm_confirm_delete_activate(GtkCheckMenuItem * action,gpointer user_data)312 TILP_EXPORT void rbm_confirm_delete_activate(GtkCheckMenuItem *action, gpointer user_data)
313 {
314 options.overwrite = gtk_check_menu_item_get_active(action);
315 }
316
rbm_properties1_activate(GtkMenuItem * menuitem,gpointer user_data)317 TILP_EXPORT void rbm_properties1_activate(GtkMenuItem *menuitem, gpointer user_data)
318 {
319 GList *ptr;
320
321 if (local.file_selection == NULL)
322 return;
323
324 for(ptr = local.file_selection; ptr; ptr = ptr->next)
325 {
326 gchar *fn = (gchar *)(ptr->data);
327
328 display_properties_dbox(fn);
329 }
330 }
331
create_clist_rbm(void)332 GtkWidget *create_clist_rbm(void)
333 {
334 GtkBuilder *builder;
335 GError* error = NULL;
336 GtkWidget* menu;
337 gpointer data;
338
339 builder = gtk_builder_new();
340 if (!gtk_builder_add_from_file (builder, tilp_paths_build_builder("clist_rbm.ui"), &error))
341 {
342 g_warning (_("Couldn't load builder file: %s\n"), error->message);
343 g_error_free (error);
344 return 0; // THIS RETURNS !
345 }
346
347 gtk_builder_connect_signals(builder, NULL);
348
349 data = gtk_builder_get_object(builder, "show_all_files1");
350 gtk_check_menu_item_set_active(data, options.show_all);
351
352 data = gtk_builder_get_object(builder, "confirm1");
353 gtk_check_menu_item_set_active(data, options.overwrite);
354
355 menu = GTK_WIDGET (gtk_builder_get_object(builder, "clist_rbm"));
356 #ifdef __WIN32__
357 set_drives(menu, menu);
358 #endif
359 return menu;
360 }
361