/* extendedlayoutexample.c * Copyright (C) 2010 Openismus GmbH * * Author: * Tristan Van Berkom * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library. If not, see . */ #include typedef struct { const gchar *name; const gchar *tooltip; const gchar *interface; GtkWidget *window; } TestInterface; /* These strings were generated with: * * IFS=""; while read line; do echo -n \"; echo -n $line | sed -e 's|\"|\\"|g'; echo \"; done < file.glade */ static TestInterface interfaces[] = { { "Ellipsizing Labels", "Demonstrates how labels will request a natural size in a horizontal space", "" " " " " " " " 450" " 50" " " " " " horizontal" " True" " " " " " True" " Some labels do ellipsize" " end" " " " " " " " " " " " " " 0" " " " " " " " " " True" " but some" " end" " " " " " " " " " " " " " 1" " " " " " " " " " True" " do not at all" " " " " " " " " " " " " " " " 2" " " " " " " " " " " "", NULL }, { "Wrapping Label", "Demonstrates how a wrapping label can require a height contextual to its allocated width", "" " " " " " " " 12" " 300" " " " " " horizontal" " True" " True" " " " " " vertical" " True" " " " " " True" " A short static label." " " " " " " " " " " " 0" " " " " " " " " " Long label" " True" " " " " " True" " This is a really long label for the purpose of testing line wrapping is working correctly in conjunction with height-for-width support in GTK+" " True" " 30" " " " " " " " " " " " " " " " False" " 1" " " " " " " " " " True" " True" " True" " " " " " True" " A really really long label inside a button to demonstrate height for width working inside buttons" " True" " 25" " " " " " " " " " " " " " " " False" " 2" " " " " " " " " " False" " False" " " " " " " " " " True" " This static label\n" "can shrink." " center" " " " " " " " " " " " " " True" " True" " " " " " " " " " " "", NULL }, { "Horizontal Box", "Demonstrates how a horizontal box can calculate the collective height for an allocated width", "" " " " " " " " 200" " 600" " " " " " horizontal" " True" " True" " " " " " vertical" " True" " " " " " horizontal" " True" " " " " " True" " True" " True" " " " " " True" " A button that wraps." " True" " 10" " " " " " " " " " " " " " " " False" " 0" " " " " " " " " " True" " Lets try setting up some long text to wrap up in this hbox and see if the height-for-width is gonna work !" " True" " 30" " " " " " " " " " " " 1" " " " " " " " " " False" " 0" " " " " " " " " " A button that expands in the vbox" " True" " True" " True" " " " " " 1" " " " " " " " " " False" " False" " " " " " " " " " True" " This label is\n" "set to shrink inside\n" "the paned window." " center" " " " " " " " " " " " " " True" " True" " " " " " " " " " " "", NULL }, { "Vertical Labels", "Demonstrates how a horizontal box will consider width-for-height when allocating children " "even if the toplevel window is requested as height-for-width.", "" " " " " " " " 400" " 300" " " " " " vertical" " True" " True" " " " " " horizontal" " True" " " " " " True" " Some long width-for-height text that wraps" " center" " True" " 10" " 90" " " " " " " " " " " " " " False" " 0" " " " " " " " " " True" " 0" " out" " " " " " True" " Neither of the panes are\n" "set to shrink." " center" " " " " " " " " " " " " " " " " " " " " " 1" " " " " " " " " " False" " False" " " " " " " " " " horizontal" " True" " " " " " True" " 0" " out" " " " " " True" " The interface is allocated as height\n" "for width, but the horizontal boxes\n" "allocate in width for height mode." " " " " " " " " " " " " " " " " " " " " " 0" " " " " " " " " " True" " Some long width-for-height text that wraps" " center" " True" " 10" " 270" " " " " " " " " " " " " " False" " 1" " " " " " " " " " False" " False" " " " " " " " " " " "", NULL }, { "Label Parameters", "This test demonstrates how \"width-chars\" and \"max-width-chars\" can be used " "to effect minimum and natural widths in wrapping labels.", "" " " " " " " " 900" " " " " " horizontal" " True" " True" " " " " " vertical" " True" " " " " " horizontal" " True" " 6" " " " " " True" " The first 2 labels require 10 characters." " True" " 10" " " " " " " " " " " " " " False" " False" " 0" " " " " " " " " " True" " This label has a maximum natural width of 20 characters. The second two labels expand." " True" " 10" " 20" " " " " " " " " " " " " " True" " True" " 1" " " " " " " " " " True" " This label requires a default minimum size." " True" " " " " " " " " " " " " " 2" " " " " " " " " " 0" " " " " " " " " " True" " This test demonstrates how the \"width-chars\" and \"max-width-chars\"\n" "properties can be used to specify the minimum requested wrap width\n" "and the maximum natural wrap width respectively." " end" " 30" " " " " " " " " " " " " " 1" " " " " " " " " " False" " False" " " " " " " " " " True" " Some static\n" "text that shrinks.\n" "\n" "You will need to stretch\n" "this window quite wide\n" "to see the effects." " center" " " " " " " " " " " " True" " True" " " " " " " " " " " "", NULL }, { "Wrapping Expander", "This test demonstrates how the expander label can fill to its natural width " "and also trade height for width.", "" "" " " " " " " " 500" " " " " " horizontal" " True" " True" " " " " " True" " True" " " " " " True" " More wrapping text to fill the largish content area in the expander " " True" " 10" " " " " " " " " " " " " " " " " " True" " Here is some expander text that wraps" " True" " 10" " " " " " " " " " " " " " " " " " False" " False" " " " " " " " " " True" " static\n" "text\n" "here" " " " " " " " " " " " True" " True" " " " " " " " " " " "", NULL }, { "Wrapping Frame Label", "This test demonstrates how the frame label can fill to its natural width " "and also trade height for width.", "" "" " " " " " " " 400" " 150" " " " " " True" " 8" " 0" " " " " " True" " some content" " 12" " " " " " " " " " True" " A frame label that's a little long and wraps" " True" " True" " " " " " " " " " " "", NULL }, { "Combo Boxes and Menus", "This test shows wrapping and ellipsizing text in combo boxes (and consequently in menu items).", "" "" " " " " " " " 8" " 600" " " " " " horizontal" " True" " True" " " " " " vertical" " True" " 5" " " " " " horizontal" " True" " 5" " " " " " True" " this combo box" " " " " " " " " " " " " " True" " True" " 0" " " " " " " " " " True" " contains some wrapping locations" " end" " 10" " " " " " " " " " " " " " True" " True" " 1" " " " " " " " " " True" " liststore1" " 0" " " " " " " " 1" " " " " " " " " " purple" " 600" " word" " 100" " " " " " 0" " " " " " " " " " True" " True" " 2" " " " " " " " " " False" " True" " 0" " " " " " " " " " True" " 0" " " " " " True" " This test shows combo boxes\n" "requesting and allocating space\n" "for its backing content using\n" "height-for-width geometry\n" "management.\n" "\n" "Note this test also demonstrates\n" "height-for-width menu items." " center" " " " " " " " " " " " " " " " " " True" " True" " 1" " " " " " " " " " horizontal" " True" " 5" " " " " " True" " this combo box" " " " " " " " " " " " " " True" " True" " 0" " " " " " " " " " True" " contains some ellipsizing locations" " end" " 10" " " " " " " " " " " " " " True" " True" " 1" " " " " " " " " " True" " liststore1" " 0" " " " " " " " 1" " " " " " " " " " end" " orange" " 600" " 10" " " " " " 0" " " " " " " " " " True" " True" " 2" " " " " " " " " " False" " True" " 2" " " " " " " " " " True" " False" " " " " " " " " " True" " Some static\n" "text here\n" "that shrinks." " center" " " " " " " " " " " " False" " True" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " Montreal, Quebec Canada" " edit-undo" " " " " " Sao Paulo, SP Brazil" " edit-redo" " " " " " Buenos Aires, Argentina" " process-stop" " " " " " Los Angelos, California USA" " media-record" " " " " " Rio de Janeiro, RJ Brazil" " dialog-error" " " " " " Seoul, South Korea" " dialog-information" " " " " " " "", NULL }, }; static void test_clicked (GtkWidget *button, TestInterface *interface) { if (!interface->window) { GtkBuilder *builder = gtk_builder_new (); GError *error = NULL; gtk_builder_add_from_string (builder, interface->interface, -1, &error); if (error) { g_printerr ("GtkBuilder for interface \"%s\" returned error \"%s\"\n", interface->name, error->message); g_error_free (error); g_object_unref (builder); return; } interface->window = (GtkWidget *)gtk_builder_get_object (builder, "window"); g_signal_connect (interface->window, "delete_event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); g_object_unref (builder); } gtk_widget_show (interface->window); } static GtkWidget * create_window (void) { GtkWidget *window, *vbox, *button; gint i; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width (GTK_CONTAINER (window), 8); gtk_container_add (GTK_CONTAINER (window), vbox); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) { button = gtk_button_new_with_label (interfaces[i].name); gtk_widget_set_tooltip_text (button, interfaces[i].tooltip); g_signal_connect (button, "clicked", G_CALLBACK (test_clicked), &interfaces[i]); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); } return window; } static gboolean main_window_delete_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { gsize i; for (i = 0; i < G_N_ELEMENTS (interfaces); ++i) { if (interfaces[i].window) gtk_widget_destroy (interfaces[i].window); } gtk_widget_destroy (widget); gtk_main_quit (); return TRUE; } int main (int argc, char *argv[]) { GtkWidget *window; gtk_init (&argc, &argv); window = create_window (); g_signal_connect (window, "delete-event", G_CALLBACK (main_window_delete_cb), window); gtk_widget_show_all (window); gtk_main (); return 0; }