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