Thread: [gq-commit] gq/src input.c,1.38,1.39
Status: Beta
Brought to you by:
sur5r
From: <sta...@us...> - 2002-07-09 10:41:56
|
Update of /cvsroot/gqclient/gq/src In directory usw-pr-cvs1:/tmp/cvs-serv21608 Modified Files: input.c Log Message: * Added the change-displaytype-on-the-fly feature. This is how it works: - Right click on the label of an attribute in the browser - select the new displaytype from the pop-up menu - Enjoy (Watch out: some combinations of old/new displaytypes currently cause gq to crash. This requires changes to existing displaytypes scheduled for the near future) Index: input.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/input.c,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** input.c 18 Jun 2002 22:07:14 -0000 1.38 --- input.c 9 Jul 2002 10:41:52 -0000 1.39 *************** *** 236,239 **** --- 236,332 ---- } + static void change_dt(GtkWidget *menu_item, display_type_handler *new_h) + { + struct formfill *form = gtk_object_get_data(GTK_OBJECT(menu_item), + "formfill"); + + if (form && new_h) { + GByteArray *d; + GList *l, *newlist = NULL; + display_type_handler *old_h = form->dt_handler; + + /* printf("change displaytype of %s to %s\n", */ + /* form->attrname, new_h->name); */ + + /* walk the list of widgets */ + for ( l = form->widgetList ; l ; l = l->next) { + GtkWidget *w = (GtkWidget *) l->data; + if (!w) continue; + + /* retrieve "old" data */ + form->dt_handler = old_h; + d = old_h->get_data(form, w); + gtk_widget_destroy(w); + + /* create new widget */ + form->dt_handler = new_h; + w = new_h->get_widget(form, d, NULL, NULL); + + gtk_widget_show(w); + + gtk_object_set_data(GTK_OBJECT(w), + "formfill", form); + + gtk_box_pack_start(GTK_BOX(form->vbox), w, TRUE, TRUE, 0); + + /* insert into browser */ + newlist = g_list_append(newlist, w); + } + g_list_free(form->widgetList); + form->widgetList = newlist; + } + } + + static gboolean widget_button_press(GtkWidget *widget, + GdkEventButton *event, + struct formfill *form) + { + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + GtkWidget *menu_item, *menu, *label; + GtkWidget *root_menu; + GList *dt_list; + + root_menu = gtk_menu_item_new_with_label("Root"); + gtk_widget_show(root_menu); + menu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu); + + label = gtk_menu_item_new_with_label(_("Select display type")); + gtk_widget_set_sensitive(label, FALSE); + gtk_widget_show(label); + + gtk_menu_append(GTK_MENU(menu), label); + gtk_menu_set_title(GTK_MENU(menu), _("Select display type")); + + menu_item = gtk_tearoff_menu_item_new(); + gtk_menu_append(GTK_MENU(menu), menu_item); + gtk_widget_set_sensitive(menu_item, FALSE); + gtk_widget_show(menu_item); + + dt_list = get_selectable_displaytypes(); + while(dt_list) { + display_type_handler *h = + (display_type_handler *) dt_list->data; + + menu_item = gtk_menu_item_new_with_label(h->name); + gtk_object_set_data(GTK_OBJECT(menu_item), "formfill", form); + /* gtk_object_set_data(GTK_OBJECT(menu_item), "entry", entry); */ + gtk_menu_append(GTK_MENU(menu), menu_item); + gtk_signal_connect(GTK_OBJECT(menu_item), "activate", + GTK_SIGNAL_FUNC(change_dt), + (gpointer) h); + gtk_widget_show(menu_item); + + dt_list = dt_list->next; + } + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + event->button, event->time); + + return(TRUE); + } + return FALSE; + } + void build_or_update_inputform(GHashTable *hash, gboolean build) *************** *** 286,290 **** inputbox = gtk_entry_new(); gtk_widget_show(inputbox); ! gtk_object_set_data(GTK_OBJECT(inputbox), "displaytype", GINT_TO_POINTER(DISPLAYTYPE_DN)); gtk_table_attach(GTK_TABLE(target_table), inputbox, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); --- 379,383 ---- inputbox = gtk_entry_new(); gtk_widget_show(inputbox); ! gtk_table_attach(GTK_TABLE(target_table), inputbox, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); *************** *** 312,322 **** if (build || form->label == NULL) { /* attribute name */ ! form->label = label = gtk_label_new(form->attrname); ! gtk_misc_set_alignment(GTK_MISC(label), LABEL_JUSTIFICATION, .5); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(target_table), label, 0, 1, row, row + 1, ! GTK_FILL, 0, 0, 0); row_arrow = row; --- 405,433 ---- if (build || form->label == NULL) { + GtkWidget *l; /* attribute name */ ! ! l = gtk_label_new(form->attrname); ! gtk_misc_set_alignment(GTK_MISC(l), LABEL_JUSTIFICATION, .5); ! gtk_widget_show(l); ! ! form->label = label = gtk_event_box_new(); ! gtk_container_add(GTK_CONTAINER(label), l); ! ! if (form->dt_handler && form->dt_handler->selectable) { ! gtk_signal_connect(GTK_OBJECT(label), ! "button_press_event", ! GTK_SIGNAL_FUNC(widget_button_press), ! form); ! gtk_object_set_data(GTK_OBJECT(label), ! "row", GINT_TO_POINTER(row)); ! } ! gtk_widget_show(label); gtk_table_attach(GTK_TABLE(target_table), label, 0, 1, row, row + 1, ! GTK_FILL|GTK_EXPAND, ! GTK_FILL|GTK_EXPAND, ! 0, 0); row_arrow = row; *************** *** 363,372 **** hash); /* printf("creating widget %08x\n", widget); */ gtk_widget_show(widget); gtk_object_set_data(GTK_OBJECT(widget), "formfill", form); - gtk_object_set_data(GTK_OBJECT(widget), "displaytype", - GINT_TO_POINTER(form->displaytype)); gtk_box_pack_start(GTK_BOX(form->vbox), widget, TRUE, TRUE, 0); --- 474,482 ---- hash); /* printf("creating widget %08x\n", widget); */ + gtk_widget_show(widget); gtk_object_set_data(GTK_OBJECT(widget), "formfill", form); gtk_box_pack_start(GTK_BOX(form->vbox), widget, TRUE, TRUE, 0); |