let occurrence_panel main_ui =
  let w = GPack.vbox  () in
  (* Selected Var display *)
  let selected_var_box = GPack.hbox ~packing:w#pack () in
  ignore
    (GMisc.label ~xalign:0.0 ~text:"Current var: "
       ~packing:(selected_var_box#pack ~expand:false) ());
  let e = GMisc.label ~xalign:0.0
    ~selectable:true
    ~packing:(selected_var_box#pack ~expand:true ~fill:true)
    ()
  in
  e#set_use_markup true;
  old_gtk_compat e#set_single_line_mode true;
  let set_selected = GButton.button ~label:"Set selected"
    ~packing:selected_var_box#pack ()
  in
  let do_select localizable =
    apply_on_vi
      (fun vi -> find_occurrence main_ui vi ())
      localizable
  in
  ignore (set_selected#connect#pressed
            (fun () -> History.apply_on_selected do_select));
  (* check_button enabled *)
  let enabled = Enabled.get () in
  let enabled_button = GButton.check_button
    ~label:"Enable"
    ~packing:w#pack
    ~active:enabled
    ()
  in
  ignore
    (enabled_button#connect#toggled
       ~callback:
       (fun () ->
          Enabled.set enabled_button#active;
         !show_column ();
          main_ui#rehighlight ()));
  (* check_button followFocus *)
  let followFocus = GButton.check_button
    ~label:"Follow focus"
    ~packing:w#pack
    ~active:(FollowFocus.get ())
    ()
  in
  ignore
    (followFocus#connect#toggled
       ~callback:(fun () -> FollowFocus.set followFocus#active));
  let refresh =
    let old_vi = ref (-2) in
    fun () ->
      (let sensitive_set_selected_button = ref false in
       History.apply_on_selected
         (apply_on_vi (fun _ -> sensitive_set_selected_button:=true));
       set_selected#misc#set_sensitive !sensitive_set_selected_button;
       if Enabled.get () <> enabled_button#active then (
         enabled_button#set_active (Enabled.get ());
         !show_column ();
       );
       let new_result = !Db.Occurrence.get_last_result () in
       (match new_result with
        | None when !old_vi<> -1 ->
            old_vi := -1; e#set_label "<i>None</i>"
        | Some (_,vi) when vi.vid<> !old_vi->
            old_vi := vi.vid;
            e#set_label vi.vname
        | _ -> ()))
  in
  "Occurrence",w#coerce,Some refresh