// -*- 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), u_(0), h_(0), ih_(0), inset_(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().setUndoAll(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()
{
- if (dialog_ != NULL &&
- lv_->view()->available())
- {
- url_->get_entry()->set_text(params.getContents().c_str());
- name_->get_entry()->set_text(params.getOptions().c_str());
+ // 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();
+}
- html_type_->set_active( (params.getCmdName() == "htmlurl") );
- bool sens = (!(lv_->buffer()->isReadonly()));
+bool FormUrl::validate() const
+{
+ // Always valid! (not really so, needs fixing).
+ return true;
+}
+
- html_type_->set_sensitive(sens);
- url_->set_sensitive(sens);
- name_->set_sensitive(sens);
- b_ok->set_sensitive(sens);
- }
+Gtk::Entry * FormUrl::url() const
+{
+ return getWidget<Gtk::Entry>("url");
}
-void FormUrl::hide()
+Gtk::Entry * FormUrl::name() const
{
- if (dialog_!=NULL) mainAppWin->remove_action();
+ return getWidget<Gtk::Entry>("name");
}
-void FormUrl::free()
+Gtk::CheckButton * FormUrl::html() const
{
- if (dialog_!=NULL)
- {
- dialog_ = NULL;
- u_.disconnect();
- h_.disconnect();
- inset_ = 0;
- ih_.disconnect();
- }
+ return getWidget<Gtk::CheckButton>("html_type");
}
-void FormUrl::apply()
+
+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().c_str() );
- }
-
- // save history
- url_->save_history();
- name_->save_history();
-
- // hide the dialog
- hide();
+ return getWidget<Gtk::Button>("button_restore");
}