aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-subset.c
blob: 1cac0f88ea776eae267068793ca0ee1be16e72a9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137# ex:ts=8
# Ports collection makefile for:    libassa
# Date created:         Dec 24, 2003
# Whom:             ijliao
#
# $FreeBSD$
#

PORTNAME=   libassa
PORTVERSION=    3.3.0
CATEGORIES= devel
MASTER_SITES=   ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}

MAINTAINER= ports@FreeBSD.org
COMMENT=    An C++ networking library and application framework

USE_GNOME=  gnomehack gnometarget pkgconfig
USE_REINPLACE=  yes
USE_LIBTOOL_VER=    15
CONFIGURE_ARGS= --disable-html-docs --disable-static
INSTALLS_SHLIB= yes

post-patch:
    @${REINPLACE_CMD} -e '/^SUBDIRS/s: doc : :g' ${WRKSRC}/Makefile.in

.include <bsd.port.mk>
href='#n204'>204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 * E-table-subset.c: Implements a table that contains a subset of another table.
 *
 * Author:
 *   Miguel de Icaza (miguel@gnu.org)
 *
 * (C) 1999 Helix Code, Inc.
 */
#include <config.h>
#include <stdlib.h>
#include <gtk/gtksignal.h>
#include "e-util/e-util.h"
#include "e-table-subset.h"

#define PARENT_TYPE E_TABLE_MODEL_TYPE

static ETableModelClass *etss_parent_class;

static void
etss_destroy (GtkObject *object)
{
    ETableSubset *etss = E_TABLE_SUBSET (object);

    if (etss->source)
        gtk_object_unref (GTK_OBJECT (etss->source));

    gtk_signal_disconnect (GTK_OBJECT (etss->source),
                   etss->table_model_pre_change_id);
    gtk_signal_disconnect (GTK_OBJECT (etss->source),
                   etss->table_model_changed_id);
    gtk_signal_disconnect (GTK_OBJECT (etss->source),
                   etss->table_model_row_changed_id);
    gtk_signal_disconnect (GTK_OBJECT (etss->source),
                   etss->table_model_cell_changed_id);

    etss->table_model_pre_change_id = 0;
    etss->table_model_changed_id = 0;
    etss->table_model_row_changed_id = 0;
    etss->table_model_cell_changed_id = 0;

    g_free (etss->map_table);

    GTK_OBJECT_CLASS (etss_parent_class)->destroy (object);
}

static int
etss_column_count (ETableModel *etm)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_column_count (etss->source);
}

static int
etss_row_count (ETableModel *etm)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return etss->n_map;
}

static void *
etss_value_at (ETableModel *etm, int col, int row)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_value_at (etss->source, col, etss->map_table [row]);
}

static void
etss_set_value_at (ETableModel *etm, int col, int row, const void *val)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_set_value_at (etss->source, col, etss->map_table [row], val);
}

static gboolean
etss_is_cell_editable (ETableModel *etm, int col, int row)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_is_cell_editable (etss->source, col, etss->map_table [row]);
}

static void
etss_append_row (ETableModel *etm, ETableModel *source, int row)
{
    ETableSubset *etss = (ETableSubset *)etm;
    e_table_model_append_row (etss->source, source, row);
}

static void *
etss_duplicate_value (ETableModel *etm, int col, const void *value)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_duplicate_value (etss->source, col, value);
}

static void
etss_free_value (ETableModel *etm, int col, void *value)
{
    ETableSubset *etss = (ETableSubset *)etm;

    e_table_model_free_value (etss->source, col, value);
}

static void *
etss_initialize_value (ETableModel *etm, int col)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_initialize_value (etss->source, col);
}

static gboolean
etss_value_is_empty (ETableModel *etm, int col, const void *value)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_value_is_empty (etss->source, col, value);
}

static char *
etss_value_to_string (ETableModel *etm, int col, const void *value)
{
    ETableSubset *etss = (ETableSubset *)etm;

    return e_table_model_value_to_string (etss->source, col, value);
}

static void
etss_class_init (GtkObjectClass *klass)
{
    ETableModelClass *table_class = (ETableModelClass *) klass;

    etss_parent_class = gtk_type_class (PARENT_TYPE);
    
    klass->destroy = etss_destroy;

    table_class->column_count     = etss_column_count;
    table_class->row_count        = etss_row_count;
    table_class->value_at         = etss_value_at;
    table_class->set_value_at     = etss_set_value_at;
    table_class->is_cell_editable = etss_is_cell_editable;
    table_class->append_row       = etss_append_row;
    table_class->duplicate_value  = etss_duplicate_value;
    table_class->free_value       = etss_free_value;
    table_class->initialize_value = etss_initialize_value;
    table_class->value_is_empty   = etss_value_is_empty;
    table_class->value_to_string  = etss_value_to_string;
}

E_MAKE_TYPE(e_table_subset, "ETableSubset", ETableSubset, etss_class_init, NULL, PARENT_TYPE);

static void
etss_proxy_model_pre_change (ETableModel *etm, ETableSubset *etss)
{
    e_table_model_pre_change (E_TABLE_MODEL (etss));
}

static void
etss_proxy_model_changed (ETableModel *etm, ETableSubset *etss)
{
    e_table_model_changed (E_TABLE_MODEL (etss));
}

static void
etss_proxy_model_row_changed (ETableModel *etm, int row, ETableSubset *etss)
{
    const int n = etss->n_map;
    const int * const map_table = etss->map_table;
    int i;
        
    for (i = 0; i < n; i++){
        if (map_table [i] == row){
            e_table_model_row_changed (E_TABLE_MODEL (etss), i);
            return;
        }
    }
}

static void
etss_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETableSubset *etss)
{
    const int n = etss->n_map;
    const int * const map_table = etss->map_table;
    int i;
        
    for (i = 0; i < n; i++){
        if (map_table [i] == row){
            e_table_model_cell_changed (E_TABLE_MODEL (etss), col, i);
            return;
        }
    }
}

ETableModel *
e_table_subset_construct (ETableSubset *etss, ETableModel *source, int nvals)
{
    unsigned int *buffer;
    int i;

    buffer = (unsigned int *) g_malloc (sizeof (unsigned int) * nvals);
    if (buffer == NULL)
        return NULL;
    etss->map_table = buffer;
    etss->n_map = nvals;
    etss->source = source;
    gtk_object_ref (GTK_OBJECT (source));
    
    /* Init */
    for (i = 0; i < nvals; i++)
        etss->map_table [i] = i;

    etss->table_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "model_pre_change",
                                  GTK_SIGNAL_FUNC (etss_proxy_model_pre_change), etss);
    etss->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed",
                             GTK_SIGNAL_FUNC (etss_proxy_model_changed), etss);
    etss->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed",
                             GTK_SIGNAL_FUNC (etss_proxy_model_row_changed), etss);
    etss->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
                              GTK_SIGNAL_FUNC (etss_proxy_model_cell_changed), etss);
    
    return E_TABLE_MODEL (etss);
}

ETableModel *
e_table_subset_new (ETableModel *source, const int nvals)
{
    ETableSubset *etss = gtk_type_new (E_TABLE_SUBSET_TYPE);

    if (e_table_subset_construct (etss, source, nvals) == NULL){
        gtk_object_destroy (GTK_OBJECT (etss));
        return NULL;
    }

    return (ETableModel *) etss;
}

ETableModel *
e_table_subset_get_toplevel (ETableSubset *table)
{
    g_return_val_if_fail (table != NULL, NULL);
    g_return_val_if_fail (E_IS_TABLE_SUBSET (table), NULL);

    if (E_IS_TABLE_SUBSET (table->source))
        return e_table_subset_get_toplevel (E_TABLE_SUBSET (table->source));
    else
        return table->source;
}