]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormBibtex.C
Change glob() API to accept a dir parameter.
[lyx.git] / src / frontends / xforms / FormBibtex.C
index cbe76f66c3fa29ba9e3324c7cd9bea36f680a2df..3703e07f82708cf34b7ec67ba64724e708ce2668 100644 (file)
@@ -3,42 +3,52 @@
  * 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/lstrings.h"
 #include "support/lyxalgo.h"
 
+#include "lyx_forms.h"
 
 using std::vector;
-using std::sort;
+using std::string;
+
+namespace lyx {
 
+using support::ChangeExtension;
+using support::compare;
+using support::contains;
+using support::FileFilterList;
+using support::getStringFromVector;
+using support::getVectorFromString;
+using support::OnlyFilename;
+using support::prefixIs;
+using support::split;
 
-typedef FormCB<ControlBibtex, FormDB<FD_bibtex> > base_class;
+namespace frontend {
 
-FormBibtex::FormBibtex()
-       : base_class(_("BibTeX Database"))
+
+typedef FormController<ControlBibtex, FormView<FD_bibtex> > base_class;
+
+FormBibtex::FormBibtex(Dialog & parent)
+       : base_class(parent, _("BibTeX Database"))
 {}
 
 
@@ -47,18 +57,19 @@ 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);
+       bcview().addReadOnly(dialog_->choice_btprint);
 
        // trigger an input event for cut&paste with middle mouse button.
        setPrehandler(dialog_->input_database);
@@ -67,6 +78,15 @@ 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);
+
+       fl_addto_choice(dialog_->choice_btprint,
+                       _(" all cited references "
+                         "| all uncited references "
+                         "| all references ").c_str());
+
        // set up the tooltips
        string str = _("The database you want to cite from. Insert it "
                       "without the default extension \".bib\". Use comma "
@@ -84,27 +104,30 @@ 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 "
                "are listed!");
        tooltips().init(dialog_->button_rescan, str);
+
+       str = _("The bibliography section contains...");
+       tooltips().init(dialog_->choice_btprint, str);
 }
 
 
-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);
-               string out_name =
-                       controller().Browse("",
-                               _("Select Database"),
-                               _("*.bib| BibTeX Databases (*.bib)"));
+               string out_name = controller().browseBib("");
                if (!out_name.empty()) {
                        // add the database to any existing ones
                        if (!in_name.empty())
@@ -115,14 +138,13 @@ 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)"));
+               string const style = controller().browseBst(in_name);
                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 +152,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 ...
@@ -156,8 +182,10 @@ void FormBibtex::update()
        string bibtotoc = "bibtotoc";
        string bibstyle = controller().params().getOptions();
 
+       bool const bibtopic = controller().usingBibtopic();
        bool const bibtotoc_exists = prefixIs(bibstyle, bibtotoc);
-       fl_set_button(dialog_->check_bibtotoc, bibtotoc_exists);
+       fl_set_button(dialog_->check_bibtotoc, bibtotoc_exists && !bibtopic);
+       setEnabled(dialog_->check_bibtotoc, !bibtopic);
        if (bibtotoc_exists) {
                if (contains(bibstyle, ',')) { // bibstyle exists?
                        bibstyle = split(bibstyle, bibtotoc, ',');
@@ -167,9 +195,22 @@ void FormBibtex::update()
        }
        fl_set_input(dialog_->input_style, bibstyle.c_str());
 
+       string btprint = controller().params().getSecOptions();
+       int btp = 1;
+       if (btprint == "btPrintNotCited")
+               btp = 2;
+       else if (btprint == "btPrintAll")
+               btp = 3;
+
+       fl_set_choice(dialog_->choice_btprint, btp);
+       setEnabled(dialog_->choice_btprint, bibtopic);
+
+       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 {
@@ -181,7 +222,7 @@ string const unique_and_no_extensions(string const & str_in)
             it != dbase.end(); ++it) {
                *it = ChangeExtension(*it, string());
        }
-       lyx::eliminate_duplicates(dbase);
+       eliminate_duplicates(dbase);
        return getStringFromVector(dbase);
 }
 
@@ -195,6 +236,7 @@ void FormBibtex::apply()
                // no database -> no bibtex-command and no options!
                controller().params().setContents("");
                controller().params().setOptions("");
+               controller().params().setSecOptions("");
                return;
        }
 
@@ -211,10 +253,37 @@ 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!
+               // At least one of addtotoc and bibstyle is empty.
+               // No harm to output both!
                controller().params().setOptions(bibtotoc + bibstyle);
        }
+
+       // bibtopic allows three kinds of sections:
+       // 1. sections that include all cited references of the database(s)
+       // 2. sec. that include all uncited references of the database(s)
+       // 3. sec. that include all references of the database(s), cited or not
+       if (controller().usingBibtopic()){
+               int btp = fl_get_choice(dialog_->choice_btprint);
+               switch (btp) {
+               case 1:
+                       controller().params().setSecOptions("btPrintCited");
+                       break;
+               case 2:
+                       controller().params().setSecOptions("btPrintNotCited");
+                       break;
+               case 3:
+                       controller().params().setSecOptions("btPrintAll");
+                       break;
+               }
+       }
+
+       else
+               controller().params().setSecOptions("");
+
 }
+
+} // namespace frontend
+} // namespace lyx