let impact_panel main_ui = 
  let w = GPack.vbox () in
  (* button "set_selected" *)
  let bbox = GPack.hbox ~width:120 ~packing:w#pack () in
  let set_selected = 
    GButton.button ~label:"Set selected" 
      ~packing:(bbox#pack ~fill:false ~expand:true) () 
  in
  let do_select = apply_on_stmt (compute_impact main_ui) in
  ignore (set_selected#connect#pressed
            (fun () -> Design.apply_on_selected do_select));
  (* check buttons *)
  let add_check_button label active f =
    let b = GButton.check_button ~label ~active ~packing:w#pack () in
    ignore (b#connect#toggled ~callback:(fun () -> f b));
    b
  in
  let enabled_button = 
    add_check_button "Enable" (Enabled.get ())
      (fun b -> Enabled.set b#active; main_ui#rehighlight ())
  in
  let slicing_button =
    add_check_button "Slicing after impact" (Slicing.get ())
      (fun b -> Slicing.set b#active)
  in
  let follow_focus_button =
    add_check_button "Follow focus" (FollowFocus.get ())
      (fun b -> FollowFocus.set b#active)
  in
  (* panel refresh *)
  let refresh () = 
    let sensitive_set_selected_button = ref false in
    Design.apply_on_selected
      (apply_on_stmt (fun _ -> sensitive_set_selected_button:=true));
    set_selected#misc#set_sensitive !sensitive_set_selected_button;
    if Enabled.get () <> enabled_button#active then begin
      enabled_button#set_active (Enabled.get ());
      main_ui#rehighlight ()
    end;
    slicing_button#set_active (Slicing.get ());
    follow_focus_button#set_active (FollowFocus.get ())
  in
  "Impact", w#coerce, Some refresh