~ubuntu-branches/ubuntu/vivid/liferea/vivid-proposed

« back to all changes in this revision

Viewing changes to src/ui/enclosure_list_view.c

  • Committer: Package Import Robot
  • Author(s): bojo42
  • Date: 2012-03-29 14:17:21 UTC
  • mfrom: (1.3.9) (3.2.5 sid)
  • Revision ID: package-import@ubuntu.com-20120329141721-tbfopcrc5797wxt7
Tags: 1.8.3-0.1ubuntu1
* New upstream release (LP: #290666, #371754, #741543, #716688)
* Merge from Debian unstable (LP: #935147), remaining changes:
* debian/patches:
  - drop gtk-status-icon.patch & notification-append as in upstream
  - drop fix_systray_behavior as mostly upstreamed and rest seems unused
  - 01_ubuntu_feedlists: update & rename, move planets to "Open Source"  
  - add_X-Ubuntu-Gettext-Domain: rebase
  - libunity.patch: rebase, apply before indicator patch (liferea_shell.c)
  - libindicate_increase_version.patch: exclude from libindicate.patch
  - deactivate libindicate.patch, seems partly upstreamed and needs rework
* debian/control: libindicate-dev, libindicate-gtk-dev & libunity-dev
* debian/liferea.indicate & liferea.install: ship indicator desktop file
* debian/rules: enable libindicate

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/**
2
2
 * @file enclosure-list-view.c enclosures/podcast handling GUI
3
3
 *
4
 
 * Copyright (C) 2005-2008 Lars Lindner <lars.lindner@gmail.com>
 
4
 * Copyright (C) 2005-2011 Lars Lindner <lars.lindner@gmail.com>
5
5
 *
6
6
 * This program is free software; you can redistribute it and/or modify
7
7
 * it under the terms of the GNU General Public License as published by
29
29
#include "item.h"
30
30
#include "metadata.h"
31
31
#include "ui/liferea_dialog.h"
32
 
#include "ui/ui_popup.h"
 
32
#include "ui/popup_menu.h"
33
33
#include "ui/ui_prefs.h"
34
34
 
35
35
/* enclosure list view implementation */
44
44
        ES_LEN
45
45
};
46
46
 
47
 
static void enclosure_list_view_class_init      (EnclosureListViewClass *klass);
48
 
static void enclosure_list_view_init            (EnclosureListView *ld);
49
 
 
50
47
#define ENCLOSURE_LIST_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), ENCLOSURE_LIST_VIEW_TYPE, EnclosureListViewPrivate))
51
48
 
52
49
struct EnclosureListViewPrivate {
59
56
 
60
57
static GObjectClass *parent_class = NULL;
61
58
 
62
 
GType
63
 
enclosure_list_view_get_type (void) 
64
 
{
65
 
        static GType type = 0;
66
 
 
67
 
        if (G_UNLIKELY (type == 0)) 
68
 
        {
69
 
                static const GTypeInfo our_info = 
70
 
                {
71
 
                        sizeof (EnclosureListViewClass),
72
 
                        NULL, /* base_init */
73
 
                        NULL, /* base_finalize */
74
 
                        (GClassInitFunc) enclosure_list_view_class_init,
75
 
                        NULL,
76
 
                        NULL, /* class_data */
77
 
                        sizeof (EnclosureListView),
78
 
                        0, /* n_preallocs */
79
 
                        (GInstanceInitFunc) enclosure_list_view_init,
80
 
                        NULL /* value_table */
81
 
                };
82
 
 
83
 
                type = g_type_register_static (G_TYPE_OBJECT,
84
 
                                               "EnclosureListView",
85
 
                                               &our_info, 0);
86
 
        }
87
 
 
88
 
        return type;
89
 
}
 
59
G_DEFINE_TYPE (EnclosureListView, enclosure_list_view, G_TYPE_OBJECT);
90
60
 
91
61
static void
92
62
enclosure_list_view_finalize (GObject *object)
147
117
}
148
118
 
149
119
static gboolean
 
120
on_enclosure_list_popup_menu (GtkWidget *widget, gpointer user_data)
 
121
{
 
122
        GtkTreeView             *treeview = GTK_TREE_VIEW (widget);
 
123
        GtkTreeModel            *model;
 
124
        GtkTreeIter             iter;
 
125
 
 
126
        if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (treeview), &model, &iter)) {
 
127
                enclosurePtr enclosure; 
 
128
                gtk_tree_model_get (model, &iter, ES_PTR, &enclosure, -1);
 
129
                ui_popup_enclosure_menu (enclosure, 3, 0);
 
130
                return TRUE;
 
131
        }
 
132
        
 
133
        return FALSE;
 
134
}
 
135
 
 
136
static gboolean
150
137
on_enclosure_list_activate (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
151
138
{
152
139
        enclosurePtr    enclosure;
216
203
        
217
204
        gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (elv->priv->treeview), FALSE);
218
205
 
219
 
        g_signal_connect ((gpointer)elv->priv->treeview, "button_press_event",
220
 
                          G_CALLBACK (on_enclosure_list_button_press), (gpointer)elv);
221
 
                          
222
 
        g_signal_connect ((gpointer)elv->priv->treeview, "row-activated",
223
 
                          G_CALLBACK (on_enclosure_list_activate), (gpointer)elv);
 
206
        g_signal_connect (G_OBJECT (elv->priv->treeview), "button_press_event", G_CALLBACK (on_enclosure_list_button_press), (gpointer)elv);
 
207
        g_signal_connect (G_OBJECT (elv->priv->treeview), "row-activated", G_CALLBACK (on_enclosure_list_activate), (gpointer)elv);
 
208
        g_signal_connect (G_OBJECT (elv->priv->treeview), "popup_menu", G_CALLBACK (on_enclosure_list_popup_menu), (gpointer)elv);
224
209
 
225
210
        g_signal_connect_object (elv->priv->container, "destroy", G_CALLBACK (enclosure_list_view_destroy_cb), elv, 0);
226
211
 
248
233
        }
249
234
        g_slist_free (elv->priv->enclosures);
250
235
        elv->priv->enclosures = NULL;   
251
 
 
 
236
        
252
237
        /* decide visibility of the list */
253
238
        list = metadata_list_get_values (item->metadata, "enclosure");
254
239
        len = g_slist_length (list);
350
335
        utfname = gtk_entry_get_text (GTK_ENTRY (liferea_dialog_lookup (dialog,"enc_cmd_entry")));
351
336
        name = g_filename_from_utf8 (utfname, -1, NULL, NULL, NULL);
352
337
        if (name) {
353
 
                ui_choose_file (_("Choose File"), GTK_STOCK_OPEN, FALSE, on_selectcmdok_clicked, name, NULL, dialog);
 
338
                ui_choose_file (_("Choose File"), GTK_STOCK_OPEN, FALSE, on_selectcmdok_clicked, name, NULL, NULL, NULL, dialog);
354
339
                g_free (name);
355
340
        }
356
341
}
384
369
                etp->remote = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "enc_remote_open_btn")));
385
370
                if (new)
386
371
                        enclosure_mime_type_add (etp);
 
372
                else
 
373
                        enclosure_mime_types_save ();
387
374
 
388
375
                /* now we have ensured an existing type configuration and
389
376
                   can launch the URL for which we configured the type */
403
390
        gchar           *tmp;
404
391
 
405
392
        dialog = liferea_dialog_new (NULL, "enchandlerdialog");
406
 
 
407
393
        if (type) {
408
394
                typestr = type->mime?type->mime:type->extension;
409
395
                gtk_entry_set_text (GTK_ENTRY (liferea_dialog_lookup (dialog, "enc_cmd_entry")), type->cmd);
412
398
        }
413
399
 
414
400
        if (!strchr(typestr, '/')) 
415
 
                tmp = g_strdup_printf (_("<b>File Extension .%s</b>"), typestr);
 
401
                tmp = g_strdup_printf (_("File Extension .%s"), typestr);
416
402
        else
417
 
                tmp = g_strdup_printf ("<b>%s</b>", typestr);
418
 
        gtk_label_set_markup_with_mnemonic (GTK_LABEL (liferea_dialog_lookup (dialog, "enc_type_label")), tmp);
 
403
                tmp = g_strdup_printf ("%s", typestr);
 
404
        gtk_label_set_text (GTK_LABEL (liferea_dialog_lookup (dialog, "enc_type_label")), tmp);
419
405
        g_free (tmp);
420
406
 
421
407
        g_object_set_data (G_OBJECT(dialog), "typestr", g_strdup (typestr));
438
424
 
439
425
        /* 1.) Always try to determine the file extension... */
440
426
        
441
 
        /* FIXME: improve this to match only '.' not followed by '/' chars */
 
427
        /* find extension by looking for last '.' */
442
428
        typestr = strrchr (enclosure->url, '.');
443
429
        if (typestr)
444
430
                typestr = g_strdup (typestr + 1);
445
 
                        
 
431
 
 
432
        /* handle case where there is a slash after the '.' */
 
433
        if (typestr && strrchr (typestr, '/'))
 
434
                typestr = strrchr (typestr, '/');
 
435
                
 
436
        /* handle case where there is no '.' at all */
 
437
        if (!typestr && strrchr (enclosure->url, '/'))
 
438
                typestr = strrchr (enclosure->url, '/');
 
439
        
446
440
        /* if we found no extension we map to dummy type "data" */
447
441
        if (!typestr)
448
442
                typestr = g_strdup ("data");
 
443
                
 
444
        /* strip GET parameters from typestr */ 
 
445
        g_strdelimit (typestr, "?", 0);
449
446
 
450
447
        debug2 (DEBUG_CACHE, "url:%s, mime:%s", enclosure->url, enclosure->mime);
451
448
        
511
508
        else
512
509
                filename = enclosure->url;
513
510
                
514
 
        ui_choose_file (_("Choose File"), GTK_STOCK_SAVE_AS, TRUE, on_encsave_clicked, NULL, filename, enclosure->url);
 
511
        filename = g_strdup (filename);
 
512
        g_strdelimit (filename, "?", 0);        /* strip GET parameters */
 
513
                
 
514
        ui_choose_file (_("Choose File"), GTK_STOCK_SAVE_AS, TRUE, on_encsave_clicked, NULL, filename, NULL, NULL, enclosure->url);
 
515
 
 
516
        g_free (filename);
515
517
}
516
518
 
517
519
void