Mercurial > gftp.yaz
comparison src/gtk/gtkui_transfer.c @ 371:39b57989c34a
2003-1-18 Brian Masney <masneyb@gftp.org>
* src/gtk/gtkui_transfer.c - gtk+ specific file transfer code.
Forgot to attach this with the last commit
author | masneyb |
---|---|
date | Mon, 19 Jan 2004 12:23:52 +0000 |
parents | |
children | d207b8241e96 |
comparison
equal
deleted
inserted
replaced
370:f514f510ebaa | 371:39b57989c34a |
---|---|
1 /*****************************************************************************/ | |
2 /* gtkui_transfer.c - GTK+ UI transfer related functions for gFTP */ | |
3 /* Copyright (C) 1998-2003 Brian Masney <masneyb@gftp.org> */ | |
4 /* */ | |
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. */ | |
9 /* */ | |
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. */ | |
14 /* */ | |
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 USA */ | |
18 /*****************************************************************************/ | |
19 | |
20 #include "gftp-gtk.h" | |
21 static const char cvsid[] = "$Id$"; | |
22 | |
23 static void | |
24 trans_selectall (GtkWidget * widget, gpointer data) | |
25 { | |
26 gftp_transfer * tdata; | |
27 tdata = data; | |
28 | |
29 gtk_clist_select_all (GTK_CLIST (tdata->clist)); | |
30 } | |
31 | |
32 | |
33 static void | |
34 trans_unselectall (GtkWidget * widget, gpointer data) | |
35 { | |
36 gftp_transfer * tdata; | |
37 tdata = data; | |
38 | |
39 gtk_clist_unselect_all (GTK_CLIST (tdata->clist)); | |
40 } | |
41 | |
42 | |
43 static void | |
44 overwrite (GtkWidget * widget, gpointer data) | |
45 { | |
46 GList * templist, * filelist; | |
47 gftp_transfer * tdata; | |
48 gftp_file * tempfle; | |
49 int curpos; | |
50 | |
51 tdata = data; | |
52 curpos = 0; | |
53 filelist = tdata->files; | |
54 templist = GTK_CLIST (tdata->clist)->selection; | |
55 while (templist != NULL) | |
56 { | |
57 templist = get_next_selection (templist, &filelist, &curpos); | |
58 tempfle = filelist->data; | |
59 tempfle->transfer_action = GFTP_TRANS_ACTION_OVERWRITE; | |
60 gtk_clist_set_text (GTK_CLIST (tdata->clist), curpos, 3, _("Overwrite")); | |
61 } | |
62 } | |
63 | |
64 | |
65 static void | |
66 resume (GtkWidget * widget, gpointer data) | |
67 { | |
68 GList * templist, * filelist; | |
69 gftp_transfer * tdata; | |
70 gftp_file * tempfle; | |
71 int curpos; | |
72 | |
73 tdata = data; | |
74 curpos = 0; | |
75 filelist = tdata->files; | |
76 templist = GTK_CLIST (tdata->clist)->selection; | |
77 while (templist != NULL) | |
78 { | |
79 templist = get_next_selection (templist, &filelist, &curpos); | |
80 tempfle = filelist->data; | |
81 tempfle->transfer_action = GFTP_TRANS_ACTION_RESUME; | |
82 gtk_clist_set_text (GTK_CLIST (tdata->clist), curpos, 3, _("Resume")); | |
83 } | |
84 } | |
85 | |
86 | |
87 static void | |
88 skip (GtkWidget * widget, gpointer data) | |
89 { | |
90 GList * templist, * filelist; | |
91 gftp_transfer * tdata; | |
92 gftp_file * tempfle; | |
93 int curpos; | |
94 | |
95 tdata = data; | |
96 curpos = 0; | |
97 filelist = tdata->files; | |
98 templist = GTK_CLIST (tdata->clist)->selection; | |
99 while (templist != NULL) | |
100 { | |
101 templist = get_next_selection (templist, &filelist, &curpos); | |
102 tempfle = filelist->data; | |
103 tempfle->transfer_action = GFTP_TRANS_ACTION_SKIP; | |
104 gtk_clist_set_text (GTK_CLIST (tdata->clist), curpos, 3, _("Skip")); | |
105 } | |
106 } | |
107 | |
108 | |
109 static void | |
110 ok (GtkWidget * widget, gpointer data) | |
111 { | |
112 gftp_transfer * tdata; | |
113 gftp_file * tempfle; | |
114 GList * templist; | |
115 | |
116 tdata = data; | |
117 g_static_mutex_lock (&tdata->structmutex); | |
118 for (templist = tdata->files; templist != NULL; templist = templist->next) | |
119 { | |
120 tempfle = templist->data; | |
121 if (tempfle->transfer_action != GFTP_TRANS_ACTION_SKIP) | |
122 break; | |
123 } | |
124 | |
125 if (templist == NULL) | |
126 { | |
127 tdata->show = 0; | |
128 tdata->ready = tdata->done = 1; | |
129 } | |
130 else | |
131 tdata->show = tdata->ready = 1; | |
132 g_static_mutex_unlock (&tdata->structmutex); | |
133 } | |
134 | |
135 | |
136 static void | |
137 cancel (GtkWidget * widget, gpointer data) | |
138 { | |
139 gftp_transfer * tdata; | |
140 | |
141 tdata = data; | |
142 g_static_mutex_lock (&tdata->structmutex); | |
143 tdata->show = 0; | |
144 tdata->done = tdata->ready = 1; | |
145 g_static_mutex_unlock (&tdata->structmutex); | |
146 } | |
147 | |
148 | |
149 #if GTK_MAJOR_VERSION > 1 | |
150 static void | |
151 transfer_action (GtkWidget * widget, gint response, gpointer user_data) | |
152 { | |
153 switch (response) | |
154 { | |
155 case GTK_RESPONSE_OK: | |
156 ok (widget, user_data); | |
157 gtk_widget_destroy (widget); | |
158 break; | |
159 case GTK_RESPONSE_CANCEL: | |
160 cancel (widget, user_data); | |
161 /* no break */ | |
162 default: | |
163 gtk_widget_destroy (widget); | |
164 } | |
165 } | |
166 #endif | |
167 | |
168 | |
169 void | |
170 gftpui_ask_transfer (gftp_transfer * tdata) | |
171 { | |
172 char *dltitles[4], *add_data[4] = { NULL, NULL, NULL, NULL }, | |
173 tempstr[50], temp1str[50], *pos; | |
174 GtkWidget * dialog, * tempwid, * scroll, * hbox; | |
175 intptr_t overwrite_default; | |
176 gftp_file * tempfle; | |
177 GList * templist; | |
178 size_t len; | |
179 int i; | |
180 | |
181 dltitles[0] = _("Filename"); | |
182 dltitles[1] = tdata->fromreq->hostname; | |
183 dltitles[2] = tdata->toreq->hostname; | |
184 dltitles[3] = _("Action"); | |
185 | |
186 #if GTK_MAJOR_VERSION == 1 | |
187 dialog = gtk_dialog_new (); | |
188 gtk_grab_add (dialog); | |
189 gtk_window_set_title (GTK_WINDOW (dialog), _("Transfer Files")); | |
190 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 5); | |
191 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 35); | |
192 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); | |
193 | |
194 gtk_signal_connect_object (GTK_OBJECT (dialog), "delete_event", | |
195 GTK_SIGNAL_FUNC (gtk_widget_destroy), | |
196 GTK_OBJECT (dialog)); | |
197 #else | |
198 dialog = gtk_dialog_new_with_buttons (_("Transfer Files"), NULL, 0, | |
199 GTK_STOCK_OK, | |
200 GTK_RESPONSE_OK, | |
201 GTK_STOCK_CANCEL, | |
202 GTK_RESPONSE_CANCEL, | |
203 NULL); | |
204 #endif | |
205 gtk_window_set_wmclass (GTK_WINDOW(dialog), "transfer", "gFTP"); | |
206 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); | |
207 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10); | |
208 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); | |
209 | |
210 tempwid = gtk_label_new (_("The following file(s) exist on both the local and remote computer\nPlease select what you would like to do")); | |
211 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, FALSE, | |
212 FALSE, 0); | |
213 gtk_widget_show (tempwid); | |
214 | |
215 scroll = gtk_scrolled_window_new (NULL, NULL); | |
216 gtk_widget_set_size_request (scroll, 450, 200); | |
217 | |
218 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), | |
219 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
220 tdata->clist = gtk_clist_new_with_titles (4, dltitles); | |
221 gtk_container_add (GTK_CONTAINER (scroll), tdata->clist); | |
222 | |
223 #if GTK_MAJOR_VERSION == 1 | |
224 gtk_clist_set_selection_mode (GTK_CLIST (tdata->clist), | |
225 GTK_SELECTION_EXTENDED); | |
226 #else | |
227 gtk_clist_set_selection_mode (GTK_CLIST (tdata->clist), | |
228 GTK_SELECTION_MULTIPLE); | |
229 #endif | |
230 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 0, 100); | |
231 gtk_clist_set_column_justification (GTK_CLIST (tdata->clist), 1, | |
232 GTK_JUSTIFY_RIGHT); | |
233 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 1, 85); | |
234 gtk_clist_set_column_justification (GTK_CLIST (tdata->clist), 2, | |
235 GTK_JUSTIFY_RIGHT); | |
236 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 2, 85); | |
237 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 3, 85); | |
238 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scroll, TRUE, TRUE, | |
239 0); | |
240 gtk_widget_show (tdata->clist); | |
241 gtk_widget_show (scroll); | |
242 | |
243 gftp_lookup_request_option (tdata->fromreq, "overwrite_default", | |
244 &overwrite_default); | |
245 | |
246 for (templist = tdata->files; templist != NULL; | |
247 templist = templist->next) | |
248 { | |
249 tempfle = templist->data; | |
250 if (tempfle->startsize == 0 || tempfle->isdir) | |
251 { | |
252 tempfle->shown = 0; | |
253 continue; | |
254 } | |
255 tempfle->shown = 1; | |
256 | |
257 pos = tempfle->destfile; | |
258 len = strlen (tdata->toreq->directory); | |
259 if (strncmp (pos, tdata->toreq->directory, len) == 0) | |
260 pos = tempfle->destfile + len + 1; | |
261 add_data[0] = pos; | |
262 | |
263 if (overwrite_default) | |
264 { | |
265 add_data[3] = _("Overwrite"); | |
266 tempfle->transfer_action = GFTP_TRANS_ACTION_OVERWRITE; | |
267 } | |
268 else if (tempfle->startsize == tempfle->size) | |
269 { | |
270 add_data[3] = _("Skip"); | |
271 tempfle->transfer_action = GFTP_TRANS_ACTION_SKIP; | |
272 } | |
273 else if (tempfle->startsize > tempfle->size) | |
274 { | |
275 add_data[3] = _("Overwrite"); | |
276 tempfle->transfer_action = GFTP_TRANS_ACTION_OVERWRITE; | |
277 } | |
278 else | |
279 { | |
280 add_data[3] = _("Resume"); | |
281 tempfle->transfer_action = GFTP_TRANS_ACTION_RESUME; | |
282 } | |
283 | |
284 add_data[1] = insert_commas (tempfle->size, tempstr, sizeof (tempstr)); | |
285 add_data[2] = insert_commas (tempfle->startsize, temp1str, | |
286 sizeof (temp1str)); | |
287 | |
288 i = gtk_clist_append (GTK_CLIST (tdata->clist), add_data); | |
289 gtk_clist_set_row_data (GTK_CLIST (tdata->clist), i, tempfle); | |
290 } | |
291 | |
292 gtk_clist_select_all (GTK_CLIST (tdata->clist)); | |
293 | |
294 hbox = gtk_hbox_new (TRUE, 20); | |
295 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0); | |
296 gtk_widget_show (hbox); | |
297 | |
298 tempwid = gtk_button_new_with_label (_("Overwrite")); | |
299 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0); | |
300 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", | |
301 GTK_SIGNAL_FUNC (overwrite), (gpointer) tdata); | |
302 gtk_widget_show (tempwid); | |
303 | |
304 tempwid = gtk_button_new_with_label (_("Resume")); | |
305 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0); | |
306 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", | |
307 GTK_SIGNAL_FUNC (resume), (gpointer) tdata); | |
308 gtk_widget_show (tempwid); | |
309 | |
310 tempwid = gtk_button_new_with_label (_("Skip File")); | |
311 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0); | |
312 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", GTK_SIGNAL_FUNC (skip), | |
313 (gpointer) tdata); | |
314 gtk_widget_show (tempwid); | |
315 | |
316 hbox = gtk_hbox_new (TRUE, 20); | |
317 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0); | |
318 gtk_widget_show (hbox); | |
319 | |
320 tempwid = gtk_button_new_with_label (_("Select All")); | |
321 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0); | |
322 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", | |
323 GTK_SIGNAL_FUNC (trans_selectall), (gpointer) tdata); | |
324 gtk_widget_show (tempwid); | |
325 | |
326 tempwid = gtk_button_new_with_label (_("Deselect All")); | |
327 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0); | |
328 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", | |
329 GTK_SIGNAL_FUNC (trans_unselectall), (gpointer) tdata); | |
330 gtk_widget_show (tempwid); | |
331 | |
332 #if GTK_MAJOR_VERSION == 1 | |
333 tempwid = gtk_button_new_with_label (_("OK")); | |
334 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
335 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
336 TRUE, TRUE, 0); | |
337 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", GTK_SIGNAL_FUNC (ok), | |
338 (gpointer) tdata); | |
339 gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked", | |
340 GTK_SIGNAL_FUNC (gtk_widget_destroy), | |
341 GTK_OBJECT (dialog)); | |
342 gtk_widget_grab_default (tempwid); | |
343 gtk_widget_show (tempwid); | |
344 | |
345 tempwid = gtk_button_new_with_label (_(" Cancel ")); | |
346 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
347 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
348 TRUE, TRUE, 0); | |
349 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", | |
350 GTK_SIGNAL_FUNC (cancel), (gpointer) tdata); | |
351 gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked", | |
352 GTK_SIGNAL_FUNC (gtk_widget_destroy), | |
353 GTK_OBJECT (dialog)); | |
354 gtk_widget_show (tempwid); | |
355 #else | |
356 g_signal_connect (GTK_OBJECT (dialog), "response", | |
357 G_CALLBACK (transfer_action), (gpointer) tdata); | |
358 #endif | |
359 | |
360 gtk_widget_show (dialog); | |
361 dialog = NULL; | |
362 } | |
363 |