~midori/midori/webKitTwoOnly

« back to all changes in this revision

Viewing changes to midori/midori-browser.c

  • Committer: Christian Dywan
  • Date: 2010-06-17 18:17:21 UTC
  • Revision ID: git-v1:fa08c4d1f9056eb2eae6321f228e62aa0dea758d
Refactor transferbar into MidoriTransferbar

The transferbar is separated from the browser, albeit it is still
created and filled from within the browser so it is not completely
independent.

The new class now keeps a list of TransferInfo items to keep track
of transfers and queries the status from the download object.

Destroying a button belonging to a transfer is connected to
removing it from the list and cleaning up the info structure. Also
the Clear button is updated from the destroy handler.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
#include "midori-locationaction.h"
25
25
#include "midori-searchaction.h"
26
26
#include "midori-stock.h"
 
27
#include "midori-transferbar.h"
27
28
 
28
29
#include "gtkiconentry.h"
29
30
#include "marshal.h"
86
87
    GtkWidget* statusbar;
87
88
    GtkWidget* statusbar_contents;
88
89
    GtkWidget* transferbar;
89
 
    GtkWidget* transferbar_clear;
90
90
    GtkWidget* progressbar;
91
91
    gchar* statusbar_text;
92
92
 
207
207
midori_browser_set_bookmarks (MidoriBrowser* browser,
208
208
                              KatzeArray*    bookmarks);
209
209
 
210
 
#if WEBKIT_CHECK_VERSION (1, 1, 3)
211
 
static void
212
 
midori_browser_add_download_item (MidoriBrowser*  browser,
213
 
                                  WebKitDownload* download);
214
 
#endif
215
 
 
216
210
GdkPixbuf*
217
211
midori_search_action_get_icon (KatzeItem*    item,
218
212
                               GtkWidget*    widget,
230
224
static void
231
225
midori_browser_add_speed_dial (MidoriBrowser* browser);
232
226
 
 
227
gboolean
 
228
midori_transferbar_confirm_delete (MidoriTransferbar* transferbar);
 
229
 
 
230
#if WEBKIT_CHECK_VERSION (1, 1, 3)
 
231
void
 
232
midori_transferbar_add_download_item (MidoriTransferbar* transferbar,
 
233
                                      WebKitDownload*    download);
 
234
#endif
 
235
 
233
236
#define _action_by_name(brwsr, nme) \
234
237
    gtk_action_group_get_action (brwsr->action_group, nme)
235
238
#define _action_set_sensitive(brwsr, nme, snstv) \
1013
1016
    }
1014
1017
 
1015
1018
    webkit_download_set_destination_uri (download, uri);
1016
 
    midori_browser_add_download_item (browser, download);
 
1019
    midori_transferbar_add_download_item (MIDORI_TRANSFERBAR (browser->transferbar), download);
1017
1020
    return TRUE;
1018
1021
}
1019
1022
#else
1417
1420
}
1418
1421
 
1419
1422
#if WEBKIT_CHECK_VERSION (1, 1, 3)
1420
 
static void
1421
 
midori_browser_download_notify_progress_cb (WebKitDownload* download,
1422
 
                                            GParamSpec*     pspec,
1423
 
                                            GtkWidget*      progress)
1424
 
{
1425
 
    gchar* current;
1426
 
    gchar* total;
1427
 
    gchar* size_text;
1428
 
    gchar* text;
1429
 
 
1430
 
    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress),
1431
 
        webkit_download_get_progress (download));
1432
 
 
1433
 
    current = g_format_size_for_display (webkit_download_get_current_size (download));
1434
 
    total = g_format_size_for_display (webkit_download_get_total_size (download));
1435
 
    size_text = g_strdup_printf (_("%s of %s"), current, total);
1436
 
    g_free (current);
1437
 
    g_free (total);
1438
 
    text = g_strdup_printf ("%s (%s)",
1439
 
        gtk_progress_bar_get_text (GTK_PROGRESS_BAR (progress)),
1440
 
        size_text);
1441
 
    gtk_widget_set_tooltip_text (progress, text);
1442
 
}
1443
 
 
1444
 
static void
1445
 
midori_browser_download_notify_status_cb (WebKitDownload* download,
1446
 
                                          GParamSpec*     pspec,
1447
 
                                          GtkWidget*      button)
1448
 
{
1449
 
    GtkWidget* icon;
1450
 
 
1451
 
    switch (webkit_download_get_status (download))
1452
 
    {
1453
 
        case WEBKIT_DOWNLOAD_STATUS_FINISHED:
1454
 
        {
1455
 
            MidoriBrowser* browser = midori_browser_get_for_widget (button);
1456
 
 
1457
 
            icon = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
1458
 
            gtk_button_set_image (GTK_BUTTON (button), icon);
1459
 
            if (g_object_get_data (G_OBJECT (download), "open-download"))
1460
 
                gtk_button_clicked (GTK_BUTTON (button));
1461
 
            else
1462
 
                g_object_set_data (G_OBJECT (gtk_widget_get_parent (button)),
1463
 
                                   "done", (void*)1);
1464
 
 
1465
 
            if (katze_object_get_boolean (browser->settings, "notify-transfer-completed"))
1466
 
            {
1467
 
                const gchar* uri = webkit_download_get_destination_uri (download);
1468
 
                gchar* path = soup_uri_decode (uri);
1469
 
                gchar* filename = g_strrstr (path, "/") + 1;
1470
 
                gchar* msg = g_strdup_printf (
1471
 
                    _("The file '<b>%s</b>' has been downloaded."), filename);
1472
 
                g_free (path);
1473
 
 
1474
 
                g_signal_emit (browser, signals[SEND_NOTIFICATION], 0,
1475
 
                    _("Transfer completed"), msg);
1476
 
 
1477
 
                g_free (msg);
1478
 
            }
1479
 
            break;
1480
 
        }
1481
 
        case WEBKIT_DOWNLOAD_STATUS_CANCELLED:
1482
 
        case WEBKIT_DOWNLOAD_STATUS_ERROR:
1483
 
            icon = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
1484
 
            gtk_button_set_image (GTK_BUTTON (button), icon);
1485
 
            g_object_set_data (G_OBJECT (gtk_widget_get_parent (button)),
1486
 
                               "done", (void*)1);
1487
 
            break;
1488
 
        default:
1489
 
            break;
1490
 
    }
1491
 
}
1492
 
 
1493
 
static void
1494
 
midori_browser_download_button_clicked_cb (GtkWidget*      button,
1495
 
                                           WebKitDownload* download)
1496
 
{
1497
 
    MidoriBrowser* browser;
1498
 
    GList* buttons;
1499
 
 
1500
 
    browser = midori_browser_get_for_widget (button);
1501
 
 
1502
 
    switch (webkit_download_get_status (download))
1503
 
    {
1504
 
        case WEBKIT_DOWNLOAD_STATUS_STARTED:
1505
 
            webkit_download_cancel (download);
1506
 
            g_object_set_data (G_OBJECT (gtk_widget_get_parent (button)),
1507
 
                               "done", (void*)1);
1508
 
            break;
1509
 
        case WEBKIT_DOWNLOAD_STATUS_FINISHED:
1510
 
        {
1511
 
            const gchar* uri = webkit_download_get_destination_uri (download);
1512
 
            if (sokoke_show_uri (gtk_widget_get_screen (button),
1513
 
                uri, gtk_get_current_event_time (), NULL))
1514
 
                gtk_widget_destroy (gtk_widget_get_parent (button));
1515
 
            break;
1516
 
        }
1517
 
        case WEBKIT_DOWNLOAD_STATUS_CANCELLED:
1518
 
            gtk_widget_destroy (gtk_widget_get_parent (button));
1519
 
        default:
1520
 
            break;
1521
 
    }
1522
 
 
1523
 
    buttons = gtk_container_get_children (GTK_CONTAINER (browser->transferbar));
1524
 
    if (g_list_length (buttons) == 1)
1525
 
        gtk_widget_hide (browser->transferbar_clear);
1526
 
    g_list_free (buttons);
1527
 
}
1528
 
 
1529
 
static void
1530
 
midori_browser_add_download_item (MidoriBrowser*  browser,
1531
 
                                  WebKitDownload* download)
1532
 
{
1533
 
    GtkWidget* box;
1534
 
    GtkWidget* icon;
1535
 
    GtkWidget* button;
1536
 
    GtkWidget* progress;
1537
 
    const gchar* uri;
1538
 
    gint width;
1539
 
 
1540
 
    box = gtk_hbox_new (FALSE, 0);
1541
 
    /* icon = gtk_image_new_from_stock (STOCK_TRANSFER, GTK_ICON_SIZE_MENU);
1542
 
    gtk_box_pack_start (GTK_BOX (box), icon, FALSE, FALSE, 0); */
1543
 
    progress = gtk_progress_bar_new ();
1544
 
    gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (progress),
1545
 
                                    PANGO_ELLIPSIZE_MIDDLE);
1546
 
    if ((uri = webkit_download_get_destination_uri (download)))
1547
 
    {
1548
 
        gchar* path = soup_uri_decode (uri);
1549
 
        gchar* filename = g_strrstr (path, "/") + 1;
1550
 
        gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress), filename);
1551
 
        g_free (path);
1552
 
    }
1553
 
    else
1554
 
        gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress),
1555
 
            webkit_download_get_suggested_filename (download));
1556
 
    sokoke_widget_get_text_size (progress, "M", &width, NULL);
1557
 
    gtk_widget_set_size_request (progress, width * 10, -1);
1558
 
    /* Avoid a bug in WebKit */
1559
 
    if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_CREATED)
1560
 
        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress),
1561
 
            webkit_download_get_progress (download));
1562
 
    gtk_box_pack_start (GTK_BOX (box), progress, FALSE, FALSE, 0);
1563
 
    icon = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU);
1564
 
    button = gtk_button_new ();
1565
 
    gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
1566
 
    gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE);
1567
 
    gtk_container_add (GTK_CONTAINER (button), icon);
1568
 
    gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
1569
 
    gtk_widget_show_all (box);
1570
 
    gtk_box_pack_start (GTK_BOX (browser->transferbar), box, FALSE, FALSE, 0);
1571
 
    gtk_widget_show (browser->transferbar_clear);
1572
 
 
1573
 
    g_signal_connect (download, "notify::progress",
1574
 
        G_CALLBACK (midori_browser_download_notify_progress_cb), progress);
1575
 
    g_signal_connect (download, "notify::status",
1576
 
        G_CALLBACK (midori_browser_download_notify_status_cb), button);
1577
 
    g_signal_connect (button, "clicked",
1578
 
        G_CALLBACK (midori_browser_download_button_clicked_cb), download);
1579
 
}
1580
 
 
1581
1423
 
1582
1424
static void
1583
1425
midori_view_download_save_as_response_cb (GtkWidget*      dialog,
1676
1518
#endif
1677
1519
 
1678
1520
static void
1679
 
midori_browser_transferbar_clear_clicked_cb (GtkWidget*     button,
1680
 
                                             MidoriBrowser* browser)
1681
 
{
1682
 
    GList* buttons;
1683
 
    guint i;
1684
 
    GtkWidget* item;
1685
 
 
1686
 
    buttons = gtk_container_get_children (GTK_CONTAINER (browser->transferbar));
1687
 
    i = 0;
1688
 
    while ((item = g_list_nth_data (buttons, i++)))
1689
 
        if (g_object_get_data (G_OBJECT (item), "done"))
1690
 
            gtk_widget_destroy (item);
1691
 
    g_list_free (buttons);
1692
 
    buttons = gtk_container_get_children (GTK_CONTAINER (browser->transferbar));
1693
 
    if (g_list_length (buttons) == 1)
1694
 
        gtk_widget_hide (browser->transferbar_clear);
1695
 
    g_list_free (buttons);
1696
 
}
1697
 
 
1698
 
static void
1699
1521
midori_view_search_text_cb (GtkWidget*     view,
1700
1522
                            gboolean       found,
1701
1523
                            gchar*         typing,
1919
1741
                             GdkEventAny* event)
1920
1742
{
1921
1743
    MidoriBrowser* browser = MIDORI_BROWSER (widget);
1922
 
    GList* children;
1923
 
    GtkWidget* dialog = NULL;
1924
 
    gboolean cancel = FALSE;
1925
 
 
1926
 
    children = gtk_container_get_children (GTK_CONTAINER (browser->transferbar));
1927
 
    if (g_list_length (children) > 1)
1928
 
    {
1929
 
        dialog = gtk_message_dialog_new (GTK_WINDOW (widget),
1930
 
            GTK_DIALOG_DESTROY_WITH_PARENT,
1931
 
            GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE,
1932
 
            _("Some files are being downloaded"));
1933
 
        gtk_window_set_title (GTK_WINDOW (dialog),
1934
 
            _("Some files are being downloaded"));
1935
 
        gtk_dialog_add_button (GTK_DIALOG (dialog),
1936
 
            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
1937
 
        gtk_dialog_add_button (GTK_DIALOG (dialog),
1938
 
            _("_Quit Midori"), GTK_RESPONSE_ACCEPT);
1939
 
        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
1940
 
            _("The transfers will be cancelled if Midori quits."));
1941
 
    }
1942
 
    g_list_free (children);
1943
 
    if (dialog != NULL)
1944
 
    {
1945
 
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
1946
 
            cancel = TRUE;
1947
 
        gtk_widget_destroy (dialog);
1948
 
    }
1949
 
 
1950
 
    return cancel;
 
1744
    return midori_transferbar_confirm_delete (MIDORI_TRANSFERBAR (browser->transferbar));
1951
1745
}
1952
1746
 
1953
1747
static void
6243
6037
    GtkRcStyle* rcstyle;
6244
6038
    GtkWidget* label;
6245
6039
    GtkWidget* scrolled;
6246
 
    GtkWidget* icon;
6247
6040
 
6248
6041
    browser->settings = midori_web_settings_new ();
6249
6042
    browser->proxy_array = katze_array_new (KATZE_TYPE_ARRAY);
6758
6551
    gtk_box_pack_start (GTK_BOX (browser->statusbar_contents),
6759
6552
                        browser->progressbar, FALSE, FALSE, 3);
6760
6553
 
6761
 
    browser->transferbar = gtk_hbox_new (FALSE, 0);
6762
 
    gtk_box_pack_start (GTK_BOX (browser->statusbar_contents),
6763
 
                        browser->transferbar, FALSE, FALSE, 3);
 
6554
    browser->transferbar = g_object_new (MIDORI_TYPE_TRANSFERBAR, NULL);
 
6555
    gtk_box_pack_start (GTK_BOX (browser->statusbar_contents), browser->transferbar, FALSE, FALSE, 3);
 
6556
    gtk_toolbar_set_show_arrow (GTK_TOOLBAR (browser->transferbar), FALSE);
6764
6557
    gtk_widget_show (browser->transferbar);
6765
 
    browser->transferbar_clear = gtk_button_new_with_label (_("Clear All"));
6766
 
    icon = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
6767
 
    gtk_button_set_image (GTK_BUTTON (browser->transferbar_clear), icon);
6768
 
    g_signal_connect (browser->transferbar_clear, "clicked",
6769
 
        G_CALLBACK (midori_browser_transferbar_clear_clicked_cb), browser);
6770
 
    gtk_box_pack_end (GTK_BOX (browser->transferbar), browser->transferbar_clear,
6771
 
                        FALSE, FALSE, 0);
 
6558
 
6772
6559
    g_signal_connect (browser->statusbar, "button-press-event",
6773
6560
        G_CALLBACK (midori_browser_menu_button_press_event_cb), browser);
6774
6561