aboutsummaryrefslogblamecommitdiffstats
path: root/src/statusbar.c
blob: 8ac84cfb94ac1fd8df3a9c2c32799ce683924398 (plain) (tree)
































































































































































































































































































































                                                                                                       
/*
 *  Copyright (C) 2002 Jorn Baayen
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "statusbar.h"
#include "ephy-stock-icons.h"
#include "ephy-bonobo-extensions.h"

#include <string.h>
#include <time.h>
#include <gtk/gtkprogressbar.h>
#include <gtk/gtkeventbox.h>
#include <gtk/gtkimage.h>
#include <gtk/gtkframe.h>
#include <gtk/gtktooltips.h>
#include <bonobo/bonobo-window.h>
#include <bonobo/bonobo-control.h>

static void statusbar_class_init (StatusbarClass *klass);
static void statusbar_init (Statusbar *t);
static void statusbar_finalize (GObject *object);
static void
statusbar_set_property (GObject *object,
                        guint prop_id,
                        const GValue *value,
                        GParamSpec *pspec);
static void
statusbar_get_property (GObject *object,
                        guint prop_id,
                        GValue *value,
                        GParamSpec *pspec);
static void
statusbar_set_window (Statusbar *t, EphyWindow *window);

enum
{
    PROP_0,
    PROP_EPHY_WINDOW
};

static GObjectClass *parent_class = NULL;

struct StatusbarPrivate
{
    EphyWindow *window;
    BonoboUIComponent *ui_component;
    GtkWidget *security_icon;
    GtkWidget *progress;
    GtkTooltips *tooltips;
    GtkWidget *security_evbox;
    gboolean visibility;
};

GType 
statusbar_get_type (void)
{
        static GType statusbar_type = 0;

        if (statusbar_type == 0)
        {
                static const GTypeInfo our_info =
                {
                        sizeof (StatusbarClass),
                        NULL, /* base_init */
                        NULL, /* base_finalize */
                        (GClassInitFunc) statusbar_class_init,
                        NULL,
                        NULL, /* class_data */
                        sizeof (Statusbar),
                        0, /* n_preallocs */
                        (GInstanceInitFunc) statusbar_init
                };

                statusbar_type = g_type_register_static (G_TYPE_OBJECT,
                                 "Statusbar",
                                 &our_info, 0);
        }

        return statusbar_type;

}

static void
statusbar_class_init (StatusbarClass *klass)
{
        GObjectClass *object_class = G_OBJECT_CLASS (klass);

        parent_class = g_type_class_peek_parent (klass);

        object_class->finalize = statusbar_finalize;
    object_class->set_property = statusbar_set_property;
        object_class->get_property = statusbar_get_property;

    g_object_class_install_property (object_class,
                                         PROP_EPHY_WINDOW,
                                         g_param_spec_object ("EphyWindow",
                                                              "EphyWindow",
                                                              "Parent window",
                                                              EPHY_WINDOW_TYPE,
                                                              G_PARAM_READWRITE));
}

static void
statusbar_set_property (GObject *object,
                    guint prop_id,
                        const GValue *value,
                        GParamSpec *pspec)
{
        Statusbar *s = STATUSBAR (object);

        switch (prop_id)
        {
                case PROP_EPHY_WINDOW:
                        statusbar_set_window (s, g_value_get_object (value));
                        break;
        }
}

static void
statusbar_get_property (GObject *object,
                        guint prop_id,
                        GValue *value,
                        GParamSpec *pspec)
{
        Statusbar *s = STATUSBAR (object);

        switch (prop_id)
        {
                case PROP_EPHY_WINDOW:
                        g_value_set_object (value, s->priv->window);
                        break;
        }
}

static void
create_statusbar_security_icon (Statusbar *s)
{
    GtkWidget *security_frame;
    BonoboControl *control;

    security_frame = gtk_frame_new (NULL);
        gtk_frame_set_shadow_type (GTK_FRAME (security_frame),
                                   GTK_SHADOW_IN);

        s->priv->security_icon = gtk_image_new ();
        s->priv->security_evbox = gtk_event_box_new ();
        gtk_container_add (GTK_CONTAINER (security_frame),
                           GTK_WIDGET (s->priv->security_evbox));
        gtk_container_add (GTK_CONTAINER (s->priv->security_evbox),
                           GTK_WIDGET (s->priv->security_icon));
    /*
    g_signal_connect (G_OBJECT (security_eventbox),
                          "button_release_event",
                          GTK_SIGNAL_FUNC
                                (security_icon_button_release_cb), t);
                */

    control = bonobo_control_new (security_frame);
        bonobo_ui_component_object_set (s->priv->ui_component,
                                        "/status/SecurityIconWrapper",
                                        BONOBO_OBJREF (control),
                                        NULL);
    bonobo_object_unref (control);

    statusbar_set_security_state (s, FALSE, NULL);

        gtk_widget_show_all (security_frame);
}

static void
create_statusbar_progress (Statusbar *s)
{
    BonoboControl *control;

    s->priv->progress = gtk_progress_bar_new ();

    control = bonobo_control_new (s->priv->progress);
        bonobo_ui_component_object_set (s->priv->ui_component,
                                        "/status/ProgressWrapper",
                                        BONOBO_OBJREF (control),
                                        NULL);

    gtk_widget_show_all (s->priv->progress);
}

static void
statusbar_set_window (Statusbar *s, EphyWindow *window)
{
    g_return_if_fail (s->priv->window == NULL);

        s->priv->window = window;
        s->priv->ui_component = BONOBO_UI_COMPONENT
                                (s->priv->window->ui_component);

    create_statusbar_progress (s);
    create_statusbar_security_icon (s);
}

static void
statusbar_init (Statusbar *t)
{
        t->priv = g_new0 (StatusbarPrivate, 1);
    t->priv->visibility = TRUE;

    t->priv->tooltips = gtk_tooltips_new ();
}

static void
statusbar_finalize (GObject *object)
{
    Statusbar *t;

        g_return_if_fail (object != NULL);
        g_return_if_fail (IS_STATUSBAR (object));

    t = STATUSBAR (object);

        g_return_if_fail (t->priv != NULL);

    gtk_object_destroy (GTK_OBJECT (t->priv->tooltips));

        g_free (t->priv);

        G_OBJECT_CLASS (parent_class)->finalize (object);
}

Statusbar *
statusbar_new (EphyWindow *window)
{
    Statusbar *t;

    t = STATUSBAR (g_object_new (STATUSBAR_TYPE,
                     "EphyWindow", window,
                     NULL));

    g_return_val_if_fail (t->priv != NULL, NULL);

    return t;
}

void
statusbar_set_visibility (Statusbar *t,
              gboolean visibility)
{
    if (visibility == t->priv->visibility) return;

    t->priv->visibility = visibility;

    ephy_bonobo_set_hidden (BONOBO_UI_COMPONENT(t->priv->ui_component),
                                "/status",
                                !visibility);
}

void
statusbar_set_security_state (Statusbar *t,
                  gboolean state,
                  const char *tooltip)
{
    const char *stock;

    stock = state ? EPHY_STOCK_SECURE : EPHY_STOCK_UNSECURE;

        gtk_image_set_from_stock (GTK_IMAGE (t->priv->security_icon), stock,
                  GTK_ICON_SIZE_MENU);

    gtk_tooltips_set_tip (t->priv->tooltips, t->priv->security_evbox,
                  tooltip, NULL);
}

void
statusbar_set_progress (Statusbar *t,
            int progress)
{
    if (progress == -1)
    {
        gtk_progress_bar_pulse (GTK_PROGRESS_BAR(t->priv->progress));
    }
    else
    {
        float tmp;
        tmp = (float)(progress) / 100;
        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(t->priv->progress),
                           tmp);
    }
}

void
statusbar_set_message (Statusbar *s,
               const char *message)
{
    g_return_if_fail (BONOBO_IS_UI_COMPONENT(s->priv->ui_component));
    g_return_if_fail (message != NULL);

    /* Bonobo doesnt like 0 length messages */
    if (g_utf8_strlen (message, -1) == 0)
    {
        message = " ";
    }

    if (bonobo_ui_component_get_container (s->priv->ui_component)) /* should not do this here... */
    {
        bonobo_ui_component_set_status (s->priv->ui_component,
                        message,
                        NULL);
    }
}