method add_output (o : output) =
      try
        ignore(self#output_by_name o#name);
        failwith (Printf.sprintf "Output \"%s\" already present." o#name)
      with
        Not_found ->
          let evt = GBin.event_box () in
          let tab = new Ed_gui_base.outputs_note_tab ~file: Ed_config.glade_file () in
          tab#reparent evt#coerce;
          tab#wlabel#set_text o#label;
          let (o : output) = object
              method name = o#name
              method label = o#label
              method box = o#box
              method set_label s = o#set_label s; tab#wlabel#set_text s
              method on_destroy = o#on_destroy
            end
          in
          ignore(o#box#misc#connect#destroy (fun _ -> o#on_destroy));
          ignore(tab#wb_close#connect#clicked
           (fun () ->
              let n = self#output_pos o#name in
              notebook#remove_page n;
              o#box#destroy ();
              pages <- List.filter (fun o2 -> o2#name <> o#name) pages;
              match pages with
                [] -> toplevel#misc#hide()
              | _ -> ()
           )
          );
          ignore(notebook#append_page ~tab_label: evt#coerce o#box);
          pages <- pages @ [o]