' *****************************************************
' PROGRAM:      butbox.bac
' PURPOSE:      demo of buttons using gtk
' AUTHOR:               FB2BaCon James C. Fuller, 2010
'                       C2FB by TinyCla, 2006
' DEPENDS:      gcc, bacon, bash
' PLATFORM:     Puppy Linux(actually, any *nix)
' DATE:         25-10-2010
' *****************************************************

' *********************
' CONSTANTS
' *********************

CONST gtk_LIB$ = "libgtk-x11-2.0.so"
CONST glib_LIB$ = "libglib-2.0.so"
CONST gobject_LIB$ = "libgobject-2.0.so"
CONST GTK_WINDOW_TOPLEVEL = 0
CONST GTK_BUTTONBOX_SPREAD = 1
CONST GTK_BUTTONBOX_EDGE = 2
CONST GTK_BUTTONBOX_START = 3
CONST GTK_BUTTONBOX_END = 4

' *********************
' END CONSTANTS
' *********************


' *********************
' IMPORTS
' *********************

IMPORT "gtk_init(int*,void*)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_window_new(int)" FROM gtk_LIB$ TYPE long
IMPORT "gtk_window_set_title(long,char*)" FROM gtk_LIB$ TYPE void
IMPORT "g_signal_connect_data(long,char*,void*,long,long,int)" FROM "libgobject-2.0.so.0" TYPE void
IMPORT "gtk_main_quit(void)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_widget_show(long)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_main" FROM gtk_LIB$ TYPE void
IMPORT "gtk_container_set_border_width(long,int)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_vbox_new(int,int)" FROM gtk_LIB$ TYPE long
IMPORT "gtk_container_add(long,long)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_frame_new(char*)" FROM gtk_LIB$ TYPE long
IMPORT "gtk_box_pack_start(long,long,int,int,int)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_hbox_new(int,int)" FROM gtk_LIB$ TYPE long
IMPORT "gtk_widget_show_all(long)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_hbutton_box_new" FROM gtk_LIB$ TYPE long
IMPORT "gtk_vbutton_box_new" FROM gtk_LIB$ TYPE long
IMPORT "gtk_button_box_set_layout(long,int)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_box_set_spacing(long,int)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_button_box_set_child_size(long,int,int)" FROM gtk_LIB$ TYPE void
IMPORT "gtk_button_new_from_stock(char*)" FROM gtk_LIB$ TYPE long

' *********************
' END IMPORTS
' *********************


' *********************
' SUB & FUNCTIONS
' *********************

'-----------------
FUNCTION CREATE_BBOX(NUMBER horizontal, STRING title, NUMBER spacing, NUMBER child_w, NUMBER child_h, NUMBER layout)
'-----------------
        LOCAL frame, bbox, button
        frame = gtk_frame_new(title)
        IF horizontal > 0 THEN
                bbox = gtk_hbutton_box_new()
        ELSE
                bbox = gtk_vbutton_box_new()
        END  IF
        gtk_container_set_border_width(bbox, 5)
        gtk_container_add(frame, bbox)
        ' Set the appearance of the button box
        gtk_button_box_set_layout(bbox, layout)
        gtk_box_set_spacing(bbox, spacing)
        gtk_button_box_set_child_size(bbox, child_w, child_h)
        button = gtk_button_new_from_stock("gtk-ok")
        gtk_container_add(bbox, button)
        button = gtk_button_new_from_stock("gtk-cancel")
        gtk_container_add(bbox, button)
        button = gtk_button_new_from_stock("gtk-help")
        gtk_container_add(bbox, button)
        RETURN frame
END FUNCTION

'-----------------
SUB BACMAIN()
'-----------------
        LOCAL win, main_vbox, vbox,hbox, frame_horz, frame_vert
        gtk_init(0, 0)
        win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
        gtk_window_set_title(win, "Button Boxes")
        g_signal_connect_data(win, "destroy", gtk_main_quit, 0, 0, 0)  
        gtk_container_set_border_width(win, 10)
        main_vbox = gtk_vbox_new(0, 0)
        gtk_container_add(win, main_vbox)
        frame_horz = gtk_frame_new("Horizontal Button Boxes")
        gtk_box_pack_start(main_vbox, frame_horz, 1, 1, 10)
        vbox = gtk_vbox_new(0, 0)
        gtk_container_set_border_width(vbox,10)
        gtk_container_add(frame_horz,vbox)
        gtk_box_pack_start(vbox, CREATE_BBOX(TRUE, "Spread (spacing 40)", 40, 85, 20, GTK_BUTTONBOX_SPREAD), TRUE, TRUE, 0)
        gtk_box_pack_start(vbox, CREATE_BBOX(TRUE, "Edge (spacing 30)", 30, 85, 20, GTK_BUTTONBOX_EDGE), TRUE, TRUE, 5)
        gtk_box_pack_start(vbox, CREATE_BBOX(TRUE, "Start (spacing 20)", 20, 85, 20, GTK_BUTTONBOX_START), TRUE, TRUE, 5)      
        gtk_box_pack_start(vbox, CREATE_BBOX(TRUE, "End (spacing 10)", 10, 85, 20, GTK_BUTTONBOX_END), TRUE, TRUE, 5)
        frame_vert = gtk_frame_new("Vertical Button Boxes")
        gtk_box_pack_start(main_vbox, frame_vert, TRUE, TRUE, 10)      
        hbox = gtk_hbox_new(FALSE, 0)
        gtk_container_set_border_width(hbox, 10)
        gtk_container_add(frame_vert, hbox)
        gtk_box_pack_start(hbox, CREATE_BBOX(FALSE, "Spread (spacing 5)", 5, 85, 20, GTK_BUTTONBOX_SPREAD), TRUE, TRUE, 0)      
        gtk_box_pack_start(hbox, CREATE_BBOX(FALSE, "Edge (spacing 30)", 30, 85, 20, GTK_BUTTONBOX_EDGE), TRUE, TRUE, 5)        
        gtk_box_pack_start(hbox, CREATE_BBOX(FALSE, "Start (spacing 20)", 20, 85, 20, GTK_BUTTONBOX_START), TRUE, TRUE, 5)      
        gtk_box_pack_start(hbox, CREATE_BBOX(FALSE, "End (spacing 20)", 20, 85, 20, GTK_BUTTONBOX_END), TRUE, TRUE, 5)
        gtk_widget_show_all(win)
        ' Enter the event loop
        gtk_main()
END SUB

' *********************
' END SUBS & FUNCTIONS
' *********************


' *********************
' MAIN
' *********************

BACMAIN
END

' *********************
' END MAIN
' *********************