let tag_attributes_param tag =
  let f_string a = [ a.att_name ; a.att_code ] in
  let f_edit a =
    ignore (C.simple_get Rep_messages.edit (params_for_att a));
    a
  in
  let f_add () =
    let a = { att_name = "" ; att_code = "" } in
    match C.simple_get Rep_messages.edit (params_for_att a) with
      C.Return_cancel -> []
    | C.Return_apply
    | C.Return_ok -> [a]
  in
  let f_eq a1 a2 = a1.att_name = a2.att_name in
  let p = C.list
      ~f: (fun atts ->
            tag.atts <- List.map (fun a -> (a.att_name, a.att_code)) atts
          )
      ~eq: f_eq
      ~edit: f_edit
      ~add: f_add
      ~titles: [ Rep_messages.name ; Rep_messages.code ]
      Rep_messages.attributes
      f_string
      (List.map (fun (n,c) -> { att_name = n ; att_code = c}) tag.atts)
  in
  p