2001-02-12 14:09:09 +00:00
|
|
|
/**
|
|
|
|
* \file FormBibtex.C
|
2002-09-05 15:14:23 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
2001-02-12 14:09:09 +00:00
|
|
|
*
|
2002-11-27 10:30:28 +00:00
|
|
|
* \author Angus Leeming
|
2002-09-05 14:10:50 +00:00
|
|
|
* \author John Levon
|
|
|
|
* \author Herbert Voss
|
2002-10-23 10:08:55 +00:00
|
|
|
* \author Rob Lahaye
|
2002-09-05 14:10:50 +00:00
|
|
|
*
|
2003-08-23 00:17:00 +00:00
|
|
|
* Full author contact details are available in file CREDITS.
|
2001-02-12 14:09:09 +00:00
|
|
|
*/
|
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
#include <config.h>
|
2003-09-05 13:15:43 +00:00
|
|
|
|
2001-02-12 14:09:09 +00:00
|
|
|
#include "FormBibtex.h"
|
2003-09-05 13:15:43 +00:00
|
|
|
#include "ControlBibtex.h"
|
2002-06-13 13:43:51 +00:00
|
|
|
#include "forms/form_bibtex.h"
|
2003-09-05 13:15:43 +00:00
|
|
|
|
2002-03-11 09:54:42 +00:00
|
|
|
#include "Tooltips.h"
|
2002-02-05 20:36:12 +00:00
|
|
|
#include "xforms_helpers.h"
|
2003-09-05 13:15:43 +00:00
|
|
|
#include "xformsBC.h"
|
2002-06-13 13:43:51 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
#include "support/filetools.h"
|
2003-09-05 13:15:43 +00:00
|
|
|
#include "support/lstrings.h"
|
2003-09-03 17:40:58 +00:00
|
|
|
#include "support/lyxalgo.h"
|
2001-08-20 13:41:06 +00:00
|
|
|
|
2003-09-05 13:15:43 +00:00
|
|
|
#include "lyx_forms.h"
|
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
using namespace lyx::support;
|
2001-02-12 14:09:09 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
using std::sort;
|
2003-09-05 13:15:43 +00:00
|
|
|
using std::vector;
|
2002-02-16 15:59:55 +00:00
|
|
|
|
|
|
|
|
2003-02-25 14:51:38 +00:00
|
|
|
typedef FormController<ControlBibtex, FormView<FD_bibtex> > base_class;
|
2001-03-20 10:14:03 +00:00
|
|
|
|
2003-02-25 14:51:38 +00:00
|
|
|
FormBibtex::FormBibtex(Dialog & parent)
|
|
|
|
: base_class(parent, _("BibTeX Database"))
|
2001-03-19 16:37:01 +00:00
|
|
|
{}
|
2001-02-12 14:09:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
void FormBibtex::build()
|
|
|
|
{
|
2002-06-13 13:43:51 +00:00
|
|
|
dialog_.reset(build_bibtex(this));
|
2001-02-12 14:09:09 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
// Manage the ok, apply, restore and cancel/close buttons
|
2003-03-10 03:13:28 +00:00
|
|
|
bcview().setOK(dialog_->button_ok);
|
2003-09-03 17:40:58 +00:00
|
|
|
bcview().setApply(dialog_->button_apply);
|
2003-03-10 03:13:28 +00:00
|
|
|
bcview().setCancel(dialog_->button_close);
|
2003-09-03 17:40:58 +00:00
|
|
|
bcview().setRestore(dialog_->button_restore);
|
2001-02-12 14:09:09 +00:00
|
|
|
|
2002-10-23 10:08:55 +00:00
|
|
|
// disable for read-only documents
|
2003-03-10 03:13:28 +00:00
|
|
|
bcview().addReadOnly(dialog_->input_database);
|
2003-09-03 17:40:58 +00:00
|
|
|
bcview().addReadOnly(dialog_->button_database_browse);
|
|
|
|
bcview().addReadOnly(dialog_->button_style_browse);
|
|
|
|
bcview().addReadOnly(dialog_->button_rescan);
|
|
|
|
bcview().addReadOnly(dialog_->input_style);
|
2003-03-10 03:13:28 +00:00
|
|
|
bcview().addReadOnly(dialog_->check_bibtotoc);
|
2002-02-05 20:36:12 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
// trigger an input event for cut&paste with middle mouse button.
|
|
|
|
setPrehandler(dialog_->input_database);
|
|
|
|
setPrehandler(dialog_->input_style);
|
2003-02-22 18:28:07 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
fl_set_input_return(dialog_->input_database, FL_RETURN_CHANGED);
|
|
|
|
fl_set_input_return(dialog_->input_style, FL_RETURN_CHANGED);
|
2002-03-11 09:54:42 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
// callback for double click in browser
|
|
|
|
fl_set_browser_dblclick_callback(dialog_->browser_styles,
|
|
|
|
C_FormDialogView_InputCB, 2);
|
2002-07-02 19:23:10 +00:00
|
|
|
|
2003-09-03 17:28:39 +00:00
|
|
|
// set up the tooltips
|
2003-09-03 17:40:58 +00:00
|
|
|
string str = _("The database you want to cite from. Insert it "
|
|
|
|
"without the default extension \".bib\". Use comma "
|
|
|
|
"to separate databases.");
|
|
|
|
tooltips().init(dialog_->button_database_browse, str);
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
str = _("Browse directory for BibTeX stylefiles");
|
|
|
|
tooltips().init(dialog_->button_style_browse, str);
|
2002-07-02 19:23:10 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
str = _("The BibTeX style to use (only one allowed). Insert it without "
|
|
|
|
"the default extension \".bst\" and without path.");
|
|
|
|
tooltips().init(dialog_->input_style, str);
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
str = _("Select if the bibliography should appear in the Table "
|
|
|
|
"of Contents");
|
2003-09-03 17:28:39 +00:00
|
|
|
tooltips().init(dialog_->check_bibtotoc, str);
|
2001-02-12 14:09:09 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
str = _("Double click to choose a BibTeX style from the list.");
|
|
|
|
tooltips().init(dialog_->browser_styles, str);
|
2001-02-12 14:09:09 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
#if FL_VERSION == 0 || (FL_REVISION == 0 && FL_FIXLEVEL == 0)
|
|
|
|
// Work-around xforms' bug; enable tooltips for browser widgets.
|
|
|
|
setPrehandler(dialog_->browser_styles);
|
|
|
|
#endif
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
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);
|
2003-09-03 17:28:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ButtonPolicy::SMInput FormBibtex::input(FL_OBJECT * ob, long ob_value)
|
2001-02-12 14:09:09 +00:00
|
|
|
{
|
2003-09-03 17:40:58 +00:00
|
|
|
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)"));
|
|
|
|
if (!out_name.empty()) {
|
|
|
|
// add the database to any existing ones
|
|
|
|
if (!in_name.empty())
|
|
|
|
out_name = in_name + ',' + out_name;
|
|
|
|
|
|
|
|
fl_set_input(dialog_->input_database, out_name.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
} 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)"));
|
|
|
|
if (!style.empty()) {
|
|
|
|
fl_set_input(dialog_->input_style, style.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
} 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;
|
|
|
|
} else {
|
|
|
|
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();
|
|
|
|
vector<string> styles;
|
|
|
|
controller().getBibStyles(styles);
|
|
|
|
fl_add_browser_line(dialog_->browser_styles,
|
|
|
|
getStringFromVector(styles, "\n").c_str());
|
|
|
|
}
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
// with an empty database nothing makes sense ...
|
|
|
|
if (!compare(fl_get_input(dialog_->input_database), "")) {
|
|
|
|
return ButtonPolicy::SMI_NOOP;
|
2001-08-20 13:41:06 +00:00
|
|
|
}
|
2002-10-23 10:08:55 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
return ButtonPolicy::SMI_VALID;
|
2003-09-03 17:28:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
void FormBibtex::update()
|
2003-09-03 17:28:39 +00:00
|
|
|
{
|
2003-09-03 17:40:58 +00:00
|
|
|
fl_set_input(dialog_->input_database,
|
|
|
|
controller().params().getContents().c_str());
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
string bibtotoc = "bibtotoc";
|
|
|
|
string bibstyle = controller().params().getOptions();
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
bool const bibtotoc_exists = prefixIs(bibstyle, bibtotoc);
|
|
|
|
fl_set_button(dialog_->check_bibtotoc, bibtotoc_exists);
|
|
|
|
if (bibtotoc_exists) {
|
|
|
|
if (contains(bibstyle, ',')) { // bibstyle exists?
|
|
|
|
bibstyle = split(bibstyle, bibtotoc, ',');
|
|
|
|
} else {
|
|
|
|
bibstyle.erase();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fl_set_input(dialog_->input_style, bibstyle.c_str());
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
vector<string> styles;
|
|
|
|
controller().getBibStyles(styles);
|
2003-06-20 14:03:49 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
fl_clear_browser(dialog_->browser_styles);
|
|
|
|
fl_add_browser_line(dialog_->browser_styles,
|
|
|
|
getStringFromVector(styles, "\n").c_str());
|
2001-02-12 14:09:09 +00:00
|
|
|
}
|
|
|
|
|
2001-08-22 15:34:39 +00:00
|
|
|
namespace {
|
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
string const unique_and_no_extensions(string const & str_in)
|
2003-09-03 17:28:39 +00:00
|
|
|
{
|
2003-09-03 17:40:58 +00:00
|
|
|
vector<string> dbase = getVectorFromString(str_in);
|
|
|
|
for (vector<string>::iterator it = dbase.begin();
|
|
|
|
it != dbase.end(); ++it) {
|
|
|
|
*it = ChangeExtension(*it, string());
|
|
|
|
}
|
|
|
|
lyx::eliminate_duplicates(dbase);
|
|
|
|
return getStringFromVector(dbase);
|
2001-08-22 15:34:39 +00:00
|
|
|
}
|
2002-03-21 21:21:28 +00:00
|
|
|
|
2001-08-22 15:34:39 +00:00
|
|
|
} // namespace anon
|
|
|
|
|
2001-02-12 14:09:09 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
void FormBibtex::apply()
|
2003-09-03 17:28:39 +00:00
|
|
|
{
|
2003-09-03 17:40:58 +00:00
|
|
|
string const db = getString(dialog_->input_database);
|
|
|
|
if (db.empty()) {
|
|
|
|
// no database -> no bibtex-command and no options!
|
|
|
|
controller().params().setContents("");
|
|
|
|
controller().params().setOptions("");
|
|
|
|
return;
|
2003-09-03 17:28:39 +00:00
|
|
|
}
|
2001-08-20 13:41:06 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
controller().params().setContents(unique_and_no_extensions(db));
|
2002-03-21 21:21:28 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
// empty is valid!
|
|
|
|
string bibstyle = getString(dialog_->input_style);
|
|
|
|
if (!bibstyle.empty()) {
|
|
|
|
// save the BibTeX style without any ".bst" extension
|
|
|
|
bibstyle = ChangeExtension(OnlyFilename(bibstyle), "");
|
2002-10-23 10:08:55 +00:00
|
|
|
}
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
bool const addtotoc = fl_get_button(dialog_->check_bibtotoc);
|
|
|
|
string const bibtotoc = addtotoc ? "bibtotoc" : "";
|
|
|
|
if (addtotoc && !bibstyle.empty()) {
|
|
|
|
// Both bibtotoc and style.
|
|
|
|
controller().params().setOptions(bibtotoc + ',' + bibstyle);
|
2003-09-03 17:28:39 +00:00
|
|
|
|
2003-09-03 17:40:58 +00:00
|
|
|
} else {
|
|
|
|
// At least one of addtotoc and bibstyle is empty. No harm to output both!
|
|
|
|
controller().params().setOptions(bibtotoc + bibstyle);
|
|
|
|
}
|
2001-02-12 14:09:09 +00:00
|
|
|
}
|