let slicing_panel (main_ui:Design.main_window_extension_points) =
  let w = GPack.vbox  () in
  let hbox1 = GPack.hbox
    ~packing:w#pack () in
  let activate_button =
    let b = GButton.button ~label:"Activate"
      ~packing:hbox1#pack () in
      main_ui#help_message b "%s" msg_help_compute_values ;
      ignore (b#connect#pressed
                (fun () -> gui_compute_values main_ui ));
      
      b
  in
  let combo_box_text =
    let ((combo_box, (_model, column)) as combo_box_text) =
      GEdit.combo_box_text ~strings:[ none_text ] ~wrap_width:3 ~use_markup:true
        ~packing:(hbox1#pack ~expand:true ~fill:true) () in
      combo_box#set_active 0 ;
      ignore (combo_box#connect#changed
                (fun () ->
                   match combo_box#active_iter with
                     | None -> ()
                     | Some row -> 
                         let slicing_project_name =
                           (* get the text entry related to the current slicing project *)
                           Extlib.may_map !Db.Slicing.Project.get_name ~dft:none_text (!Db.Slicing.Project.get_project ())
                         and selected_name = combo_box#model#get ~row ~column in
                           if (selected_name != slicing_project_name) then
                             let proj_opt =
                               try Some (List.find (fun proj -> selected_name = !Db.Slicing.Project.get_name proj) (!Db.Slicing.Project.get_all ()))
                               with Not_found -> None
                             in
                               gui_set_project main_ui proj_opt));
      combo_box_text
  in
  let table = GPack.table ~columns:2 ~rows:2 ~homogeneous:true ~packing:w#pack () in
    
  let hbox2 = GPack.hbox ~packing:(table#attach ~left:1 ~top:0) () in
    
  (* [enabled_button] to give slicing menu available *)    
  let enable_refresh () = 
    gui_compute_values main_ui ;
    main_ui#rehighlight ()
  in 
  let enabled_button =
    let b = GButton.check_button 
      ~label:"Enable"
      ~active:(Enable.get ())
      ~packing:(table#attach ~left:0 ~top:0) () in
      main_ui#help_message b "%s" msg_help_enable_gui ;
      ignore (b#connect#toggled 
                ~callback:(fun () -> 
                             Enable.set b#active;
                             enable_refresh ()));
      b
  in
  let verbose_refresh = Gtk_helper.on_int ~lower:0 ~upper:3 
    hbox2
    "Verbosity"
     ~sensitive:Enable.get
    SlicingParameters.Verbose.get
    (gui_set_slicing_debug main_ui)
  in
  let hbox3 = GPack.hbox ~packing:(table#attach ~left:1 ~top:1) () in
    (* [slice_undef_button] related to -slice-undef option *)    
  let slice_undef_button =
    let b = GButton.check_button 
      ~label:"Libraries"
      ~active:(Enable.get ())
      ~packing:(table#attach ~left:0 ~top:1) () in
      main_ui#help_message b "%s" msg_help_libraries ;
      ignore (b#connect#toggled
                (fun () ->
                   gui_set_slicing_undef_functions main_ui b#active));
      b
  in
  let level_refresh = Gtk_helper.on_int ~lower:0 ~upper:3
    hbox3 
    "Level"
    ~sensitive:Enable.get
    SlicingParameters.Mode.Calls.get 
    (gui_set_slicing_level main_ui)
  in
    Project.register_after_set_current_hook
      ~user_only:true
      (fun _ -> rebuild_model combo_box_text);

    let refresh () =
      let value_is_computed = Db.Value.is_computed () in
      let slicing_project = !Db.Slicing.Project.get_project () in
      let enabled = Enable.get () in
      activate_button#misc#set_sensitive (not value_is_computed) ;
      enabled_button#misc#set_sensitive value_is_computed ;
      slice_undef_button#misc#set_sensitive enabled ;
      
      verbose_refresh ();
      level_refresh ();

      if enabled_button#active <> enabled then 
        begin
          enabled_button#set_active enabled ;
          enable_refresh ();
        end;

      slice_undef_button#set_active (SlicingParameters.Mode.SliceUndef.get());
  
      ignore (refresh_combo_box combo_box_text slicing_project (enabled && value_is_computed))
    in 
    refresh () ;
    "Slicing",w#coerce,Some refresh