Re: [evolution-patches] Re: [Evolution-hackers] Possibility to save all attachments
- From: Jeffrey Stedfast <fejj ximian com>
- To: Harry Lu <harry lu sun com>
- Cc: Anna Dirks <anna ximian com>, Ettore Perazzoli <ettore ximian com>, fkosa eposta hu, evolution-patches ximian com
- Subject: Re: [evolution-patches] Re: [Evolution-hackers] Possibility to save all attachments
- Date: Thu, 31 Jul 2003 01:43:23 -0400
er, sorry. yea - looks good. I thought I commented on it earlier today
but apparently I didn't :-)
Jeff
On Thu, 2003-07-31 at 00:05, Harry Lu wrote:
> Jeff,
> Would you please review the patch again?
> Thanks!
> Harry
>
>
> Harry Lu wrote:
> > Anna, Jeff and others,
> > Thanks for the review. I modified my patch and attached it here.
> > For the first problem, since we are using GtkFileSelection widget
> > of GTK to let user select directory, it is very hard for us to
> > change its behavior. You have to double click to make the selection
> > work. This is also the normal behavior for the some File selection
> > dialogs. At least I am used to it. Anyway, I can hide the selection
> > text entry so that user can only see the selection label. So the
> > selection label will be the selection user should refer to. You can
> > apply the patch to see the result. If you don't like it, I can show
> > the entry again.
> > For the second, yes, my fault. English is not my native language,
> > so sometimes I make mistakes:( I had changed the menu item and the
> > dialog title according to your suggestions.
> > For the third, I agree with you :)
> >
> > Jeff, would you please review the patch again?
> > Thanks!
> > Harry
> >
> > anna ximian com wrote:
> >
> > > Hi Harry, Ettore and others,
> > >
> > > Thank you for your work on this patch! I have read many, many bug
> > > reports
> > > from people who want to use this feature, and I am happy that we
> > > will be
> > > able to offer it to them soon. Nice work.
> > >
> > > For the most part, I think that this patch seems good from a UI
> > > perspective. There are a few little things that bother me. They
> > > are:
> > >
> > > 1. On my machine, it is difficult to tell when a directory has
> > > been
> > > selected. Look at the following screenshot:
> > > http://primates.ximian.com/~anna/save-all.png . Have I succeeded
> > > in
> > > selecting the "Documents" directory? I cannot tell. If I press the
> > > "OK"
> > > button, what will happen? Will my attachments be saved in
> > > "Desktop", or in
> > > "Documents" ?
> > >
> > > I'd really like it if we could make the selected directory -- in
> > > this
> > > case, "Documents", appear in the text entry beneath the
> > > "Selection" label.
> > > Yes, I know it is a directroy, not a file, and that file names
> > > usually go
> > > in the "Selection" entry. To be clear, in this case, that would
> > > mean that
> > > "Documents" would be shown in the text entry. What do you think?
> > > I think
> > > if it is possible for the name of the selected directory to be
> > > shown
> > > there, then, that would be helpful in eliminating user confusion
> > > about
> > > precisely where her files will be saved.
> > >
> > > 2. Cosmetic Stuff: The plural form of the singular noun
> > > "attachment" is
> > > "attachments"; you tended to use "attachment", which is incorrect.
> > > The
> > > labels you used in your patch should be updated as follows: the
> > > name of
> > > the context menu item should be "Save all attachments..." (note
> > > that "all"
> > > is not capitalized).
> > >
> > > The title of the file selector should be shortened a bit, to be
> > > more
> > > consistent with the window title naming conventions used in the
> > > rest of
> > > Evolution; "Select Directory for Attachments" would be more
> > > appropriate.
> > > What do you think of that? Just to let you know what the HIG says
> > > on the
> > > matter, see
> > > http://developer.gnome.org/projects/gup/hig/1.0/windows.html#window-props-titles
> > > . The gist of the guidelines is that window titles should
> > > distinguish the
> > > window from other windows, but should not provide unnecessary
> > > information.
> > >
> > > 3. As for making other places in the UI for this option, I agree
> > > with you;
> > > figuring out the places where we should make this available is
> > > another
> > > bug. Specifically, it is this bug:
> > > http://bugzilla.ximian.com/show_bug.cgi?id=47048 . Let's discuss
> > > the
> > > possibilities for how to present these options there.
> > >
> > > Thank you,
> > > Anna
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > Evolution-patches mailing list
> > > Evolution-patches lists ximian com
> > > http://lists.ximian.com/mailman/listinfo/evolution-patches
> > >
> > >
> >
> > ____________________________________________________________________
> > Index: evolution/mail/ChangeLog
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
> > retrieving revision 1.2780
> > diff -u -r1.2780 ChangeLog
> > --- evolution/mail/ChangeLog 28 Jul 2003 16:09:14 -0000 1.2780
> > +++ evolution/mail/ChangeLog 30 Jul 2003 05:42:50 -0000
> > @@ -1,3 +1,18 @@
> > +2003-07-28 Harry Lu <harry lu sun com>
> > +
> > + *Fix for bug #6951
> > +
> > + * mail-display.c (launch_cb): Bypass the new added menu item.
> > + (save_all_parts_cb): New function. Do the real save-all work.
> > + (save_all_parts): New function. Get the directory to save to.
> > + (save_all_cb): New function. The call-back function for the new
> > + added menu item.
> > + (pixmap_press): Add the new menu item "Save All Attachment...".
> > + (ptr_array_free_notify): A simple wrapper function to free the
> > + pointer array.
> > + (do_attachment_header): Save attachment pointer in an array for
> > + "Save All Attachment" use.
> > +
> > 2003-07-28 Jeffrey Stedfast <fejj ximian com>
> >
> > * mail-crypto.c: Removed smime functions as they were stale.
> > Index: evolution/mail/mail-display.c
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/mail/mail-display.c,v
> > retrieving revision 1.287
> > diff -u -r1.287 mail-display.c
> > --- evolution/mail/mail-display.c 23 Jul 2003 15:01:26 -0000 1.287
> > +++ evolution/mail/mail-display.c 30 Jul 2003 05:42:56 -0000
> > @@ -375,9 +375,11 @@
> >
> > /* Yum. Too bad EPopupMenu doesn't allow per-item closures. */
> > children = gtk_container_get_children (GTK_CONTAINER (widget->parent));
> > - g_return_if_fail (children != NULL && children->next != NULL && children->next->next != NULL);
> > -
> > - for (c = children->next->next, apps = handler->applications; c && apps; c = c->next, apps = apps->next) {
> > + /* We need to bypass the first 2 menu items */
> > + g_return_if_fail (children != NULL && children->next != NULL
> > + && children->next->next != NULL && children->next->next->next != NULL);
> > +
> > + for (c = children->next->next->next, apps = handler->applications; c && apps; c = c->next, apps = apps->next) {
> > if (c->data == widget)
> > break;
> > }
> > @@ -435,7 +437,107 @@
> > mail_display_queue_redisplay (md);
> > }
> >
> > -static gboolean
> > +static void
> > +save_all_parts_cb (GtkWidget *widget, gpointer user_data)
> > +{
> > + GtkFileSelection *dir_select = (GtkFileSelection *)
> > + gtk_widget_get_ancestor (widget, GTK_TYPE_FILE_SELECTION);
> > + const char *filename;
> > + char *save_filename, *dir;
> > + struct stat st;
> > + int i;
> > + GPtrArray *attachment_array;
> > + CamelMimePart *part;
> > + GConfClient *gconf;
> > +
> > + gtk_widget_hide (GTK_WIDGET (dir_select));
> > +
> > + /* Get the selected directory name */
> > + filename = gtk_file_selection_get_filename (dir_select);
> > + if (stat (filename, &st) == -1 || !S_ISDIR (st.st_mode)) {
> > + GtkWidget *dialog;
> > +
> > + dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
> > + _("%s is not a valid directory name."), filename);
> > +
> > + /* FIXME: this should be async */
> > + gtk_dialog_run ((GtkDialog *) dialog);
> > + gtk_widget_destroy (dialog);
> > + gtk_widget_destroy (GTK_WIDGET (dir_select));
> > + return;
> > + } else {
> > + dir = g_strdup (filename);
> > + }
> > +
> > + /* Now save the attachment one by one */
> > + attachment_array = (GPtrArray *)user_data;
> > + for (i = 0; i < attachment_array->len; i++) {
> > + part = g_ptr_array_index (attachment_array, i);
> > + save_filename = make_safe_filename (dir, part);
> > + write_data_to_file (part, save_filename, FALSE);
> > + g_free (save_filename);
> > + }
> > +
> > + /* preserve the pathname */
> > + gconf = mail_config_get_gconf_client ();
> > + gconf_client_set_string (gconf, "/apps/evolution/mail/save_dir", dir, NULL);
> > + g_free (dir);
> > +
> > + gtk_widget_destroy (GTK_WIDGET (dir_select));
> > +}
> > +
> > +static void
> > +save_all_parts (GPtrArray *attachment_array)
> > +{
> > + GtkFileSelection *dir_select;
> > + char *dir, *home, *dir2;
> > + GConfClient *gconf;
> > +
> > + g_return_if_fail (attachment_array != NULL);
> > +
> > + home = getenv ("HOME");
> > + gconf = mail_config_get_gconf_client ();
> > + dir = gconf_client_get_string (gconf, "/apps/evolution/mail/save_dir", NULL);
> > + dir = dir ? dir : (home ? g_strdup (home) : g_strdup (""));
> > +
> > + /* Make sure dir2 has a '/' as its tail */
> > + dir2 = g_strdup_printf ("%s/", dir);
> > + g_free (dir);
> > +
> > + dir_select = GTK_FILE_SELECTION (
> > + gtk_file_selection_new (_("Select Directory for Attachments")));
> > + gtk_file_selection_set_filename (dir_select, dir2);
> > + gtk_widget_set_sensitive (dir_select->file_list, FALSE);
> > + gtk_widget_hide (dir_select->selection_entry);
> > + g_free (dir2);
> > +
> > + g_signal_connect (dir_select->ok_button, "clicked",
> > + G_CALLBACK (save_all_parts_cb), attachment_array);
> > + g_signal_connect_swapped (dir_select->cancel_button,
> > + "clicked",
> > + G_CALLBACK (gtk_widget_destroy),
> > + dir_select);
> > +
> > + gtk_widget_show (GTK_WIDGET (dir_select));
> > +}
> > +
> > +static void
> > +save_all_cb (GtkWidget *widget, gpointer user_data)
> > +{
> > + MailDisplay *md = g_object_get_data (user_data, "MailDisplay");
> > + GPtrArray *attachment_array;
> > +
> > + if (md == NULL) {
> > + g_warning ("No MailDisplay!");
> > + return;
> > + }
> > +
> > + attachment_array = g_datalist_get_data (md->data, "attachment_array");
> > + save_all_parts (attachment_array);
> > +}
> > +
> > +
> > +static gboolean
> > button_press (GtkWidget *widget, GdkEvent *event, CamelMimePart *part)
> > {
> > MailDisplay *md;
> > @@ -475,12 +577,14 @@
> > EPopupMenu *menu;
> > GtkMenu *gtk_menu;
> > EPopupMenu save_item = E_POPUP_ITEM (N_("Save Attachment..."), G_CALLBACK (save_cb), 0);
> > + EPopupMenu save_all_item = E_POPUP_ITEM (N_("Save all attachments..."), G_CALLBACK (save_all_cb), 0);
> > EPopupMenu view_item = E_POPUP_ITEM (N_("View Inline"), G_CALLBACK (inline_cb), 2);
> > EPopupMenu open_item = E_POPUP_ITEM (N_("Open in %s..."), G_CALLBACK (launch_cb), 1);
> > MailDisplay *md;
> > CamelMimePart *part;
> > MailMimeHandler *handler;
> > int mask = 0, i, nitems;
> > + int current_item = 0;
> >
> > if (event->type == GDK_BUTTON_PRESS) {
> > #ifdef USE_OLD_DISPLAY_STYLE
> > @@ -508,17 +612,23 @@
> > handler = mail_lookup_handler (g_object_get_data ((GObject *) widget, "mime_type"));
> >
> > if (handler && handler->applications)
> > - nitems = g_list_length (handler->applications) + 2;
> > + nitems = g_list_length (handler->applications) + 3;
> > else
> > - nitems = 3;
> > + nitems = 4;
> > menu = g_new0 (EPopupMenu, nitems + 1);
> >
> > /* Save item */
> > - memcpy (&menu[0], &save_item, sizeof (menu[0]));
> > - menu[0].name = _(menu[0].name);
> > -
> > + memcpy (&menu[current_item], &save_item, sizeof (menu[current_item]));
> > + menu[current_item].name = g_strdup (_(menu[current_item].name));
> > + current_item++;
> > +
> > + /* Save All item */
> > + memcpy (&menu[current_item], &save_all_item, sizeof (menu[current_item]));
> > + menu[current_item].name = g_strdup (_(menu[current_item].name));
> > + current_item++;
> > +
> > /* Inline view item */
> > - memcpy (&menu[1], &view_item, sizeof (menu[1]));
> > + memcpy (&menu[current_item], &view_item, sizeof (menu[current_item]));
> > if (handler && handler->builtin) {
> > md = g_object_get_data ((GObject *) widget, "MailDisplay");
> >
> > @@ -536,15 +646,16 @@
> > name = prop->v._u.value_string;
> > else
> > name = "bonobo";
> > - menu[1].name = g_strdup_printf (_("View Inline (via %s)"), name);
> > + menu[current_item].name = g_strdup_printf (_("View Inline (via %s)"), name);
> > } else
> > - menu[1].name = g_strdup (_(menu[1].name));
> > + menu[current_item].name = g_strdup (_(menu[current_item].name));
> > } else
> > - menu[1].name = g_strdup (_("Hide"));
> > + menu[current_item].name = g_strdup (_("Hide"));
> > } else {
> > - menu[1].name = g_strdup (_(menu[1].name));
> > + menu[current_item].name = g_strdup (_(menu[current_item].name));
> > mask |= 2;
> > }
> > + current_item++;
> >
> > /* External views */
> > if (handler && handler->applications) {
> > @@ -553,14 +664,15 @@
> > int i;
> >
> > apps = handler->applications;
> > - for (i = 2; i < nitems; i++, apps = apps->next) {
> > + for (i = current_item; i < nitems; i++, apps = apps->next) {
> > app = apps->data;
> > memcpy (&menu[i], &open_item, sizeof (menu[i]));
> > menu[i].name = g_strdup_printf (_(menu[i].name), app->name);
> > + current_item++;
> > }
> > } else {
> > - memcpy (&menu[2], &open_item, sizeof (menu[2]));
> > - menu[2].name = g_strdup_printf (_(menu[2].name), _("External Viewer"));
> > + memcpy (&menu[current_item], &open_item, sizeof (menu[current_item]));
> > + menu[current_item].name = g_strdup_printf (_(menu[current_item].name), _("External Viewer"));
> > mask |= 1;
> > }
> >
> > @@ -983,6 +1095,12 @@
> > }
> > }
> >
> > +/* This is a wrapper function */
> > +void ptr_array_free_notify (gpointer array)
> > +{
> > + g_ptr_array_free ((GPtrArray *) array, TRUE);
> > +}
> > +
> > static gboolean
> > do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb,
> > CamelMimePart *part, MailDisplay *md)
> > @@ -990,6 +1108,7 @@
> > GtkWidget *button, *mainbox, *hbox, *arrow, *popup;
> > MailMimeHandler *handler;
> > struct _PixbufLoader *pbl;
> > + GPtrArray *attachment_array;
> >
> > pbl = g_new0 (struct _PixbufLoader, 1);
> > if (strncasecmp (eb->type, "image/", 6) == 0) {
> > @@ -1059,6 +1178,19 @@
> > g_object_set_data ((GObject *) popup, "MailDisplay", md);
> > g_object_set_data ((GObject *) popup, "CamelMimePart", part);
> > g_object_set_data_full ((GObject *) popup, "mime_type", g_strdup (eb->type), (GDestroyNotify) g_free);
> > +
> > + /* Save attachment pointer in an array for "save all attachment" use */
> > + attachment_array = g_datalist_get_data (md->data, "attachment_array");
> > + if (!attachment_array) {
> > + attachment_array = g_ptr_array_new ();
> > + g_datalist_set_data_full (md->data, "attachment_array",
> > + attachment_array, (GDestroyNotify) ptr_array_free_notify);
> > + }
> > + /* Since the attachment pointer might have been added to the array before,
> > + remove it first anyway to avoide duplication */
> > + g_ptr_array_remove (attachment_array, part);
> > + g_ptr_array_add (attachment_array, part);
> > +
> >
> > g_signal_connect (popup, "button_press_event", G_CALLBACK (pixmap_press), md->scroll);
> > g_signal_connect (popup, "key_press_event", G_CALLBACK (pixmap_press), md->scroll);
> >
--
Jeffrey Stedfast
Evolution Hacker - Ximian, Inc.
fejj ximian com - www.ximian.com
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]