New session dialog now opens as well as makes new sessions. Avoid seeing an ugly...
[ardour.git] / gtk2_ardour / ardour_ui.cc
index de23ebdcc3981fda84db6ee8054000c6251e218f..fbd83e9057e8c6928cea4a94a6e2b0f8c476cac5 100644 (file)
 
 #include <iostream>
 
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/accelmap.h>
+
 #include <pbd/error.h>
 #include <pbd/compose.h>
 #include <pbd/basename.h>
 #include <pbd/pathscanner.h>
 #include <pbd/failed_constructor.h>
 #include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/pix.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/fastmeter.h>
@@ -58,7 +60,6 @@
 
 #include "actions.h"
 #include "ardour_ui.h"
-#include "ardour_message.h"
 #include "public_editor.h"
 #include "audio_clock.h"
 #include "keyboard.h"
@@ -71,7 +72,7 @@
 #include "about.h"
 #include "utils.h"
 #include "gui_thread.h"
-#include "meter_xpms.h"
+#include "color_manager.h"
 
 #include "i18n.h"
 
@@ -87,19 +88,6 @@ sigc::signal<void>      ARDOUR_UI::RapidScreenUpdate;
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
 
-static const char* channel_setup_names[] = {
-       "mono",
-       "stereo",
-       "3 channels",
-       "4 channels",
-       "5 channels",
-       "8 channels",
-       "manual setup",
-       0
-};
-
-vector<string> channel_combo_strings;
-
 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
@@ -142,11 +130,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        using namespace Gtk::Menu_Helpers;
 
        Gtkmm2ext::init();
-
-       /* actually, its already loaded, but ... */
-
-       cerr << "Loading UI configuration file " << rcfile << endl;
-
+       
        about = 0;
 
        if (theArdourUI == 0) {
@@ -154,7 +138,15 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        }
 
        ActionManager::init ();
+
+       /* load colors */
+
+       color_manager = new ColorManager();
+
+       std::string color_file = ARDOUR::find_config_file("ardour.colors");
        
+       color_manager->load (color_file);
+
        m_new_session_dialog = 0;
        m_new_session_dialog_ref = NewSessionDialogFactory::create();
        m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
@@ -184,6 +176,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        shuttle_grabbed = false;
        shuttle_fract = 0.0;
+       shuttle_max_speed = 8.0f;
 
        set_shuttle_units (Percentage);
        set_shuttle_behaviour (Sprung);
@@ -203,8 +196,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
 
-       channel_combo_strings = internationalize (channel_setup_names);
-       
        /* have to wait for AudioEngine and Configuration before proceeding */
 }
 
@@ -220,7 +211,8 @@ because it has no input connections.\n\
 You would be wasting space recording silence."),
                              ds->name());
 
-       ArdourMessage message (editor, X_("cannotrecord"), msg);
+       MessageDialog message (*editor, msg);
+       message.run ();
 }
 
 void
@@ -236,10 +228,22 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        _tooltips.enable();
 
        keyboard = new Keyboard;
-       install_keybindings ();
 
-       FastMeter::set_vertical_xpm (v_meter_strip_xpm);
-       FastMeter::set_horizontal_xpm (h_meter_strip_xpm);
+       string meter_path;
+
+       meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
+       if (meter_path.empty()) {
+               error << _("no vertical meter strip image found") << endmsg;
+               exit (1);
+       }
+       FastMeter::set_vertical_xpm (meter_path);
+
+       meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
+       if (meter_path.empty()) {
+               error << _("no horizontal meter strip image found") << endmsg;
+               exit (1);
+       }
+       FastMeter::set_horizontal_xpm (meter_path);
 
        if (setup_windows ()) {
                throw failed_constructor ();
@@ -267,6 +271,10 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        
        blink_timeout_tag = -1;
 
+       /* the global configuration object is now valid */
+
+       use_config ();
+
        /* this being a GUI and all, we want peakfiles */
 
        FileSource::set_build_peakfiles (true);
@@ -373,9 +381,13 @@ ARDOUR_UI::save_ardour_state ()
                session->add_instant_xml(enode, session->path());
                session->add_instant_xml(mnode, session->path());
        } else {
-               Config->add_instant_xml(enode, Config->get_user_ardour_path());
-               Config->add_instant_xml(mnode, Config->get_user_ardour_path());
+               Config->add_instant_xml(enode, get_user_ardour_path());
+               Config->add_instant_xml(mnode, get_user_ardour_path());
        }
+
+       /* keybindings */
+
+       AccelMap::save ("ardour.saved_bindings");
 }
 
 void
@@ -403,11 +415,12 @@ ARDOUR_UI::finish()
                        /* use the default name */
                        if (save_state_canfail ("")) {
                                /* failed - don't quit */
-                               ArdourMessage (editor, X_("badsave dialog"),
+                               MessageDialog msg (*editor, 
                                               _("\
 Ardour was unable to save your session.\n\n\
 If you still wish to quit, please use the\n\n\
 \"Just quit\" option."));
+                               msg.run ();
                                return;
                        }
                        break;
@@ -423,15 +436,20 @@ int
 ARDOUR_UI::ask_about_saving_session (const string & what)
 {
        ArdourDialog window (_("ardour: save session?"));
+       Gtk::HBox dhbox;  // the hbox for the image and text
        Gtk::Label  prompt_label;
+       Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING,  Gtk::ICON_SIZE_DIALOG));
+
        string msg;
 
-       msg = string_compose(_("Save and %1"), what);
-       window.add_button (msg, RESPONSE_ACCEPT);
-       msg = string_compose(_("Just %1"), what);
-       window.add_button (msg, RESPONSE_APPLY);
        msg = string_compose(_("Don't %1"), what);
        window.add_button (msg, RESPONSE_REJECT);
+       msg = string_compose(_("Just %1"), what);
+       window.add_button (msg, RESPONSE_APPLY);
+       msg = string_compose(_("Save and %1"), what);
+       window.add_button (msg, RESPONSE_ACCEPT);
+
+       window.set_default_response (RESPONSE_ACCEPT);
 
        Gtk::Button noquit_button (msg);
        noquit_button.set_name ("EditorGTKButton");
@@ -444,18 +462,21 @@ ARDOUR_UI::ask_about_saving_session (const string & what)
        } else {
                type = _("snapshot");
        }
-       prompt = string_compose(_("The %1\n\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), 
+       prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), 
                         type, session->snap_name());
        
        prompt_label.set_text (prompt);
-       prompt_label.set_alignment (0.5, 0.5);
        prompt_label.set_name (X_("PrompterLabel"));
-       
-       window.get_vbox()->pack_start (prompt_label);
+       prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
+       dhbox.set_homogeneous (false);
+       dhbox.pack_start (*dimage, false, false, 5);
+       dhbox.pack_start (prompt_label, true, false, 5);
+       window.get_vbox()->pack_start (dhbox);
 
        window.set_name (_("Prompter"));
        window.set_position (Gtk::WIN_POS_MOUSE);
        window.set_modal (true);
+       window.set_resizable (false);
        window.show_all ();
 
        save_the_session = 0;
@@ -484,27 +505,12 @@ ARDOUR_UI::every_second ()
        update_cpu_load ();
        update_buffer_load ();
        update_disk_space ();
-       // update_disk_rate ();
        return TRUE;
 }
 
 gint
 ARDOUR_UI::every_point_one_seconds ()
 {
-       struct timeval now;
-       struct timeval diff;
-       
-       /* do not attempt to grab peak power more than once per cycle.
-        */
-
-       gettimeofday (&now, 0);
-       timersub (&now, &last_peak_grab, &diff);
-
-       if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
-               IO::GrabPeakPower(); /* EMIT_SIGNAL */
-               last_peak_grab = now;
-       } 
-
        update_speed_display ();
        RapidScreenUpdate(); /* EMIT_SIGNAL */
        return TRUE;
@@ -554,20 +560,6 @@ ARDOUR_UI::update_cpu_load ()
        cpu_load_label.set_text (buf);
 }
 
-void
-ARDOUR_UI::update_disk_rate ()
-{
-       char buf[64];
-
-       if (session) {
-               snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"), 
-                         session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
-               disk_rate_label.set_text (buf);
-       } else {
-               disk_rate_label.set_text ("");
-       }
-}
-
 void
 ARDOUR_UI::update_buffer_load ()
 {
@@ -774,12 +766,15 @@ ARDOUR_UI::build_session_selector ()
        Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
        
        session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
-       session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
-
+       session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
+       session_selector_window->set_default_response (RESPONSE_ACCEPT);
        recent_session_model = TreeStore::create (recent_session_columns);
        recent_session_display.set_model (recent_session_model);
        recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
        recent_session_display.set_headers_visible (false);
+       recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
+
+       recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
 
        scroller->add (recent_session_display);
        scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
@@ -790,6 +785,12 @@ ARDOUR_UI::build_session_selector ()
        session_selector_window->show_all_children();
 }
 
+void
+ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
+{
+       session_selector_window->response (RESPONSE_ACCEPT);
+}
+
 void
 ARDOUR_UI::open_recent_session ()
 {
@@ -903,7 +904,7 @@ ARDOUR_UI::session_add_midi_track ()
 }
 
 void
-ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels)
+ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
 {
        Route* route;
 
@@ -914,7 +915,7 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
 
        try { 
                if (disk) {
-                       if ((route = session->new_audio_track (input_channels, output_channels)) == 0) {
+                       if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
                                error << _("could not create new audio track") << endmsg;
                        }
                } else {
@@ -937,11 +938,12 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
        }
 
        catch (...) {
-               ArdourMessage msg (editor, X_("noport dialog"),
+               MessageDialog msg (*editor, 
                                   _("There are insufficient JACK ports available\n\
 to create a new track or bus.\n\
 You should save Ardour, exit and\n\
 restart JACK with more ports."));
+               msg.run ();
        }
 }
 
@@ -970,6 +972,23 @@ ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
 
 void
 ARDOUR_UI::transport_goto_start ()
+{
+       if (session) {
+               session->goto_start();
+
+               
+               /* force displayed area in editor to start no matter
+                  what "follow playhead" setting is.
+               */
+               
+               if (editor) {
+                       editor->reposition_x_origin (session->current_start_frame());
+               }
+       }
+}
+
+void
+ARDOUR_UI::transport_goto_zero ()
 {
        if (session) {
                session->request_locate (0);
@@ -1045,14 +1064,15 @@ ARDOUR_UI::transport_record ()
                case Session::Disabled:
                        if (session->ntracks() == 0) {
                                string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
-                               ArdourMessage msg (editor, X_("cannotrecenable"), txt);
+                               MessageDialog msg (*editor, txt);
+                               msg.run ();
                                return;
                        }
                        session->maybe_enable_record ();
                        break;
                case Session::Recording:
                case Session::Enabled:
-                       session->disable_record ();
+                       session->disable_record (true);
                }
        }
 }
@@ -1219,14 +1239,6 @@ ARDOUR_UI::map_transport_state ()
        }
 }
 
-void
-ARDOUR_UI::send_all_midi_feedback ()
-{
-       if (session) {
-               session->send_all_midi_feedback();
-       }
-}
-
 void
 ARDOUR_UI::allow_local_only ()
 {
@@ -1279,12 +1291,13 @@ ARDOUR_UI::engine_halted ()
 
        update_sample_rate (0);
 
-       ArdourMessage msg (editor, X_("halted"),
+       MessageDialog msg (*editor, 
                           _("\
 JACK has either been shutdown or it\n\
 disconnected Ardour because Ardour\n\
 was not fast enough. You can save the\n\
 session and/or try to reconnect to JACK ."));
+       msg.run ();
 }
 
 int32_t
@@ -1514,10 +1527,12 @@ ARDOUR_UI::snapshot_session ()
 
        time (&n);
        now = ctime (&n);
-       now = now.substr (0, now.length() - 1);
+       now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
 
        prompter.set_name ("Prompter");
-       prompter.set_prompt (_("Name for snapshot"));
+       prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+       prompter.set_prompt (_("Name of New Snapshot"));
        prompter.set_initial_text (now);
        
        switch (prompter.run()) {
@@ -1665,7 +1680,9 @@ ARDOUR_UI::save_template ()
        prompter.set_name (X_("Prompter"));
        prompter.set_prompt (_("Name for mix template:"));
        prompter.set_initial_text(session->name() + _("-template"));
-       
+       prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+
        switch (prompter.run()) {
        case RESPONSE_ACCEPT:
                prompter.get_result (name);
@@ -1691,8 +1708,29 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
 
        do {
                response = m_new_session_dialog->run ();
-       
-               if(response == Gtk::RESPONSE_OK) {
+               if(response == Gtk::RESPONSE_CANCEL) {
+                 quit();
+                 return;
+               } else if (response == Gtk::RESPONSE_YES) {
+                 /* YES  == OPEN, but there's no enum for that */
+                 std::string session_name = m_new_session_dialog->session_name();
+                 std::string session_path = m_new_session_dialog->session_folder();
+                 load_session (session_path, session_name);
+
+
+               } else if (response == Gtk::RESPONSE_OK) {
+                 if (m_new_session_dialog->get_current_page() == 1) {
+
+                   /* XXX this is a bit of a hack.. 
+                      i really want the new sesion dialog to return RESPONSE_YES
+                      if we're on page 1 (the load page)
+                      Unfortunately i can't see how atm.. 
+                   */
+                       std::string session_name = m_new_session_dialog->session_name();
+                       std::string session_path = m_new_session_dialog->session_folder();
+                       load_session (session_path, session_name);
+
+                 } else {
 
                        _session_is_new = true;
                        
@@ -1758,11 +1796,21 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                                               nphysin,
                                               nphysout, 
                                               engine->frame_rate() * 60 * 5);
-                       }               
+                       }
+                 }     
                }
-
+               
        } while(response == Gtk::RESPONSE_HELP);
        m_new_session_dialog->hide_all();
+       show();
+
+}
+
+void
+ARDOUR_UI::close_session()
+{
+  unload_session();
+  new_session ();
 }
 
 int
@@ -1782,9 +1830,10 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string*
        /* if it already exists, we must have write access */
 
        if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
-               ArdourMessage msg (editor, X_("noaccess dialog"), _("\
+               MessageDialog msg (*editor, _("\
 You do not have write access to this session.\n\
 This prevents the session from being loaded."));
+               msg.run ();
                return -1;
        }
 
@@ -1814,6 +1863,8 @@ ARDOUR_UI::make_session_clean ()
                session->set_clean ();
        }
 
+       show ();
+
        return FALSE;
 }
 
@@ -1902,16 +1953,21 @@ ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* l
        removed = rep.paths.size();
 
        if (removed == 0) {
-               ArdourMessage msg (editor, X_("cleanupresults"),
-                                  _("\
-No audio files were ready for cleanup\n\n\
-If this seems suprising, check for any existing\n\
-snapshots. These may still include regions that\n\
+               MessageDialog msgd (*editor,
+                                   _("No audio files were ready for cleanup"), 
+                                   true,
+                                   Gtk::MESSAGE_INFO,
+                                   (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE)  );
+               msgd.set_secondary_text (_("If this seems suprising, \n\
+check for any existing snapshots.\n\
+These may still include regions that\n\
 require some unused files to continue to exist."));
+       
+               msgd.run ();
                return;
        } 
 
-       ArdourDialog results (_("ardour: cleanup"), true);
+       ArdourDialog results (_("ardour: cleanup"), true, false);
        
        struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
            CleanupResultsModelColumns() { 
@@ -1923,34 +1979,45 @@ require some unused files to continue to exist."));
        };
 
        
-       Glib::RefPtr<Gtk::ListStore> results_model;
        CleanupResultsModelColumns results_columns;
+       Glib::RefPtr<Gtk::ListStore> results_model;
        Gtk::TreeView results_display;
        
        results_model = ListStore::create (results_columns);
        results_display.set_model (results_model);
        results_display.append_column (list_title, results_columns.visible_name);
+
+       results_display.set_name ("CleanupResultsList");
        results_display.set_headers_visible (true);
+       results_display.set_headers_clickable (false);
+       results_display.set_reorderable (false);
 
        Gtk::ScrolledWindow list_scroller;
        Gtk::Label txt;
+       Gtk::VBox dvbox;
+       Gtk::HBox dhbox;  // the hbox for the image and text
+       Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
+       Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO,  Gtk::ICON_SIZE_DIALOG));
+
+       dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
 
        if (rep.space < 1048576.0f) {
                if (removed > 1) {
-                       txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
+                 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
                } else {
-                       txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
+                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
                }
        } else {
                if (removed > 1) {
-                       txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
                } else {
-                       txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
                }
        }
 
-       results.get_vbox()->pack_start (txt, false, false);
-       
+       dhbox.pack_start (*dimage, true, false, 5);
+       dhbox.pack_start (txt, true, false, 5);
+
        for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
                TreeModel::Row row = *(results_model->append());
                row[results_columns.visible_name] = *i;
@@ -1958,14 +2025,22 @@ require some unused files to continue to exist."));
        }
        
        list_scroller.add (results_display);
-       list_scroller.set_size_request (-1, 250);
+       list_scroller.set_size_request (-1, 150);
        list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-       
-       results.get_vbox()->pack_start (list_scroller, true, true);
-       results.add_button (Stock::OK, RESPONSE_ACCEPT);
+
+       dvbox.pack_start (dhbox, true, false, 5);
+       dvbox.pack_start (list_scroller, true, false, 5);
+       ddhbox.pack_start (dvbox, true, false, 5);
+
+       results.get_vbox()->pack_start (ddhbox, true, false, 5);
+       results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
+       results.set_default_response (RESPONSE_CLOSE);
        results.set_position (Gtk::WIN_POS_MOUSE);
+       results.show_all_children ();
+       results.set_resizable (false);
 
        results.run ();
+
 }
 
 void
@@ -1976,15 +2051,20 @@ ARDOUR_UI::cleanup ()
                return;
        }
 
-       ArdourDialog checker (_("ardour cleanup"));
-       Gtk::Label label (_("\
-Cleanup is a destructive operation.\n\
+
+       MessageDialog  checker (_("Are you sure you want to cleanup?"),
+                               true,
+                               Gtk::MESSAGE_QUESTION,
+                               (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
+
+       checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
 ALL undo/redo information will be lost if you cleanup.\n\
-Unused audio files will be moved to a \"dead sounds\" location."));
+After cleanup, unused audio files will be moved to a \
+\"dead sounds\" location."));
        
-       checker.get_vbox()->pack_start (label, false, false);
-       checker.add_button (Stock::OK, RESPONSE_ACCEPT);
        checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
+       checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
+       checker.set_default_response (RESPONSE_CANCEL);
 
        checker.set_name (_("CleanupDialog"));
        checker.set_wmclass (_("ardour_cleanup"), "Ardour");
@@ -2004,14 +2084,16 @@ Unused audio files will be moved to a \"dead sounds\" location."));
        if (session->cleanup_sources (rep)) {
                return;
        }
-
+       checker.hide();
        display_cleanup_results (rep, 
                                 _("cleaned files"),
                                 _("\
-The following %1 %2 were not in use.\n\
-The next time you flush the wastebasket\n\
-it will release an additional %3 %4bytes\n\
-of disk space"
+The following %1 %2 not in use and \n\
+have been moved to:\n\
+%3. \n\n\
+Flushing the wastebasket will \n\
+release an additional\n\
+%4 %5bytes of disk space.\n"
                                         ));
 }
 
@@ -2031,7 +2113,9 @@ ARDOUR_UI::flush_trash ()
 
        display_cleanup_results (rep, 
                                 _("deleted file"),
-                                _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
+                                _("The following %1 %2 deleted from\n\
+%3,\n\
+releasing %4 %5bytes of disk space"));
 }
 
 void
@@ -2086,7 +2170,7 @@ ARDOUR_UI::add_route ()
 
        while (count) {
                if (track) {
-                       session_add_audio_track (input_chan, output_chan);
+                       session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
                } else {
                        session_add_audio_bus (input_chan, output_chan);
                }
@@ -2106,7 +2190,7 @@ ARDOUR_UI::mixer_settings () const
        if (session) {
                node = session->instant_xml(X_("Mixer"), session->path());
        } else {
-               node = Config->instant_xml(X_("Mixer"), Config->get_user_ardour_path());
+               node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
        }
 
        if (!node) {
@@ -2124,7 +2208,7 @@ ARDOUR_UI::editor_settings () const
        if (session) {
                node = session->instant_xml(X_("Editor"), session->path());
        } else {
-               node = Config->instant_xml(X_("Editor"), Config->get_user_ardour_path());
+               node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
        }
 
        if (!node) {
@@ -2151,8 +2235,9 @@ ARDOUR_UI::halt_on_xrun_message ()
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
 
-       ArdourMessage msg (editor, X_("haltonxrun"),
+       MessageDialog msg (*editor,
                           _("Recording was stopped because your system could not keep up."));
+       msg.run ();
 }
 
 void 
@@ -2174,12 +2259,13 @@ ARDOUR_UI::disk_overrun_handler ()
 
        if (!have_disk_overrun_displayed) {
                have_disk_overrun_displayed = true;
-               ArdourMessage msg (editor, X_("diskrate dialog"), _("\
+               MessageDialog msg (*editor, X_("diskrate dialog"), _("\
 The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to write data to disk\n\
 quickly enough to keep up with recording.\n"));
+               msg.run ();
                have_disk_overrun_displayed = false;
        }
 }
@@ -2191,12 +2277,13 @@ ARDOUR_UI::disk_underrun_handler ()
 
        if (!have_disk_underrun_displayed) {
                have_disk_underrun_displayed = true;
-               ArdourMessage msg (editor, X_("diskrate2 dialog"),
+               MessageDialog msg (*editor,
                        (_("The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to read data from disk\n\
 quickly enough to keep up with playback.\n")));
+               msg.run ();
                have_disk_underrun_displayed = false;
        } 
 }
@@ -2235,22 +2322,19 @@ what you would like to do.\n"));
        
        switch (dialog.run ()) {
        case RESPONSE_ACCEPT:
-               break;
-       default:
                return 1;
+       default:
+               return 0;
        }
-
-       return 0;
 }
        
-       
 void
 ARDOUR_UI::disconnect_from_jack ()
 {
        if (engine) {
                if( engine->disconnect_from_jack ()) {
-                       ArdourMessage msg (editor, X_("nojack dialog"),
-                                          _("Could not disconnect from JACK"));
+                       MessageDialog msg (*editor, _("Could not disconnect from JACK"));
+                       msg.run ();
                }
 
                update_sample_rate (0);
@@ -2262,8 +2346,8 @@ ARDOUR_UI::reconnect_to_jack ()
 {
        if (engine) {
                if (engine->reconnect_to_jack ()) {
-                       ArdourMessage msg (editor, X_("nojack dialog"),
-                                          _("Could not reconnect to JACK"));
+                       MessageDialog msg (*editor,  _("Could not reconnect to JACK"));
+                       msg.run ();
                }
 
                update_sample_rate (0);
@@ -2296,3 +2380,106 @@ ARDOUR_UI::cmdline_new_session (string path)
        _will_create_new_session_automatically = false; /* done it */
        return FALSE; /* don't call it again */
 }
+
+void
+ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
+{
+       Glib::RefPtr<Action> act;
+       
+       switch (hf) {
+       case BWF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+               break;
+       case WAVE:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+               break;
+       case WAVE64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+               break;
+       case iXML:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+               break;
+       case RF64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
+                       Config->set_native_file_header_format (hf);
+                       if (session) {
+                               session->reset_native_file_format ();
+                       }
+               }
+       }
+}
+
+void
+ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
+{
+       Glib::RefPtr<Action> act;
+       
+       switch (sf) {
+       case FormatFloat:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+               break;
+       case FormatInt24:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+
+               if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
+                       Config->set_native_file_data_format (sf);
+                       if (session) {
+                               session->reset_native_file_format ();
+                       }
+               }
+       }
+}
+
+void
+ARDOUR_UI::use_config ()
+{
+       Glib::RefPtr<Action> act;
+
+       switch (Config->get_native_file_data_format ()) {
+       case FormatFloat:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+               break;
+       case FormatInt24:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               ract->set_active ();
+       }       
+
+       switch (Config->get_native_file_header_format ()) {
+       case BWF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+               break;
+       case WAVE:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+               break;
+       case WAVE64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+               break;
+       case iXML:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+               break;
+       case RF64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               ract->set_active ();
+       }       
+}