aboutsummaryrefslogblamecommitdiffstats
path: root/addressbook/gui/widgets/gal-view-minicard.c
blob: 764c0edfe0c99d60d5c6dbd704ecff1bf9358002 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                           
 
                          


                                       
                               
 

                              
                                        
              


                                                    
           

                                             
 
                    

                                          

                                                          
                                                                                                                                                       

                                


           

                                             
 


                      


                                                                                                                            
                                        
                                        
                        
























                                                         
                                   
 
                                      
 
                                                                        

                                                  




                             
                                                   

                                                          








                                                                                      


           
                                                              

                                                                     
                                                                         
 
                                                                        






                                                                        
                                                                        


           
                                                  
 


                                  

                                              













                                                               
                                                                                                



















                                                                
     

                                        



                                                
                                                      







                                                                      
                  

                                                                                         



                    

           
                                                                                  
 
                                                                                                                     



                                           
                                                                                                 



                                                 
 
                                                                     
                                                                    



                                                                                         


    
                                                                       
 
                                                                                  

                                        
                          
 
                                  
 
                                 
                                                         
                            
 
                                            
                                                                    
                                                                                  




                                                
                               
                       
                                                 

                                                                                 
                                                       
         
                                    
                          
 
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 * gal-view-minicard.c: An Minicard View
 *
 * Authors:
 *   Chris Lahey <clahey@ximian.com>
 *
 * (C) 2000, 2001 Ximian, Inc.
 */
#include <config.h>

#include <libxml/parser.h>

#include <libedataserver/e-xml-utils.h>

#include <e-util/e-xml-utils.h>

#include "gal-view-minicard.h"

#define PARENT_TYPE gal_view_get_type ()
#define d(x) x

static GalViewClass *gal_view_minicard_parent_class;

static void
gal_view_minicard_load (GalView *view,
            const char *filename)
{
    xmlDoc *doc;

    doc = e_xml_parse_file (filename);
    if (doc) {
        xmlNode *root = xmlDocGetRootElement(doc);
        GAL_VIEW_MINICARD (view)->column_width = e_xml_get_double_prop_by_name_with_default (root, (const unsigned char *)"column_width", 150);
        xmlFreeDoc(doc);
    }
}

static void
gal_view_minicard_save (GalView *view,
            const char *filename)
{
    xmlDoc *doc;
    xmlNode *root;

    doc = xmlNewDoc((const unsigned char *)"1.0");
    root = xmlNewNode (NULL, (const unsigned char *)"EMinicardViewState");
    e_xml_set_double_prop_by_name (root, (const unsigned char *)"column_width", GAL_VIEW_MINICARD (view)->column_width);
    xmlDocSetRootElement(doc, root);
    e_xml_save_file (filename, doc);
    xmlFreeDoc(doc);
}

static const char *
gal_view_minicard_get_title       (GalView *view)
{
    return GAL_VIEW_MINICARD(view)->title;
}

static void
gal_view_minicard_set_title       (GalView *view,
                 const char *title)
{
    g_free(GAL_VIEW_MINICARD(view)->title);
    GAL_VIEW_MINICARD(view)->title = g_strdup(title);
}

static const char *
gal_view_minicard_get_type_code (GalView *view)
{
    return "minicard";
}

static GalView *
gal_view_minicard_clone       (GalView *view)
{
    GalViewMinicard *gvm, *new;

    gvm = GAL_VIEW_MINICARD(view);

    new               = g_object_new (GAL_TYPE_VIEW_MINICARD, NULL);
    new->title        = g_strdup (gvm->title);
    new->column_width = gvm->column_width;

    return GAL_VIEW(new);
}

static void
gal_view_minicard_dispose         (GObject *object)
{
    GalViewMinicard *view = GAL_VIEW_MINICARD(object);

    if (view->title != NULL) {
        gal_view_minicard_detach (view);
        g_free(view->title);
        view->title = NULL;
    }

    if (G_OBJECT_CLASS (gal_view_minicard_parent_class)->dispose)
        (* G_OBJECT_CLASS (gal_view_minicard_parent_class)->dispose) (object);
}

static void
gal_view_minicard_class_init      (GObjectClass *object_class)
{
    GalViewClass *gal_view_class  = GAL_VIEW_CLASS(object_class);
    gal_view_minicard_parent_class  = g_type_class_ref (PARENT_TYPE);

    gal_view_class->edit          = NULL                   ;
    gal_view_class->load          = gal_view_minicard_load         ;
    gal_view_class->save          = gal_view_minicard_save         ;
    gal_view_class->get_title     = gal_view_minicard_get_title    ;
    gal_view_class->set_title     = gal_view_minicard_set_title    ;
    gal_view_class->get_type_code = gal_view_minicard_get_type_code;
    gal_view_class->clone         = gal_view_minicard_clone        ;

    object_class->dispose         = gal_view_minicard_dispose      ;
}

static void
gal_view_minicard_init      (GalViewMinicard *gvm)
{
    gvm->title = NULL;
    gvm->column_width = 150.0;

    gvm->emvw = NULL;
    gvm->emvw_column_width_changed_id = 0;
}

/**
 * gal_view_minicard_new
 * @title: The name of the new view.
 *
 * Returns a new GalViewMinicard.  This is primarily for use by
 * GalViewFactoryMinicard.
 *
 * Returns: The new GalViewMinicard.
 */
GalView *
gal_view_minicard_new (const gchar *title)
{
    return gal_view_minicard_construct (g_object_new (GAL_TYPE_VIEW_MINICARD, NULL), title);
}

/**
 * gal_view_minicard_construct
 * @view: The view to construct.
 * @title: The name of the new view.
 *
 * constructs the GalViewMinicard.  To be used by subclasses and
 * language bindings.
 *
 * Returns: The GalViewMinicard.
 */
GalView *
gal_view_minicard_construct  (GalViewMinicard *view,
                  const gchar *title)
{
    view->title = g_strdup(title);
    return GAL_VIEW(view);
}

GType
gal_view_minicard_get_type        (void)
{
    static GType type = 0;

    if (!type) {
        static const GTypeInfo info =  {
            sizeof (GalViewMinicardClass),
            NULL,           /* base_init */
            NULL,           /* base_finalize */
            (GClassInitFunc) gal_view_minicard_class_init,
            NULL,           /* class_finalize */
            NULL,           /* class_data */
            sizeof (GalViewMinicard),
            0,             /* n_preallocs */
            (GInstanceInitFunc) gal_view_minicard_init,
        };

        type = g_type_register_static (PARENT_TYPE, "GalViewMinicard", &info, 0);
    }

    return type;
}

static void
column_width_changed (EMinicardViewWidget *w, double width, EABView *address_view)
{
    GalViewMinicard *view = GAL_VIEW_MINICARD (gal_view_instance_get_current_view (address_view->view_instance));
    GtkScrolledWindow *scrolled_window;
    GtkAdjustment *adj;
    GtkAdjustment *adj_new;

    d(g_print("%s: Old width = %f, New width = %f\n", G_STRFUNC, view->column_width, width));
    if (view->column_width != width) {
        view->column_width = width;
        gal_view_changed(GAL_VIEW(view));
    }

    scrolled_window = GTK_SCROLLED_WINDOW (address_view->widget);
    adj = gtk_scrolled_window_get_hadjustment (scrolled_window);
    adj_new = GTK_ADJUSTMENT (gtk_adjustment_new (adj->value, adj->lower, adj->upper,
                             adj->page_size, adj->page_increment,
                             adj->page_size));
    gtk_scrolled_window_set_hadjustment (scrolled_window, adj_new);
}

void
gal_view_minicard_attach (GalViewMinicard *view, EABView *address_view)
{
    EMinicardViewWidget *emvw = E_MINICARD_VIEW_WIDGET (address_view->object);
    gal_view_minicard_detach (view);

    view->emvw = emvw;

    g_object_ref (view->emvw);

    g_object_set (view->emvw,
              "column_width", view->column_width,
              NULL);

    view->emvw_column_width_changed_id =
        g_signal_connect(view->emvw, "column_width_changed",
                 G_CALLBACK (column_width_changed), address_view);
}

void
gal_view_minicard_detach (GalViewMinicard *view)
{
    if (view->emvw == NULL)
        return;
    if (view->emvw_column_width_changed_id) {
        g_signal_handler_disconnect (view->emvw,
                         view->emvw_column_width_changed_id);
        view->emvw_column_width_changed_id = 0;
    }
    g_object_unref (view->emvw);
    view->emvw = NULL;
}