--- /dev/null
+open Utils
+open Property
+
+open TiBase
+open TiContainer
+
+(* the button inherits from widget because it can't accept
+ a child;
+ needs to add the border_width property *)
+class tibutton ~(widget : #GButton.button) ~name ~parent_tree ~pos
+ ?(insert_evbox=true) parent_window =
+object(self)
+ val button = widget
+ inherit tiwidget ~name ~widget ~parent_tree ~pos ~insert_evbox
+ parent_window as widget
+
+ method private class_name = "GButton.button"
+
+ method private get_mandatory_props = [ "label" ]
+
+ initializer
+ classe <- "button";
+ proplist <- proplist @
+ [ "border_width", new prop_int ~name:"border_width" ~init:"0"
+ ~set:(ftrue button#set_border_width);
+ "label",
+ new prop_string ~name:"label" ~init:name ~set:
+ begin fun v ->
+ button#remove (List.hd button#children)#coerce;
+ GMisc.label ~text:v ~xalign:0.5 ~yalign:0.5 ~packing:button#add ();
+ true
+ end ]
+end
+
+let new_tibutton ~name ?(listprop = []) =
+ let b = GButton.button ~label:name () in
+ b#event#connect#enter_notify
+ ~callback:(fun _ -> GtkSignal.stop_emit (); true);
+ b#event#connect#leave_notify
+ ~callback:(fun _ -> GtkSignal.stop_emit (); true);
+ new tibutton ~widget:b ~name
+
+
+class ticheck_button ~(widget : #GButton.toggle_button) ~name
+ ~parent_tree ~pos ?(insert_evbox=true) parent_window =
+object(self)
+ val button = widget
+ inherit tiwidget ~name ~widget ~insert_evbox
+ ~parent_tree ~pos parent_window as widget
+
+
+ method private class_name = "GButton.check_button"
+
+ method private get_mandatory_props = [ "label" ]
+
+ initializer
+ classe <- "check_button";
+ proplist <- proplist @
+ [ "border_width", new prop_int ~name:"border_width" ~init:"0"
+ ~set:(ftrue button#set_border_width);
+ "label",
+ new prop_string ~name:"label" ~init:name ~set:
+ begin fun v ->
+ button#remove (List.hd button#children)#coerce;
+ GMisc.label ~text:v ~xalign:0.5 ~yalign:0.5 ~packing:button#add ();
+ true
+ end
+ ]
+end
+
+let new_ticheck_button ~name ?(listprop = []) =
+ new ticheck_button ~widget:(GButton.check_button ~label:name ()) ~name
+
+
+
+class titoggle_button ~(widget : #GButton.toggle_button) ~name
+ ~parent_tree ~pos ?(insert_evbox=true) parent_window =
+object(self)
+ val button = widget
+ inherit tiwidget ~name ~widget ~insert_evbox
+ ~parent_tree ~pos parent_window as widget
+
+ method private class_name = "GButton.toggle_button"
+
+ method private get_mandatory_props = [ "label" ]
+
+ initializer
+ classe <- "toggle_button";
+ proplist <- proplist @
+ [ "border width", new prop_int ~name:"border_width" ~init:"0"
+ ~set:(ftrue button#set_border_width);
+ "label",
+ new prop_string ~name:"label" ~init:name ~set:
+ begin fun v ->
+ button#remove (List.hd button#children)#coerce;
+ GMisc.label ~text:v ~xalign:0.5 ~yalign:0.5 ~packing:button#add ();
+ true
+ end ]
+end
+
+let new_titoggle_button ~name ?(listprop = []) =
+ let b = GButton.toggle_button ~label:name () in
+(* b#connect#event#enter_notify
+ ~callback:(fun _ -> GtkSignal.stop_emit ());
+ b#connect#event#leave_notify
+ ~callback:(fun _ -> GtkSignal.stop_emit ());
+*)
+ new titoggle_button ~name ~widget:b
+
+
+class tiradio_button ~(widget : #GButton.radio_button) ~name:nname
+ ~parent_tree ~pos ?(insert_evbox=true) parent_window =
+object(self)
+ val button = widget
+ inherit tiwidget ~name:nname ~widget ~insert_evbox
+ ~parent_tree ~pos parent_window as widget
+
+ val group_prop =
+ new prop_enum_dyn ~values:(fun () -> !radio_button_pool) ~name:"group"
+ ~set:(fun () -> true) ~init:nname
+
+
+ method private class_name = "GButton.radio_button"
+
+ method remove_me_without_undo () =
+ radio_button_pool := list_remove !radio_button_pool
+ ~f:(fun x -> x = name);
+ widget#remove_me_without_undo ()
+
+ method private get_mandatory_props = [ "label" ]
+
+ method private emit_clean_proplist =
+ List.remove_assoc "group" widget#emit_clean_proplist
+
+ method emit_initializer_code formatter =
+ let groupname = group_prop#get in
+ if name <> groupname then
+ Format.fprintf formatter "@ %s#set_group %s#group;" name groupname
+
+ initializer
+ classe <- "radio_button";
+ radio_button_pool := name :: !radio_button_pool;
+ List.iter
+ ~f:(fun x -> Propwin.update (Hashtbl.find widget_map x) true)
+ (List.tl !radio_button_pool);
+
+ proplist <- proplist @
+ [ "border_width", new prop_int ~name:"border_width" ~init:"0"
+ ~set:(ftrue button#set_border_width);
+ "label",
+ new prop_string ~name:"label" ~init:name ~set:
+ begin fun v ->
+ button#remove (List.hd button#children)#coerce;
+ GMisc.label ~text:v ~xalign:0.5 ~yalign:0.5 ~packing:button#add ();
+ true
+ end ;
+ "group", group_prop
+ ]
+end
+
+let new_tiradio_button ~name ?(listprop = []) =
+ let b = GButton.radio_button ~label:name () in
+ (*
+ b#event#connect#enter_notify
+ ~callback:(fun _ -> b#misc#stop_emit ~name:"enter_notify_event"; true);
+ b#event#connect#leave_notify
+ ~callback:(fun _ -> b#misc#stop_emit ~name:"leave_notify_event"; true);
+ *)
+ new tiradio_button ~name ~widget:b
+
+
+
+
+class tibutton_toolbar ~(widget : #GButton.button) ~name ~parent_tree ~pos
+ ?(insert_evbox=true) parent_window ~toolbar =
+object(self)
+ val button = widget
+ inherit tibutton ~name ~widget ~parent_tree ~pos ~insert_evbox
+ parent_window as button
+
+ method private get_mandatory_props =
+ [ "text"; "tooltip"; "tooltip_private" ]
+
+ method emit_init_code formatter ~packing =
+ Format.fprintf formatter "@ @[<hv 2>let %s =@ @[<hov 2>%s#insert_button"
+ name toolbar#name;
+ List.iter self#get_mandatory_props ~f:
+ begin fun name ->
+ Format.fprintf formatter "@ ~%s:%s" name
+ (List.assoc name proplist)#code
+ end;
+ Format.fprintf formatter "@ ()@ in@]@]"
+
+ initializer
+ proplist <- List.remove_assoc "label" proplist
+end
+
+
+class titoggle_button_toolbar ~(widget : #GButton.toggle_button) ~name
+ ~parent_tree ~pos ?(insert_evbox=true) parent_window ~toolbar =
+object(self)
+ val button = widget
+ inherit titoggle_button ~name ~widget ~parent_tree ~pos ~insert_evbox
+ parent_window as button
+
+ method private get_mandatory_props =
+ [ "text"; "tooltip"; "tooltip_private" ]
+
+ method emit_init_code formatter ~packing =
+ Format.fprintf formatter
+ "@ @[<hv 2>let %s =@ @[<hov 2>%s#insert_toggle_button"
+ name toolbar#name;
+ List.iter self#get_mandatory_props ~f:
+ begin fun name ->
+ Format.fprintf formatter "@ ~%s:%s" name
+ (List.assoc name proplist)#code
+ end;
+ Format.fprintf formatter "@ ()@ in@]@]"
+
+ initializer
+ proplist <- List.remove_assoc "label" proplist
+end
+
+
+class tiradio_button_toolbar ~(widget : #GButton.radio_button) ~name
+ ~parent_tree ~pos ?(insert_evbox=true) parent_window ~toolbar =
+object(self)
+ val button = widget
+ inherit tiradio_button ~name ~widget ~parent_tree ~pos ~insert_evbox
+ parent_window as button
+
+ method private get_mandatory_props =
+ [ "text"; "tooltip"; "tooltip_private" ]
+
+ method emit_init_code formatter ~packing =
+ Format.fprintf formatter
+ "@ @[<hv 2>let %s =@ @[<hov 2>%s#insert_radio_button"
+ name toolbar#name;
+ List.iter self#get_mandatory_props ~f:
+ begin fun name ->
+ Format.fprintf formatter "@ ~%s:%s" name
+ (List.assoc name proplist)#code
+ end;
+ Format.fprintf formatter "@ ()@ in@]@]"
+
+ initializer
+ proplist <- List.remove_assoc "label" proplist
+end
+
+
+
+
+class titoolbar ~(widget : GToolbar2.toolbar2) ~name ~parent_tree ~pos
+ ?(insert_evbox=true) parent_window =
+object(self)
+ val toolbar = widget
+ inherit ticontainer ~name ~widget ~parent_tree ~pos
+ ~insert_evbox parent_window
+
+ method private class_name = "GButton.toolbar"
+
+ method private add child ~pos =
+ children <- children @ [child, `START]
+
+ method private get_pos child =
+ let rec aux n = function
+ | [] -> failwith "toolbar::get_pos"
+ | (hd, _)::tl -> if hd = child then n else aux (n+1) tl in
+ aux 0 children
+
+ method private make_child ~classe ?(pos = -1) ~name ~parent_tree
+ ?(insert_evbox = true) ?(listprop = []) parent_window =
+ match classe with
+ | "button" ->
+ let t = try List.assoc "text" listprop with Not_found -> "" in
+ let tt = try List.assoc "tooltip" listprop with Not_found -> "" in
+ let ptt = try List.assoc "tooltip_private" listprop
+ with Not_found -> "" in
+ let listp = List.fold_left ~f:(fun l p -> List.remove_assoc p l)
+ ~init:listprop
+ [ "text"; "tooltip"; "tooltip_private" ] in
+ let b = toolbar#insert_button ~text:t ~tooltip:tt
+ ~tooltip_private:ptt () in
+ let child = new tibutton_toolbar ~name ~widget:b ~pos:(-1)
+ ~insert_evbox:false ~parent_tree:stree parent_window ~toolbar:self in
+ let tp = new prop_string ~name:"text" ~init:t
+ ~set:(fun v ->
+ toolbar#set_text v (self#get_pos child); true)
+ and ttp = new prop_string ~name:"tooltip" ~init:tt
+ ~set:(fun _ -> true)
+ and pttp = new prop_string ~name:"tooltip_private" ~init:ptt
+ ~set:(fun _ -> true) in
+ child#add_to_proplist
+ [ "text", tp; "tooltip", ttp; "tooltip_private", pttp ];
+ child
+ | "toggle_button" ->
+ let t = try List.assoc "text" listprop with Not_found -> "" in
+ let tt = try List.assoc "tooltip" listprop with Not_found -> "" in
+ let ptt = try List.assoc "tooltip_private" listprop
+ with Not_found -> "" in
+ let listp = List.fold_left ~f:(fun l p -> List.remove_assoc p l)
+ ~init:listprop
+ [ "text"; "tooltip"; "tooltip_private" ] in
+ let b = toolbar#insert_toggle_button ~text:t ~tooltip:tt
+ ~tooltip_private:ptt () in
+ let child = new titoggle_button_toolbar ~name ~widget:b ~pos:(-1)
+ ~insert_evbox:false ~parent_tree:stree parent_window ~toolbar:self in
+ let tp = new prop_string ~name:"text" ~init:t
+ ~set:(fun v -> toolbar#set_text v (self#get_pos child); true)
+ and ttp = new prop_string ~name:"tooltip" ~init:tt
+ ~set:(fun _ -> true)
+ and pttp = new prop_string ~name:"tooltip_private" ~init:ptt
+ ~set:(fun _ -> true) in
+ child#add_to_proplist
+ [ "text", tp; "tooltip", ttp; "tooltip_private", pttp ];
+ child
+ | "radio_button" ->
+ let t = try List.assoc "text" listprop with Not_found -> "" in
+ let tt = try List.assoc "tooltip" listprop with Not_found -> "" in
+ let ptt = try List.assoc "tooltip_private" listprop
+ with Not_found -> "" in
+ let listp = List.fold_left ~f:(fun l p -> List.remove_assoc p l)
+ ~init:listprop
+ [ "text"; "tooltip"; "tooltip_private" ] in
+ let b = toolbar#insert_radio_button ~text:t ~tooltip:tt
+ ~tooltip_private:ptt () in
+ let child = new tiradio_button_toolbar ~name ~widget:b ~pos:(-1)
+ ~insert_evbox:false ~parent_tree:stree parent_window ~toolbar:self in
+ let tp = new prop_string ~name:"text" ~init:t
+ ~set:(fun v -> toolbar#set_text v (self#get_pos child); true)
+ and ttp = new prop_string ~name:"tooltip" ~init:tt
+ ~set:(fun _ -> true)
+ and pttp = new prop_string ~name:"tooltip_private" ~init:ptt
+ ~set:(fun _ -> true) in
+ child#add_to_proplist
+ [ "text", tp; "tooltip", ttp; "tooltip_private", pttp ];
+ child
+ | _ -> failwith "toolbar"
+
+
+
+ method remove child =
+ toolbar#remove (child#base);
+ children <- list_remove ~f:(fun (ch, _) -> ch = child) children;
+
+ initializer
+ classe <- "toolbar";
+ proplist <- proplist @
+ [ "orientation",
+ new prop_orientation ~name:"orientation" ~init:"HORIZONTAL"
+ ~set:(ftrue toolbar#set_orientation);
+ "style",
+ new prop_toolbar_style ~name:"style" ~init:"BOTH"
+ ~set:(ftrue toolbar#set_style);
+ "space_size",
+ new prop_int ~name:"space_size" ~init:"5"
+ ~set:(ftrue toolbar#set_space_size);
+ "space_style",
+ new prop_toolbar_space_style ~name:"space_style" ~init:"EMPTY"
+ ~set:(ftrue toolbar#set_space_style);
+ "tooltips",
+ new prop_bool ~name:"tooltips" ~init:"true"
+ ~set:(ftrue toolbar#set_tooltips);
+ "button_relief",
+ new prop_relief_style ~name:"button_relief" ~init:"NORMAL"
+ ~set:(ftrue toolbar#set_button_relief)
+ ]
+end
+
+let new_toolbar ~name ?(listprop = []) =
+ new titoolbar ~name ~widget:(GToolbar2.toolbar2 ())
+