method private connect_events =
      (* connect the press on button 3 for contextual menu *)
      ignore (view#event#connect#button_press ~callback:
                (
                 fun ev ->
                   match GdkEvent.get_type ev with
                     `BUTTON_PRESS when GdkEvent.Button.button ev = 3 ->
                       (
                        GToolbox.popup_menu
                          ~button: 3
                          ~time: (Int32.zero)
                          ~entries: self#menu;
                        true
                       )
                   | `TWO_BUTTON_PRESS ->
                       (
                        let x = int_of_float (GdkEvent.Button.x ev) in
                        let y = int_of_float (GdkEvent.Button.y ev) in
                        match view#get_path_at_pos ~x ~y with
                          None -> true
                        | Some (path,_,_,_) ->
                           let d =
                             let it = store#get_iter path in
                             store#get ~row: it ~column: col_data
                           in
                           self#on_double_click d;
                           true
                       )
                   | `BUTTON_PRESS
                   | `BUTTON_RELEASE
                   | `THREE_BUTTON_PRESS -> false
                )
             );
      ignore
        (view#selection#connect#changed
           (fun () ->
             let sel = view#selection in
             match sel#get_selected_rows with
               [] ->
                 selection <- [];
                 List.iter self#on_deselect selection

             | l ->
                 let l = List.map
                     (fun path ->
                       let it = store#get_iter path in
                       store#get ~row: it ~column: col_data
                     )
                     l
                 in
                 let newly_selected =
                   List.filter (fun e -> not (List.mem e selection)) l
                 in
                 let no_more_selected =
                   List.filter (fun e -> not (List.mem e l)) selection
                 in
                 selection <- l;
                 List.iter self#on_deselect no_more_selected;
                 List.iter self#on_select newly_selected;
           )
        );

      ignore
        (view#event#connect#key_press
         (fun t ->
            (List.mem (GdkEvent.Key.keyval t)
             [
               GdkKeysyms._ISO_Enter ;
               GdkKeysyms._KP_Enter ;
               GdkKeysyms._Return ;
             ]
            ) && (self#on_enter (); true)
         )
        );

      let f = function
      | ColString _ | ColPixbuf _ -> ()
      | ColCheck(col,renderer,_,f_on_toggle) ->
          ignore(renderer#connect#toggled
           (fun path ->
              let it = store#get_iter path in
              let (data, v) =
                (store#get ~row: it ~column: col_data,
                 store#get ~row: it ~column: col)
              in
              let v = f_on_toggle data (not v) in
              store#set ~row: it ~column: col v;
           )
          )
      in
      List.iter f cols_display;