enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / gtk2_ardour / keyeditor.cc
index ce066efd7012aead1c6e8893ec0a52449221935b..b19b6d5fc009611b321026bac56e61bf0d1aecfe 100644 (file)
 #endif
 
 #include <map>
+#include <fstream>
+#include <sstream>
 
 #include <boost/algorithm/string.hpp>
 
+#include <glib.h>
+#include <glib/gstdio.h>
+
 #include <gtkmm/stock.h>
 #include <gtkmm/label.h>
 #include <gtkmm/accelkey.h>
@@ -34,6 +39,8 @@
 #include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/utils.h"
 
+#include "pbd/error.h"
+#include "pbd/openuri.h"
 #include "pbd/strsplit.h"
 
 #include "ardour/filesystem_paths.h"
@@ -43,7 +50,7 @@
 #include "keyboard.h"
 #include "keyeditor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -72,6 +79,7 @@ KeyEditor::KeyEditor ()
        , unbind_box (BUTTONBOX_END)
        , filter_entry (_("Search..."), true)
        , filter_string("")
+       , print_button (_("Print"))
        , sort_column(0)
        , sort_type(Gtk::SORT_ASCENDING)
 {
@@ -86,7 +94,7 @@ KeyEditor::KeyEditor ()
        filter_entry.signal_search_string_updated ().connect (sigc::mem_fun (*this, &KeyEditor::search_string_updated));
        vpacker.pack_start (filter_entry, false, false);
 
-       Label* hint = manage (new Label (_("Select an action, then press the key(s) to (re)set its shortcut")));
+       Label* hint = manage (new Label (_("To remove a shortcut select an action then press this: ")));
        hint->show ();
        unbind_box.set_spacing (6);
        unbind_box.pack_start (*hint, false, true);
@@ -100,10 +108,14 @@ KeyEditor::KeyEditor ()
        reset_button.add (reset_label);
        reset_label.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Reset Bindings to Defaults")));
 
+       print_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::print));
+
        reset_box.pack_start (reset_button, true, false);
+       reset_box.pack_start (print_button, true, false);
        reset_box.show ();
        reset_button.show ();
        reset_label.show ();
+       print_button.show ();
        reset_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::reset));
        vpacker.pack_start (reset_box, false, false);
 
@@ -510,3 +522,51 @@ KeyEditor::search_string_updated (const std::string& filter)
                tab->filter->refilter ();
        }
 }
+
+void
+KeyEditor::print () const
+{
+       stringstream sstr;
+       Bindings::save_all_bindings_as_html (sstr);
+
+       if (sstr.str().empty()) {
+               return;
+       }
+
+
+       gchar* file_name;
+       GError *err = NULL;
+       gint fd;
+
+       if ((fd = g_file_open_tmp ("akprintXXXXXX.html", &file_name, &err)) < 0) {
+               if (err) {
+                       error << string_compose (_("Could not open temporary file to print bindings (%1)"), err->message) << endmsg;
+                       g_error_free (err);
+               }
+               return;
+       }
+
+#ifdef PLATFORM_WINDOWS
+       ::close (fd);
+#endif
+
+       err = NULL;
+
+       if (!g_file_set_contents (file_name, sstr.str().c_str(), sstr.str().size(), &err)) {
+#ifndef PLATFORM_WINDOWS
+               ::close (fd);
+#endif
+               g_unlink (file_name);
+               if (err) {
+                       error << string_compose (_("Could not save bindings to file (%1)"), err->message) << endmsg;
+                       g_error_free (err);
+               }
+               return;
+       }
+
+#ifndef PLATFORM_WINDOWS
+       ::close (fd);
+#endif
+
+       PBD::open_uri (string_compose ("file:///%1", file_name));
+}