enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / gtkmm2ext / prompter.cc
index 0ff97103380becd0b74a9191a55425b71fc6bbb5..51628ab13d5f46137b43e20f6bf0c253bbb93487 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 1999 Paul Barton-Davis 
+    Copyright (C) 1999 Paul Barton-Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 #include <gtkmm/stock.h>
 #include <gtkmm2ext/prompter.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtkmm2ext;
 
 Prompter::Prompter (Gtk::Window& parent, bool modal)
        : Gtk::Dialog ("", parent, modal)
+       , first_show (true)
+       , can_accept_from_entry (false)
 {
        init ();
 }
 
 Prompter::Prompter (bool modal)
        : Gtk::Dialog ("", modal)
+       , first_show (true)
+       , can_accept_from_entry (false)
 {
        init ();
 }
@@ -48,34 +52,49 @@ Prompter::init ()
        set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG);
        set_position (Gtk::WIN_POS_MOUSE);
        set_name ("Prompter");
-       
+
        add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
 
-       /* 
+       /*
           Alas a generic 'affirmative' button seems a bit useless sometimes.
           You will have to add your own.
           After adding, use :
           set_response_sensitive (Gtk::RESPONSE_ACCEPT, false)
           to prevent the RESPONSE_ACCEPT button from permitting blank strings.
        */
-       
+
        entryLabel.set_line_wrap (true);
        entryLabel.set_name ("PrompterLabel");
 
        entryBox.set_homogeneous (false);
        entryBox.set_spacing (5);
        entryBox.set_border_width (10);
-       entryBox.pack_start (entryLabel);
-       entryBox.pack_start (entry, false, false);
+       entryBox.pack_start (entryLabel, false, false);
+       entryBox.pack_start (entry, true, true);
 
        get_vbox()->pack_start (entryBox);
        show_all_children();
-       entry.signal_changed().connect (mem_fun (*this, &Prompter::on_entry_changed));
-       entry.signal_activate().connect (bind (mem_fun (*this, &Prompter::response), Gtk::RESPONSE_ACCEPT));
-}      
+}
 
 void
-Prompter::change_labels (string okstr, string cancelstr)
+Prompter::on_show ()
+{
+       /* don't connect to signals till shown, so that we don't change the
+          response sensitivity etc. when the setup of the dialog sets the text.
+       */
+
+       if (first_show) {
+               entry.signal_changed().connect (mem_fun (*this, &Prompter::on_entry_changed));
+               entry.signal_activate().connect (mem_fun (*this, &Prompter::entry_activated));
+               can_accept_from_entry = !entry.get_text().empty();
+               first_show = false;
+       }
+
+       Dialog::on_show ();
+}
+
+void
+Prompter::change_labels (string /*okstr*/, string /*cancelstr*/)
 {
        // dynamic_cast<Gtk::Label*>(ok.get_child())->set_text (okstr);
        // dynamic_cast<Gtk::Label*>(cancel.get_child())->set_text (cancelstr);
@@ -90,20 +109,31 @@ Prompter::get_result (string &str, bool strip)
        }
 }
 
+void
+Prompter::entry_activated ()
+{
+       if (can_accept_from_entry) {
+               response (Gtk::RESPONSE_ACCEPT);
+       } else {
+               response (Gtk::RESPONSE_CANCEL);
+       }
+}
+
 void
 Prompter::on_entry_changed ()
 {
-       /* 
-          This is set up so that entering text in the entry 
-          field makes the RESPONSE_ACCEPT button active. 
-          Of course if you haven't added a RESPONSE_ACCEPT 
+       /*
+          This is set up so that entering text in the entry
+          field makes the RESPONSE_ACCEPT button active.
+          Of course if you haven't added a RESPONSE_ACCEPT
           button, nothing will happen at all.
        */
 
-       if (entry.get_text() != "") {
-         set_response_sensitive (Gtk::RESPONSE_ACCEPT, true);
-         set_default_response (Gtk::RESPONSE_ACCEPT);
+       if (!entry.get_text().empty()) {
+               set_response_sensitive (Gtk::RESPONSE_ACCEPT, true);
+               set_default_response (Gtk::RESPONSE_ACCEPT);
+               can_accept_from_entry = true;
        } else {
-         set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+               set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
        }
 }