let edit_ft_rules available_rules =
  let l = List.map
      (fun (ft, rule) -> { conf_ft = ft ; conf_rule = rule })
      ft_rules#get
  in
  let apply l =
    ft_rules#set
      (List.map (fun c -> (c.conf_ft, c.conf_rule)) l);
    save_ft ()
  in
  let edit c =
    let params = params_for_ft_rule available_rules c in
    ignore (C.simple_get Cam_messages.edit
              ~width: 300
              ~height: 100
              params
           );
    c
  in
  let add () =
    let c = { conf_ft = "" ; conf_rule = "" } in
    let params = params_for_ft_rule available_rules c in
    match C.simple_get Cam_messages.add
        ~width: 300
        ~height: 100
        params
    with
      C.Return_ok -> [c]
    | _ -> []
  in
  let display c =
    [ Glib.Convert.locale_to_utf8 c.conf_ft ;
      Glib.Convert.locale_to_utf8 c.conf_rule ;
    ]
  in
  let param = C.list
      ~f: apply
      ~edit
      ~add
      ~titles: [Cam_messages.file_type ; Cam_messages.rule ]
      ""
      display l
  in
  ignore
    (C.simple_get Cam_messages.file_types_rules
       ~width: 400
       ~height: 500
       [param]
    )