All pastes #1719082 Raw Edit

C

public c v1 · immutable
#1719082 ·published 2009-12-18 03:57 UTC
rendered paste body
#include <gtk/gtk.h>#include <stdio.h>#include <stdlib.h>struct data { 	const char *row;	const char *item;	int qty;	float price;};static struct data row_data[] = {	{ "row0","item 12", 3, 4.3 },	{ "row1","item 23", 44,34.4},	{ "row2","item 33", 34,25.4},	{ "row3","item 43", 37,64.4},	{ "row4","item 53", 12,14.4},	{ "row5","item 68", 42,34.4},	{ "row6","item 75", 72,74.4},	{NULL}};static struct data row2_data[] = {	{"row7", "item 127", 105, 115.5},	{"row8","item 124", 117, 118.6},	{"row9", "item 123", 120, 121.73},	{NULL}};		static GtkTargetEntry tentry = {"text/plain",0,0 };void on_drag_data_get(	GtkWidget *widget, GdkDragContext *drag_context,			GtkSelectionData *sdata, guint info, guint time,			gpointer user_data){	GtkTreeIter iter;	GtkTreeModel *list_store;	GtkTreeSelection *selector;	printf("on_drag_data_get\n");	selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));	gtk_tree_selection_get_selected(selector,&list_store,&iter);	if(&iter == NULL) return;	GValue value={0,};	char *cptr;	int i;	i=0;	//for(i=0;i<4;i++){		gtk_tree_model_get_value(list_store,&iter,i,&value);		cptr = (gchar *) g_strdup_value_contents (&value);		printf("got - %s\n",cptr);		g_value_unset(&value);		gtk_selection_data_set_text(sdata,cptr,-1);		free(cptr);	//}}void on_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context,			gint x, gint y, GtkSelectionData *sdata, guint info,			guint time, gpointer user_data){	GtkTreeModel *list_store;		GtkTreeIter iter;	printf("on_drag_data_received\n");	/* Remove row from the source treeview */	GtkTreeSelection *selector;	selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(user_data));	gtk_tree_selection_get_selected(selector,&list_store,&iter);	gtk_list_store_remove(GTK_LIST_STORE(list_store),&iter);	/* Now add to the other treeview */	GtkTreeModel *list_store2;	GtkTreeIter iter2;	list_store2 = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));	gtk_list_store_append(GTK_LIST_STORE(list_store2),&iter2);	/* Hard code this for now */        gtk_list_store_set(GTK_LIST_STORE(list_store2),&iter2,			0,row_data[1].row,			1,row_data[1].item,			2,row_data[1].qty,			3,row_data[1].price,-1); 	/* lets just see what we got */	guchar *rx = gtk_selection_data_get_text(sdata);	if(rx){		printf("Received = %s\n",rx);		g_free(rx);	}}void on_selection_changed (GtkTreeSelection *treeselection,gpointer user_data){	GtkTreeIter iter;	GtkTreeModel *list_store;	printf("on_selection_changed: ");	gtk_tree_selection_get_selected(treeselection,		&list_store,&iter);		if(&iter==NULL)return;	if(list_store==NULL)return;	GValue value={0,};	char *cptr;	int i;	for(i=0;i<4;i++){		gtk_tree_model_get_value(list_store,&iter,i,&value);		cptr = (gchar *) g_strdup_value_contents (&value);		g_value_unset(&value);		if(cptr)printf("%s, ",cptr);		free(cptr);	}	printf("\n");}GtkWidget *add_treeview(GtkWidget *box, struct data array[], int size){	GtkWidget *swindow;	swindow = gtk_scrolled_window_new(NULL,NULL);	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow),		 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);		/* Add this window to the box */	    gtk_box_pack_start(GTK_BOX(box),                swindow,TRUE,TRUE,2);	/* Create the treeview and its list store */	GtkListStore *list_store;	list_store = gtk_list_store_new(4,		G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT,G_TYPE_FLOAT);	GtkWidget *tree_view;	tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));	/* Add the treeview to the scrolled window */	gtk_container_add(GTK_CONTAINER(swindow),tree_view);			/* Add the columns */	GtkCellRenderer *renderer;	GtkTreeViewColumn *column;		char column_names[4][20] = {		"Row #", "Description", "Qty", "Price"};	int i;	for(i=0;i<4;i++){		renderer = gtk_cell_renderer_text_new();		column = gtk_tree_view_column_new_with_attributes (			column_names[i],renderer,"text",i,NULL);		gtk_tree_view_column_set_sort_column_id (column, i);		gtk_tree_view_append_column (GTK_TREE_VIEW(tree_view), column);	}	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view),TRUE);	/* Add the data */	GtkTreeIter iter;	      for(i=0;i<size;i++){                gtk_list_store_append(list_store,&iter);                gtk_list_store_set(list_store,&iter,                        0,array[i].row,                        1,array[i].item,                        2,array[i].qty,                        3,array[i].price,-1);        }		g_signal_connect(		gtk_tree_view_get_selection (GTK_TREE_VIEW(tree_view)),		"changed",G_CALLBACK(on_selection_changed),NULL);	return tree_view;}int main(int argc, char **argv){	GtkWidget *window;        gtk_init(&argc,&argv);	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_window_set_default_size(GTK_WINDOW(window),666,266);	g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_exit),NULL);	GtkWidget *vbox = gtk_vbox_new(FALSE,10);		gtk_container_add(GTK_CONTAINER(window),vbox);	GtkWidget *title = gtk_label_new("Drag and Drop Between 2 Treeviews - C Port by Vikram Ambrose");	gtk_box_pack_start(GTK_BOX(vbox),title,FALSE,FALSE,1);	GtkWidget *hbox = gtk_hbox_new(TRUE,1);	gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,1);	GtkWidget *view1;	view1 = add_treeview(hbox,row_data,7);	gtk_drag_source_set(view1,GDK_BUTTON1_MASK, &tentry,1,                        GDK_ACTION_COPY|GDK_ACTION_MOVE);	g_signal_connect(view1,"drag-data-get",		G_CALLBACK(on_drag_data_get),NULL);	GtkWidget *view2;	view2 = add_treeview(hbox,row2_data,3);	gtk_drag_dest_set(view2,GTK_DEST_DEFAULT_ALL,&tentry,1,		GDK_ACTION_COPY|GDK_ACTION_MOVE); 	g_signal_connect(view2,"drag-data-received",		G_CALLBACK(on_drag_data_received),view1);	gtk_widget_show_all(window);        gtk_main();	return 0;}