aboutsummaryrefslogblamecommitdiffstats
path: root/widgets/text/e-text-model-uri.c
blob: bd8dbb18e8b1a00ddf13f472f7b010b35ea99f31 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                                                           
                                                  





























































                                                                                             

                            
 



                                             
 
                       
 




                                                                                  
 


                                                       
 


                              
         
 
 






                                                     
 

                                
 
                                                          
 

                          
 





                                                             
                        
                                     
                 

                           

         

                               
 
                              








                                                                         
                                                  
























                                                                                   
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */

/* ETextModelURI - A Text Model w/ clickable URIs
 * Copyright (C) 2001 Ximian, Inc.
 *
 * Author: Jon Trowbridge <trow@gnu.org>
 *
 */

#include <config.h>
#include <ctype.h>
#include "e-text-model-uri.h"

static void e_text_model_uri_class_init (ETextModelURIClass *class);
static void e_text_model_uri_init (ETextModelURI *model);
static void e_text_model_uri_destroy (GtkObject *object);

static void objectify_uris (ETextModelURI *model);

static void e_text_model_uri_set_text (ETextModel *model, gchar *text);
static const gchar *e_text_model_uri_get_nth_object (ETextModel *model, gint);
static void e_text_model_uri_activate_nth_object (ETextModel *model, gint);

static GtkObject *parent_class;

GtkType
e_text_model_uri_get_type (void)
{
    static GtkType model_uri_type = 0;
    
    if (!model_uri_type) {
        GtkTypeInfo model_uri_info = {
            "ETextModelURI",
            sizeof (ETextModelURI),
            sizeof (ETextModelURIClass),
            (GtkClassInitFunc) e_text_model_uri_class_init,
            (GtkObjectInitFunc) e_text_model_uri_init,
            NULL, /* reserved_1 */
            NULL, /* reserved_2 */
            (GtkClassInitFunc) NULL
        };
        
        model_uri_type = gtk_type_unique (e_text_model_get_type (), &model_uri_info);
    }
    
    return model_uri_type;
}

static void
e_text_model_uri_class_init (ETextModelURIClass *klass)
{
    GtkObjectClass *object_class;
    ETextModelClass *model_class;

    object_class = (GtkObjectClass *) klass;
    model_class = E_TEXT_MODEL_CLASS (klass);

    parent_class = gtk_type_class (e_text_model_get_type ());

    object_class->destroy = e_text_model_uri_destroy;

    model_class->set_text = e_text_model_uri_set_text;
    model_class->get_nth_obj = e_text_model_uri_get_nth_object;
    model_class->activate_nth_obj = e_text_model_uri_activate_nth_object;
}

static void
e_text_model_uri_init (ETextModelURI *model)
{

}

static void
e_text_model_uri_destroy (GtkObject *object)
{
    if (GTK_OBJECT_CLASS (parent_class)->destroy)
        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);

}

static gchar *
extract_uri (gchar **in_str)
{
    gchar *s = *in_str;
    if (strncmp (s, "http://", 7) == 0) {
        gint periods=0;
        gchar *uri;

        s += 7;

        while (*s && (isalnum((gint) *s) || (*s == '.' && periods < 2))) {
            if (*s == '.')
                ++periods;
            ++s;
        }

        uri = g_strndup (*in_str, s - *in_str);
        *in_str = s;
        return uri;

    } else {
        *in_str = s+1;
        return NULL;
    }
}

static void
objectify_uris (ETextModelURI *model_uri)
{
    ETextModel *model = E_TEXT_MODEL (model_uri);
    gchar *new_text;
    gchar *src, *dest;
    GList *uris = NULL;

    if (model->text == NULL)
        return;

    new_text = g_new0 (gchar, strlen (model->text)+1);

    src = model->text;
    dest = new_text;

    while (*src) {
        gchar *uri_str;
        gchar *next = src;
        if ( (uri_str = extract_uri (&next)) ) {
            uris = g_list_append (uris, uri_str);
            *dest = '\1';
        } else {
            *dest = *src;
        }
        ++dest;
        src = next;
    }

    g_free (model->text);
    model->text = new_text;

    /* Leaking old list */
    model_uri->uris = uris;
}

static void
e_text_model_uri_set_text (ETextModel *model, gchar *text)
{
    if (E_TEXT_MODEL_CLASS(parent_class)->set_text)
        E_TEXT_MODEL_CLASS(parent_class)->set_text (model, text);

    objectify_uris (E_TEXT_MODEL_URI (model));
}

static const gchar *
e_text_model_uri_get_nth_object (ETextModel *model, gint i)
{
    return (const gchar *) g_list_nth_data (E_TEXT_MODEL_URI (model)->uris, i);
}

static void
e_text_model_uri_activate_nth_object (ETextModel *model, gint i)
{
    const gchar *obj_str;

    obj_str = e_text_model_get_nth_object (model, i);
    gnome_url_show (obj_str);
}

ETextModel *
e_text_model_uri_new (void)
{
    return E_TEXT_MODEL (gtk_type_new (e_text_model_uri_get_type ()));
}


/* $Id$ */