On Wed, 2006-01-11 at 11:22 +0100, Philip Van Hoof wrote:
> On Tue, 2006-01-10 at 12:43 +0100, Philip Van Hoof wrote:
> Somebody cleaned up the page. I added some more documentation and
> explanation. For example about proxy classes and custom models.
>
> I also created a sample here: http://pastebin.com/500098
I updated the same, it now also actually works and has a IMsgHeader,
MsgHeader and MsgHeaderPrx just like how I explained it in the "Proxy"
solution section.
I attached it.
--
Philip Van Hoof, software developer at x-tend
home: me at pvanhoof dot be
gnome: pvanhoof at gnome dot org
work: vanhoof at x-tend dot be
http://www.pvanhoof.be - http://www.x-tend.be
#include <gtk/gtk.h>
static int ELEMENT_COUNT = 10000;
static int instantiations = 0;
static GtkWidget *window = NULL;
typedef struct _IMsgHeader IMsgHeader;
typedef struct _MsgHeader MsgHeader;
typedef struct _MsgHeaderPrx MsgHeaderPrx;
struct _IMsgHeader {
const gchar* (*get_from_func) (IMsgHeader *this);
const gint (*get_id_func) (IMsgHeader *this);
gint id;
};
struct _MsgHeader {
IMsgHeader parent;
gchar *from;
};
struct _MsgHeaderPrx {
IMsgHeader parent;
MsgHeader *real;
};
/* IMsgHeader (late binding like) impl */
const gint
imsg_header_get_id (IMsgHeader *this)
{
return this->get_id_func (this);
}
const gchar*
imsg_header_get_from (IMsgHeader *this)
{
return this->get_from_func (this);
}
/* Real subject impl */
MsgHeader*
msg_header_new (gint id)
{
MsgHeader *header = g_new0(MsgHeader, 1);
g_print ("Instantiation for id=%d (%d passed)\n!!",
id, instantiations);
instantiations++;
header->parent.id = id;
header->from = g_strdup ("A real IMsgHeader subject!");
return header;
}
/* Proxy impl */
const gchar*
msg_header_proxy_get_from (IMsgHeader *this_i)
{
MsgHeaderPrx *this = (MsgHeaderPrx*)this_i;
if (this->real == NULL)
this->real = msg_header_new (this->parent.id);
return this->real->from;
}
const gint
msg_header_proxy_get_id (IMsgHeader *this_i)
{
MsgHeaderPrx *this = (MsgHeaderPrx*)this_i;
if (this->real == NULL)
this->real = msg_header_new (this->parent.id);
return this->real->parent.id;
}
MsgHeaderPrx*
msg_header_proxy_new (gint id)
{
MsgHeaderPrx *header = g_new0(MsgHeaderPrx, 1);
header->parent.id = id;
header->parent.get_from_func = msg_header_proxy_get_from;
header->parent.get_id_func = msg_header_proxy_get_id;
header->real = NULL;
return header;
}
enum
{
COLUMN_NUMBER,
COLUMN_HEADER,
NUM_COLUMNS
};
static void
msg_header_treeview_destroy_model_item (gpointer data)
{
g_print ("Destroy\n");
}
static void
msg_header_treeview_get_model_item (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer data)
{
gint number;
IMsgHeader *header;
/* This function can call the getter on the item in the model.
* Such an item can be a proxy class (IMsgHeaderPrx), triggering
* this getter causes an instantiation (or getting it from a
* factory with a cache) of a real subject (a real MsgHeader).
*
* The proxy now reads the value from the real subject and
* returns it to fullfill the contract of the interface IMsgHeader.
*/
gtk_tree_model_get (tree_model, iter, COLUMN_HEADER, &header, -1);
g_print ("from=%s, %d\n", imsg_header_get_from (header),
imsg_header_get_id (header));
}
static GtkTreeModel *
create_model (void)
{
gint i = 0;
GtkListStore *store;
GtkTreeIter iter;
store = gtk_list_store_new (NUM_COLUMNS,
G_TYPE_INT,
G_TYPE_POINTER);
for (i = 0; i < ELEMENT_COUNT; i++)
{
MsgHeaderPrx *header = msg_header_proxy_new (i);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COLUMN_NUMBER, header->parent.id,
COLUMN_HEADER, header, -1);
}
return GTK_TREE_MODEL (store);
}
static void
add_columns (GtkTreeView *treeview)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkTreeModel *model = gtk_tree_view_get_model (treeview);
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("Number",
renderer,
"text",
COLUMN_NUMBER,
NULL);
gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
gtk_tree_view_column_set_fixed_width (column, 200);
gtk_tree_view_column_set_cell_data_func (column, renderer,
msg_header_treeview_get_model_item, NULL,
msg_header_treeview_destroy_model_item);
gtk_tree_view_append_column (treeview, column);
}
GtkWidget *
do_list_store (void)
{
if (!window)
{
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *sw;
GtkTreeModel *model;
GtkWidget *treeview;
/* create window, etc */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo");
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
gtk_container_set_border_width (GTK_CONTAINER (window), 8);
vbox = gtk_vbox_new (FALSE, 8);
gtk_container_add (GTK_CONTAINER (window), vbox);
label = gtk_label_new ("Bla Bla Bla");
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
GTK_SHADOW_ETCHED_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
g_print ("Create model\n");
/* create tree model */
model = create_model ();
g_print ("Create treeview\n");
/* create tree view */
treeview = gtk_tree_view_new_with_model (model);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW(treeview), TRUE);
g_object_unref (model);
gtk_container_add (GTK_CONTAINER (sw), treeview);
/* add columns to the tree view */
add_columns (GTK_TREE_VIEW (treeview));
/* finish & show */
gtk_window_set_default_size (GTK_WINDOW (window), 280, 250);
}
if (!GTK_WIDGET_VISIBLE (window))
gtk_widget_show_all (window);
else
{
gtk_widget_destroy (window);
window = NULL;
}
return window;
}
int main (int argc, char **argv)
{
GtkWindow *win;
gtk_init (&argc, &argv);
if (argc > 1)
{
ELEMENT_COUNT = atoi (argv[1]);
}
win = GTK_WINDOW(do_list_store ());
gtk_widget_show_all (GTK_WIDGET(win));
gtk_main();
}
_______________________________________________
maemo-developers mailing list
[email protected]
https://maemo.org/mailman/listinfo/maemo-developers