]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/gnome/FormUrl.C
Clean-up of the button controller.
[lyx.git] / src / frontends / gnome / FormUrl.C
index bba80737b5b1e34cd8baf4d2da122d4578d4d884..84e00f07a34a725a23069a9ac4a547727a146d05 100644 (file)
-// -*- C++ -*-
 /* This file is part of
- * ====================================================== 
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995-2000 The LyX Team.
  *
- *           LyX, The Document Processor
+ * ================================================= 
  *
- *           Copyright 2000 The LyX Team.
- *
- * ======================================================
+ * \author Baruch Even
  */
 
-#include <config.h>
-
 #ifdef __GNUG__
 #pragma implementation
 #endif
 
+#include <config.h>
 
-#include "gettext.h"
-#include "Dialogs.h"
+#include "gnomeBC.h"
 #include "FormUrl.h"
-#include "LyXView.h"
-#include "buffer.h"
-#include "lyxfunc.h"
-
-#include <gtk--/label.h>
-#include <gtk--/table.h>
-#include <gtk--/box.h>
-#include <gtk--/buttonbox.h>
-#include <gtk--/base.h>
-#include <gtk--/separator.h>
-
-// temporary solution for LyXView
-#include "mainapp.h"
-extern GLyxAppWin * mainAppWin;
-
-// configuration keys
-static string const CONF_ENTRY_URL("FormUrl_url");
-static string const CONF_ENTRY_NAME("FormUrl_name");
-
-FormUrl::FormUrl(LyXView * lv, Dialogs * d)
-       : lv_(lv), d_(d), inset_(0), u_(0), h_(0), ih_(0), dialog_(NULL)
+
+#include <gtk--/entry.h>
+#include <gtk--/checkbutton.h>
+
+FormUrl::FormUrl(ControlUrl & c)
+       : FormCB<ControlUrl>(c, "diainserturl.glade", "DiaInsertUrl")
+{}
+
+
+FormUrl::~FormUrl()
 {
-  // let the dialog be shown
-  // These are permanent connections so we won't bother
-  // storing a copy because we won't be disconnecting.
-  d->showUrl.connect(slot(this, &FormUrl::showInset));
-  d->createUrl.connect(slot(this, &FormUrl::createInset));
+       // Note that there is no need to destroy the class itself, it seems
+       // like everything is managed inside it. Deleting the class itself will
+       // a crash at the end of the program.
+       //dialog_->destroy();
 }
 
 
-FormUrl::~FormUrl()
+void FormUrl::build()
 {
-  hide();
+       // Connect the buttons.
+       ok_btn()->clicked.connect(SigC::slot(this, &FormUrl::OKClicked));
+       cancel_btn()->clicked.connect(SigC::slot(this, &FormUrl::CancelClicked));
+       apply_btn()->clicked.connect(SigC::slot(this, &FormUrl::ApplyClicked));
+       restore_btn()->clicked.connect(SigC::slot(this, &FormUrl::RestoreClicked));
+
+       // Manage the buttons state
+       bc().setOK(ok_btn());
+       bc().setCancel(cancel_btn());
+       bc().setApply(apply_btn());
+       bc().setRestore(restore_btn());
+
+       // Make sure everything is in the correct state.
+       bc().refresh();
+       
+       // Manage the read-only aware widgets.
+       bc().addReadOnly(html());
+       bc().addReadOnly(name());
+       bc().addReadOnly(url());
 }
 
-void FormUrl::showInset( InsetCommand * const inset )
+
+void FormUrl::connect_signals()
 {
-  if( dialog_!=NULL || inset == 0 ) return;
-  
-  inset_ = inset;
-  ih_ = inset_->hide.connect(slot(this, &FormUrl::hide));
-  
-  params = inset->params();
-  show();
+       // Get notifications on input change
+       slot_url_ = url()->changed.connect(SigC::slot(this, &FormUrl::InputChanged));
+       slot_name_ = name()->changed.connect(SigC::slot(this, &FormUrl::InputChanged));
+       slot_html_ = html()->toggled.connect(SigC::slot(this, &FormUrl::InputChanged));
 }
 
 
-void FormUrl::createInset( string const & arg )
+void FormUrl::disconnect_signals()
 {
-  if( dialog_!=NULL ) return;
-  
-  params.setFromString( arg );
-  show();
+       slot_url_.disconnect();
+       slot_name_.disconnect();
+       slot_html_.disconnect();
 }
 
-void FormUrl::show()
+
+void FormUrl::apply()
 {
-  if (!dialog_)
-    {
-      using namespace Gtk::Box_Helpers;
-
-      Gtk::Label * label;
-      Gtk::Table * table = manage( new Gtk::Table(2, 2, FALSE) );
-      Gtk::Box * mbox = manage( new Gtk::HBox() );
-      Gtk::ButtonBox * bbox = manage( new Gtk::VButtonBox() );
-      Gtk::Separator * sep = manage( new Gtk::VSeparator() );
-
-      url_ = manage( new Gnome::Entry() );
-      name_ = manage( new Gnome::Entry() );
-      html_type_ = manage( new Gtk::CheckButton(N_("HTML type")) );
-      
-      b_ok = Gtk::wrap( GTK_BUTTON( gnome_stock_button(GNOME_STOCK_BUTTON_OK) ) );
-      b_cancel = Gtk::wrap( GTK_BUTTON( gnome_stock_button(GNOME_STOCK_BUTTON_CANCEL) ) );
-      
-      // set up spacing
-      table->set_row_spacings(2);
-      table->set_col_spacings(2);
-      mbox->set_spacing(2);
-      bbox->set_spacing(4);
-
-      // configure entries
-      url_->set_history_id(CONF_ENTRY_URL);
-      url_->set_max_saved(10);
-      url_->load_history();
-      url_->set_use_arrows_always(true);
-      
-      name_->set_history_id(CONF_ENTRY_NAME);
-      name_->set_max_saved(10);
-      name_->load_history();
-      name_->set_use_arrows_always(true);
-      
-      // pack widgets
-      bbox->children().push_back(Element(*b_ok, false, false));
-      bbox->children().push_back(Element(*b_cancel, false, false));
-      
-      label = manage( new Gtk::Label(N_("URL")) );
-      table->attach( *label, 0, 1, 0, 1, 0, 0 );
-      label = manage( new Gtk::Label(N_("Name")) );
-      table->attach( *label, 0, 1, 1, 2, 0, 0 );
-      table->attach( *url_, 1, 2, 0, 1 );
-      table->attach( *name_, 1, 2, 1, 2 );
-
-      mbox->children().push_back(Element(*table));
-      mbox->children().push_back(Element(*html_type_, false, false));
-      mbox->children().push_back(Element(*sep, false, false));
-      mbox->children().push_back(Element(*bbox, false, false));
-      
-      // packing dialog to main window
-      dialog_ = mbox;
-      mainAppWin->add_action(*dialog_, N_(" URL "));
-
-      // setting focus
-      GTK_WIDGET_SET_FLAGS (GTK_WIDGET(url_->get_entry()->gtkobj()), GTK_CAN_DEFAULT);
-      gtk_widget_grab_focus (GTK_WIDGET(url_->get_entry()->gtkobj()));
-      gtk_widget_grab_default (GTK_WIDGET(url_->get_entry()->gtkobj()));
-
-      // connecting signals
-      b_ok->clicked.connect(slot(this, &FormUrl::apply));
-      name_->get_entry()->activate.connect(slot(this, &FormUrl::apply));
-
-      b_cancel->clicked.connect(slot(mainAppWin, &GLyxAppWin::remove_action));
-
-      dialog_->destroy.connect(slot(this, &FormUrl::free));
-
-      u_ = d_->updateBufferDependent.connect(slot(this, &FormUrl::update));
-      h_ = d_->hideBufferDependent.connect(slot(this, &FormUrl::hide));
-
-      update();  // make sure its up-to-date
-    }
+       controller().params().setContents(url()->get_text());
+       controller().params().setOptions(name()->get_text());
+
+       string cmdname("url");
+       if (html()->get_active())
+               cmdname = "htmlurl";
+
+       controller().params().setCmdName(cmdname);
 }
 
-void FormUrl::update(bool switched)
+
+void FormUrl::update()
 {
-  if (switched) {
-      hide();
-      return;
-  }
-
-  if (dialog_ != NULL &&
-      lv_->view()->available())
-    {
-      url_->get_entry()->set_text(params.getContents().c_str());
-      name_->get_entry()->set_text(params.getOptions().c_str());
-
-      html_type_->set_active( (params.getCmdName() == "htmlurl") );
-
-      bool sens = (!(lv_->buffer()->isReadonly()));
-
-      html_type_->set_sensitive(sens);
-      url_->set_sensitive(sens);
-      name_->set_sensitive(sens);
-      b_ok->set_sensitive(sens);
-    }
+       // Disconnect signals so we dont trigger the input changed state.
+       // This avoids the problem of having the buttons enabled when the dialog
+       // starts.
+       disconnect_signals();
+       
+       url()->set_text(controller().params().getContents());
+       name()->set_text(controller().params().getOptions());
+
+       html()->set_active("url" != controller().params().getCmdName());
+
+       // Reconnect the signals.
+       connect_signals();
 }
 
-void FormUrl::hide()
+
+bool FormUrl::validate() const
 {
-  if (dialog_!=NULL) mainAppWin->remove_action();
+       // Always valid! (not really so, needs fixing).
+       return true;
 }
 
-void FormUrl::free()
+
+Gtk::Entry * FormUrl::url() const
 {
-  if (dialog_!=NULL)
-    {
-      dialog_ = NULL;
-      u_.disconnect();
-      h_.disconnect();
-      inset_ = 0;
-      ih_.disconnect();
-    }
+       return getWidget<Gtk::Entry>("url");
 }
 
-void FormUrl::apply()
+Gtk::Entry * FormUrl::name() const
+{
+       return getWidget<Gtk::Entry>("name");
+}
+
+Gtk::CheckButton * FormUrl::html() const
+{
+       return getWidget<Gtk::CheckButton>("html_type");
+}
+
+
+Gtk::Button * FormUrl::ok_btn() const
+{
+       return getWidget<Gtk::Button>("button_ok");
+}
+
+
+Gtk::Button * FormUrl::cancel_btn() const
+{
+       return getWidget<Gtk::Button>("button_cancel");
+}
+
+
+Gtk::Button * FormUrl::apply_btn() const
+{
+       return getWidget<Gtk::Button>("button_apply");
+}
+
+
+Gtk::Button * FormUrl::restore_btn() const
 {
-  if( lv_->buffer()->isReadonly() ) return;
-
-  params.setContents( url_->get_entry()->get_text() );
-  params.setOptions( name_->get_entry()->get_text() );
-
-  if (html_type_->get_active())
-    params.setCmdName("htmlurl");
-  else
-    params.setCmdName("url");
-  
-  if( inset_ != 0 )
-    {
-      // Only update if contents have changed
-      if( params != inset_->params() ) {
-       inset_->setParams( params );
-       lv_->view()->updateInset( inset_, true );
-      }
-    }
-  else
-    {
-      lv_->getLyXFunc()->Dispatch( LFUN_INSERT_URL,
-                                  params.getAsString() );
-    }
-
-  // save history
-  url_->save_history();
-  name_->save_history();
-
-  // hide the dialog
-  hide();
+       return getWidget<Gtk::Button>("button_restore");
 }