+ case CTRL_FILESELECT:
+ case CTRL_FONTSELECT:
+ {
+ GtkWidget *ww;
+ GtkRequisition req;
+ char *browsebtn =
+ (ctrl->generic.type == CTRL_FILESELECT ?
+ "Browse..." : "Change...");
+
+ gint percentages[] = { 75, 25 };
+ w = columns_new(4);
+ columns_set_cols(COLUMNS(w), 2, percentages);
+
+ if (ctrl->generic.label) {
+ ww = gtk_label_new(ctrl->generic.label);
+ columns_add(COLUMNS(w), ww, 0, 2);
+ columns_force_left_align(COLUMNS(w), ww);
+ gtk_widget_show(ww);
+ }
+
+ ww = gtk_entry_new();
+ gtk_widget_size_request(ww, &req);
+ gtk_widget_set_usize(ww, 10, req.height);
+ columns_add(COLUMNS(w), ww, 0, 1);
+ gtk_widget_show(ww);
+
+ ww = gtk_button_new_with_label(browsebtn);
+ columns_add(COLUMNS(w), ww, 1, 1);
+ gtk_widget_show(ww);
+ }
+ break;
+ case CTRL_LISTBOX:
+ if (ctrl->listbox.height == 0) {
+ w = gtk_option_menu_new();
+ } else {
+ GtkWidget *list;
+ list = gtk_list_new();
+ gtk_list_set_selection_mode(GTK_LIST(list),
+ (ctrl->listbox.multisel ?
+ GTK_SELECTION_MULTIPLE :
+ GTK_SELECTION_SINGLE));
+ w = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(w),
+ list);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w),
+ GTK_POLICY_NEVER,
+ GTK_POLICY_AUTOMATIC);
+ gtk_widget_show(list);
+
+ /*
+ * Adjust the height of the scrolled window to the
+ * minimum given by the height parameter.
+ *
+ * This piece of guesswork is a horrid hack based
+ * on looking inside the GTK 1.2 sources
+ * (specifically gtkviewport.c, which appears to be
+ * the widget which provides the border around the
+ * scrolling area). Anyone lets me know how I can
+ * do this in a way which isn't at risk from GTK
+ * upgrades, I'd be grateful.
+ */
+ {
+ int edge = GTK_WIDGET(list)->style->klass->ythickness;
+ gtk_widget_set_usize(w, 10,
+ 2*edge + (ctrl->listbox.height *
+ listitemheight));
+ }
+#if 1
+/* here is an example of a percentage-based tabbed list item */
+{ int i; for (i=0; i<10; i++) {
+ GtkWidget *listitem = gtk_list_item_new();
+ GtkWidget *cols = columns_new(4);
+ GtkWidget *label1 = gtk_label_new("left");
+ GtkWidget *label2 = gtk_label_new("right");
+ GList *itemlist;
+ static const gint percents[] = { 50, 50 };
+ columns_set_cols(COLUMNS(cols), 2, percents);
+ columns_add(COLUMNS(cols), label1, 0, 1);
+ columns_force_left_align(COLUMNS(cols), label1);
+ columns_add(COLUMNS(cols), label2, 1, 1);
+ columns_force_left_align(COLUMNS(cols), label2);
+ gtk_widget_show(label1);
+ gtk_widget_show(label2);
+ gtk_widget_show(cols);
+ gtk_container_add(GTK_CONTAINER(listitem), cols);
+ itemlist = g_list_append(NULL, listitem);
+ gtk_list_append_items(GTK_LIST(list), itemlist);
+ gtk_widget_show(listitem);
+} }
+#endif
+
+ if (ctrl->listbox.draglist) {
+ /*
+ * GTK doesn't appear to make it easy to
+ * implement a proper draggable list; so
+ * instead I'm just going to have to put an Up
+ * and a Down button to the right of the actual
+ * list box. Ah well.
+ */
+ GtkWidget *cols, *button;
+ static const gint percentages[2] = { 80, 20 };
+
+ cols = columns_new(4);
+ columns_set_cols(COLUMNS(cols), 2, percentages);
+ columns_add(COLUMNS(cols), w, 0, 1);
+ gtk_widget_show(w);
+ button = gtk_button_new_with_label("Up");
+ columns_add(COLUMNS(cols), button, 1, 1);
+ gtk_widget_show(button);
+ button = gtk_button_new_with_label("Down");
+ columns_add(COLUMNS(cols), button, 1, 1);
+ gtk_widget_show(button);
+
+ w = cols;
+ }
+
+ }
+ if (ctrl->generic.label) {
+ GtkWidget *label, *container;
+
+ label = gtk_label_new(ctrl->generic.label);
+
+ container = columns_new(4);
+ if (ctrl->listbox.percentwidth == 100) {
+ columns_add(COLUMNS(container), label, 0, 1);
+ columns_force_left_align(COLUMNS(container), label);
+ columns_add(COLUMNS(container), w, 0, 1);
+ } else {
+ gint percentages[2];
+ percentages[1] = ctrl->listbox.percentwidth;
+ percentages[0] = 100 - ctrl->listbox.percentwidth;
+ columns_set_cols(COLUMNS(container), 2, percentages);
+ columns_add(COLUMNS(container), label, 0, 1);
+ columns_force_left_align(COLUMNS(container), label);
+ columns_add(COLUMNS(container), w, 1, 1);
+ }
+ gtk_widget_show(label);
+ gtk_widget_show(w);
+
+ w = container;
+ }
+ break;