static void on_control_dialog_ok (GtkWidget *widget, GbWidgetNewData *data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeIter iter; GtkWidget *dialog; GtkTreeSelection *selection; char *moniker; GtkWidget *new_widget; dialog = gtk_widget_get_toplevel (widget); view = g_object_get_data (G_OBJECT (dialog), "tree_view"); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); gtk_tree_selection_get_selected (selection, &model, &iter); gtk_tree_model_get (model, &iter, COL_OBJID, &moniker, -1); new_widget = control_create (data, moniker, widget_get_uic (data->parent)); if (new_widget) { gb_widget_initialize (new_widget, data); data->callback (new_widget, data); } else { glade_util_show_message_box (_("Couldn't create the Bonobo control"), NULL); } gtk_widget_destroy (dialog); }
/* This updates the box size to the given value, adding placeholders or deleting widgets as necessary. */ void gb_box_set_size (GtkWidget * widget, gint size) { GtkWidget *new_child; gint current_size = g_list_length (GTK_BOX (widget)->children); gint i; if (current_size < size) { /* This avoids any problems with redrawing the selection. */ editor_clear_selection (NULL); for (i = 0; i < size - current_size; i++) { if (GTK_IS_BUTTON_BOX (widget)) { new_child = gb_widget_new ("GtkButton", widget); GTK_WIDGET_SET_FLAGS (new_child, GTK_CAN_DEFAULT); gtk_box_pack_start (GTK_BOX (widget), new_child, TRUE, TRUE, 0); tree_add_widget (new_child); } else { new_child = editor_new_placeholder (); gtk_box_pack_start (GTK_BOX (widget), new_child, TRUE, TRUE, 0); } } } else if (current_size > size) { GList *children, *elem; GtkWidget *child; gchar *error = NULL; /* Get a list of children in the order they appear in the box, start at the end and move backwards until we find a widget that can be destroyed. If we can't find any, show a message box. */ children = gtk_container_get_children (GTK_CONTAINER (widget)); elem = g_list_last (children); while (elem) { child = elem->data; error = editor_can_delete_widget (child); if (!error) { gtk_container_remove (GTK_CONTAINER (widget), child); current_size--; if (current_size == size) break; } elem = elem->prev; } g_list_free (children); if (current_size > size) { glade_util_show_message_box (error ? error : _("Can't delete any children."), widget); } } }