]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormBibtex.C
Introduce LFUN_PRINT.
[lyx.git] / src / frontends / xforms / FormBibtex.C
index cbe76f66c3fa29ba9e3324c7cd9bea36f680a2df..71416187e1356669392e783a7089bb184adb3c63 100644 (file)
@@ -3,42 +3,49 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Angus Leeming 
+ * \author Angus Leeming
  * \author John Levon
- * \author Herbert Voss
+ * \author Herbert Voß
  * \author Rob Lahaye
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 #include <config.h>
-#include "xformsBC.h"
-#include "ControlBibtex.h"
+
 #include "FormBibtex.h"
+#include "ControlBibtex.h"
 #include "forms/form_bibtex.h"
+
 #include "Tooltips.h"
 #include "xforms_helpers.h"
-#include FORMS_H_LOCATION
+#include "xformsBC.h"
 
-#include "helper_funcs.h"
-#include "gettext.h"
-#include "support/lstrings.h"
 #include "support/filetools.h"
+#include "support/globbing.h"
+#include "support/lstrings.h"
 #include "support/lyxalgo.h"
 
+#include "lyx_forms.h"
+
+using lyx::support::ChangeExtension;
+using lyx::support::compare;
+using lyx::support::contains;
+using lyx::support::FileFilterList;
+using lyx::support::getStringFromVector;
+using lyx::support::getVectorFromString;
+using lyx::support::OnlyFilename;
+using lyx::support::prefixIs;
+using lyx::support::split;
 
 using std::vector;
-using std::sort;
+using std::string;
 
 
-typedef FormCB<ControlBibtex, FormDB<FD_bibtex> > base_class;
+typedef FormController<ControlBibtex, FormView<FD_bibtex> > base_class;
 
-FormBibtex::FormBibtex()
-       : base_class(_("BibTeX Database"))
+FormBibtex::FormBibtex(Dialog & parent)
+       : base_class(parent, _("BibTeX Database"))
 {}
 
 
@@ -47,18 +54,18 @@ void FormBibtex::build()
        dialog_.reset(build_bibtex(this));
 
        // Manage the ok, apply, restore and cancel/close buttons
-       bc().setOK(dialog_->button_ok);
-       bc().setApply(dialog_->button_apply);
-       bc().setCancel(dialog_->button_close);
-       bc().setRestore(dialog_->button_restore);
+       bcview().setOK(dialog_->button_ok);
+       bcview().setApply(dialog_->button_apply);
+       bcview().setCancel(dialog_->button_close);
+       bcview().setRestore(dialog_->button_restore);
 
        // disable for read-only documents
-       bc().addReadOnly(dialog_->input_database);
-       bc().addReadOnly(dialog_->button_database_browse);
-       bc().addReadOnly(dialog_->button_style_browse);
-       bc().addReadOnly(dialog_->button_rescan);
-       bc().addReadOnly(dialog_->input_style);
-       bc().addReadOnly(dialog_->check_bibtotoc);
+       bcview().addReadOnly(dialog_->input_database);
+       bcview().addReadOnly(dialog_->button_database_browse);
+       bcview().addReadOnly(dialog_->button_style_browse);
+       bcview().addReadOnly(dialog_->button_rescan);
+       bcview().addReadOnly(dialog_->input_style);
+       bcview().addReadOnly(dialog_->check_bibtotoc);
 
        // trigger an input event for cut&paste with middle mouse button.
        setPrehandler(dialog_->input_database);
@@ -67,6 +74,10 @@ void FormBibtex::build()
        fl_set_input_return(dialog_->input_database, FL_RETURN_CHANGED);
        fl_set_input_return(dialog_->input_style, FL_RETURN_CHANGED);
 
+       // callback for double click in browser
+       fl_set_browser_dblclick_callback(dialog_->browser_styles,
+                                        C_FormDialogView_InputCB, 2);
+
        // set up the tooltips
        string str = _("The database you want to cite from. Insert it "
                       "without the default extension \".bib\". Use comma "
@@ -84,10 +95,13 @@ void FormBibtex::build()
                "of Contents");
        tooltips().init(dialog_->check_bibtotoc, str);
 
-       str = _("Choose a BibTeX style from the list.");
+       str = _("Double click to choose a BibTeX style from the list.");
        tooltips().init(dialog_->browser_styles, str);
+
+#if FL_VERSION == 0 || (FL_REVISION == 0 && FL_FIXLEVEL == 0)
        // Work-around xforms' bug; enable tooltips for browser widgets.
        setPrehandler(dialog_->browser_styles);
+#endif
 
        str = _("Updates your TeX system for a new bibstyle list. Only "
                "the styles which are in directories where TeX finds them "
@@ -96,15 +110,16 @@ void FormBibtex::build()
 }
 
 
-ButtonPolicy::SMInput FormBibtex::input(FL_OBJECT * ob, long)
+ButtonPolicy::SMInput FormBibtex::input(FL_OBJECT * ob, long ob_value)
 {
        if (ob == dialog_->button_database_browse) {
                // When browsing, take the first file only
                string const in_name = getString(dialog_->input_database);
+               FileFilterList const
+                       filter(_("*.bib| BibTeX Databases (*.bib)"));
                string out_name =
-                       controller().Browse("",
-                               _("Select Database"),
-                               _("*.bib| BibTeX Databases (*.bib)"));
+                       controller().browse("", _("Select Database"),
+                                           filter);
                if (!out_name.empty()) {
                        // add the database to any existing ones
                        if (!in_name.empty())
@@ -115,14 +130,16 @@ ButtonPolicy::SMInput FormBibtex::input(FL_OBJECT * ob, long)
 
        } else if (ob == dialog_->button_style_browse) {
                string const in_name = getString(dialog_->input_style);
-               string const style = controller().Browse(in_name,
-                                       _("Select BibTeX-Style"),
-                                       _("*.bst| BibTeX Styles (*.bst)"));
+               FileFilterList const
+                       filter(_("*.bst| BibTeX Styles (*.bst)"));
+               string const style = controller()
+                       .browse(in_name, _("Select BibTeX-Style"), filter);
                if (!style.empty()) {
                        fl_set_input(dialog_->input_style, style.c_str());
                }
 
-       } else if (ob == dialog_->browser_styles) {
+       } else if (ob == dialog_->browser_styles && ob_value == 2) {
+               // double clicked in styles browser
                string const style = getString(dialog_->browser_styles);
                if (style.empty()) {
                        return ButtonPolicy::SMI_NOOP;
@@ -130,13 +147,17 @@ ButtonPolicy::SMInput FormBibtex::input(FL_OBJECT * ob, long)
                        fl_set_input(dialog_->input_style,
                                        ChangeExtension(style, "").c_str());
                }
+               // reset the browser so that the following
+               // single-click callback doesn't do anything
+               fl_deselect_browser(dialog_->browser_styles);
 
        } else if (ob == dialog_->button_rescan) {
                fl_clear_browser(dialog_->browser_styles);
                controller().rescanBibStyles();
-               string const str =
-                       controller().getBibStyles();
-               fl_add_browser_line(dialog_->browser_styles, str.c_str());
+               vector<string> styles;
+               controller().getBibStyles(styles);
+               fl_add_browser_line(dialog_->browser_styles,
+                                   getStringFromVector(styles, "\n").c_str());
        }
 
        // with an empty database nothing makes sense ...
@@ -167,9 +188,12 @@ void FormBibtex::update()
        }
        fl_set_input(dialog_->input_style, bibstyle.c_str());
 
+       vector<string> styles;
+       controller().getBibStyles(styles);
+
        fl_clear_browser(dialog_->browser_styles);
-       string const str = controller().getBibStyles();
-       fl_add_browser_line(dialog_->browser_styles, str.c_str());
+       fl_add_browser_line(dialog_->browser_styles,
+                           getStringFromVector(styles, "\n").c_str());
 }
 
 namespace {
@@ -211,7 +235,7 @@ void FormBibtex::apply()
        string const bibtotoc = addtotoc ? "bibtotoc" : "";
        if (addtotoc && !bibstyle.empty()) {
                // Both bibtotoc and style.
-               controller().params().setOptions(bibtotoc + "," + bibstyle);
+               controller().params().setOptions(bibtotoc + ',' + bibstyle);
 
        } else {
                // At least one of addtotoc and bibstyle is empty. No harm to output both!