2001-02-12 14:09:09 +00:00
/**
* \ file FormBibtex . C
* Copyright 2001 the LyX Team
* Read the file COPYING
*
2002-08-15 16:02:22 +00:00
* \ author Angus Leeming < leeming @ lyx . org >
2002-03-11 17:00:41 +00:00
* \ author John Levon , moz @ compsoc . man . ac . uk
* \ author Herbert Voss , voss @ lyx . org
2001-02-12 14:09:09 +00:00
*/
# ifdef __GNUG__
# pragma implementation
# endif
2001-03-19 16:37:01 +00:00
# include <config.h>
2001-03-21 13:27:03 +00:00
# include "xformsBC.h"
2001-03-19 16:37:01 +00:00
# include "ControlBibtex.h"
2001-02-12 14:09:09 +00:00
# include "FormBibtex.h"
2002-06-13 13:43:51 +00:00
# include "forms/form_bibtex.h"
2002-03-11 09:54:42 +00:00
# include "Tooltips.h"
2002-02-05 20:36:12 +00:00
# include "xforms_helpers.h"
2002-06-13 13:43:51 +00:00
# include FORMS_H_LOCATION
2001-08-22 15:34:39 +00:00
# include "helper_funcs.h"
2002-03-11 09:54:42 +00:00
# include "gettext.h"
# include "debug.h"
2002-02-05 20:36:12 +00:00
# include "support/LAssert.h"
2001-07-29 17:39:01 +00:00
# include "support/lstrings.h"
2001-08-20 13:41:06 +00:00
# include "support/filetools.h"
2002-06-20 20:41:00 +00:00
# include "support/lyxalgo.h"
2001-08-20 13:41:06 +00:00
2001-02-12 14:09:09 +00:00
2002-02-16 15:59:55 +00:00
using std : : vector ;
using std : : sort ;
2002-06-13 13:43:51 +00:00
typedef FormCB < ControlBibtex , FormDB < FD_bibtex > > base_class ;
2001-03-20 10:14:03 +00:00
2002-08-12 14:28:43 +00:00
FormBibtex : : FormBibtex ( )
: base_class ( _ ( " 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
2002-03-12 14:11:15 +00:00
fl_set_input_return ( dialog_ - > input_database , FL_RETURN_CHANGED ) ;
fl_set_input_return ( dialog_ - > input_style , FL_RETURN_CHANGED ) ;
2001-02-12 14:09:09 +00:00
2002-03-12 14:11:15 +00:00
setPrehandler ( dialog_ - > input_database ) ;
setPrehandler ( dialog_ - > input_style ) ;
2002-03-11 18:24:31 +00:00
2002-03-21 21:21:28 +00:00
// Manage the ok, apply, restore and cancel/close buttons
2001-03-15 13:37:04 +00:00
bc ( ) . setOK ( dialog_ - > button_ok ) ;
2002-03-12 14:11:15 +00:00
bc ( ) . setCancel ( dialog_ - > button_close ) ;
2001-02-12 14:09:09 +00:00
2002-03-12 14:11:15 +00:00
bc ( ) . addReadOnly ( dialog_ - > button_database_browse ) ;
bc ( ) . addReadOnly ( dialog_ - > input_database ) ;
bc ( ) . addReadOnly ( dialog_ - > button_style_browse ) ;
2002-06-20 20:41:00 +00:00
bc ( ) . addReadOnly ( dialog_ - > button_style_choose ) ;
bc ( ) . addReadOnly ( dialog_ - > button_rescan ) ;
2002-03-12 14:11:15 +00:00
bc ( ) . addReadOnly ( dialog_ - > input_style ) ;
bc ( ) . addReadOnly ( dialog_ - > check_bibtotoc ) ;
2002-02-05 20:36:12 +00:00
2002-03-11 09:54:42 +00:00
// set up the tooltips
2002-04-02 17:04:23 +00:00
string str = _ ( " The database you want to cite from. Insert it without the default extension \" .bib \" . If you insert it with the browser, LyX strips the extension. Several databases must be separated by a comma: \" natbib, books \" . " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > button_database_browse , str ) ;
2002-03-11 09:54:42 +00:00
2002-06-20 20:41:00 +00:00
str = _ ( " Browse your directory for BibTeX stylefiles " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > button_style_browse , str ) ;
2002-03-11 09:54:42 +00:00
2002-06-20 20:41:00 +00:00
str = _ ( " The BibTeX style to use (only one allowed). Insert it without the default extension \" .bst \" and without path or choose one from the browsers list. Most of the bibstyles are stored in $TEXMF/bibtex/bst. $TEXMF is the root dir of the local TeX tree. " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > input_style , str ) ;
2002-03-11 09:54:42 +00:00
2002-06-20 20:41:00 +00:00
str = _ ( " Activate this option if you want the bibliography to appear in the Table of Contents (which doesn't happen by default) " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > check_bibtotoc , str ) ;
2002-07-02 19:23:10 +00:00
2002-06-20 20:41:00 +00:00
str = _ ( " Choose a BibTeX style from the browsers list " ) ;
tooltips ( ) . init ( dialog_ - > button_style_choose , str ) ;
2002-07-02 19:23:10 +00:00
2002-06-20 20:41:00 +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 ) ;
2002-07-02 19:23:10 +00:00
2001-02-12 14:09:09 +00:00
}
2001-08-20 13:41:06 +00:00
ButtonPolicy : : SMInput FormBibtex : : input ( FL_OBJECT * ob , long )
2001-02-12 14:09:09 +00:00
{
2002-03-12 14:11:15 +00:00
if ( ob = = dialog_ - > button_database_browse ) {
2002-03-21 21:21:28 +00:00
// When browsing, take the first file only
2002-03-12 14:11:15 +00:00
string const in_name = fl_get_input ( dialog_ - > input_database ) ;
2002-03-21 21:21:28 +00:00
string out_name =
2001-08-23 09:04:42 +00:00
controller ( ) . Browse ( " " ,
2002-06-20 20:41:00 +00:00
_ ( " Select Database " ) ,
_ ( " *.bib| BibTeX Databases (*.bib) " ) ) ;
2001-08-20 15:44:24 +00:00
if ( ! out_name . empty ( ) ) {
2001-08-22 15:34:39 +00:00
// add the database to any existing ones
if ( ! in_name . empty ( ) )
2002-04-23 10:52:57 +00:00
out_name = in_name + ' , ' + out_name ;
2001-08-21 14:52:50 +00:00
2002-03-21 21:21:28 +00:00
fl_freeze_form ( form ( ) ) ;
2002-03-12 14:11:15 +00:00
fl_set_input ( dialog_ - > input_database , out_name . c_str ( ) ) ;
2002-03-21 21:21:28 +00:00
fl_unfreeze_form ( form ( ) ) ;
2001-08-20 15:44:24 +00:00
}
2002-06-20 20:41:00 +00:00
} else if ( ob = = dialog_ - > button_style_browse ) {
2002-03-12 14:11:15 +00:00
string const in_name = fl_get_input ( dialog_ - > input_style ) ;
2002-03-21 21:21:28 +00:00
string out_name =
2001-08-20 13:41:06 +00:00
controller ( ) . Browse ( in_name ,
2002-06-20 20:41:00 +00:00
_ ( " Select BibTeX-Style " ) ,
_ ( " *.bst| BibTeX Styles (*.bst) " ) ) ;
2001-08-20 15:44:24 +00:00
if ( ! out_name . empty ( ) ) {
2002-03-21 21:21:28 +00:00
fl_freeze_form ( form ( ) ) ;
2002-03-12 14:11:15 +00:00
fl_set_input ( dialog_ - > input_style , out_name . c_str ( ) ) ;
2002-03-21 21:21:28 +00:00
fl_unfreeze_form ( form ( ) ) ;
2001-08-20 13:41:06 +00:00
}
2002-06-20 20:41:00 +00:00
} else if ( ob = = dialog_ - > button_style_choose ) {
unsigned int selection = fl_get_browser ( dialog_ - > browser_styles ) ;
2002-08-27 20:30:20 +00:00
if ( ! selection )
return ButtonPolicy : : SMI_NOOP ;
string const out_name = fl_get_browser_line ( dialog_ - > browser_styles ,
selection ) ;
2002-07-02 19:23:10 +00:00
fl_set_input ( dialog_ - > input_style ,
2002-08-27 20:30:20 +00:00
ChangeExtension ( out_name , string ( ) ) . c_str ( ) ) ;
2002-07-25 12:07:26 +00:00
} else if ( ob = = dialog_ - > button_rescan ) {
fl_clear_browser ( dialog_ - > browser_styles ) ;
2002-06-20 20:41:00 +00:00
controller ( ) . rescanBibStyles ( ) ;
2002-07-25 12:07:26 +00:00
string const str =
controller ( ) . getBibStyles ( ) ;
fl_add_browser_line ( dialog_ - > browser_styles , str . c_str ( ) ) ;
}
2002-06-20 20:41:00 +00:00
// with an empty database nothing makes sense ...
if ( ! compare ( fl_get_input ( dialog_ - > input_database ) , " " ) ) {
2001-03-19 16:37:01 +00:00
return ButtonPolicy : : SMI_NOOP ;
2001-08-20 13:41:06 +00:00
}
2001-02-12 14:09:09 +00:00
2001-03-19 16:37:01 +00:00
return ButtonPolicy : : SMI_VALID ;
2001-02-12 14:09:09 +00:00
}
void FormBibtex : : update ( )
{
2002-03-12 14:11:15 +00:00
fl_set_input ( dialog_ - > input_database ,
2001-03-19 16:37:01 +00:00
controller ( ) . params ( ) . getContents ( ) . c_str ( ) ) ;
2002-03-21 21:21:28 +00:00
string bibtotoc = " bibtotoc " ;
2001-08-20 13:41:06 +00:00
string bibstyle ( controller ( ) . params ( ) . getOptions ( ) . c_str ( ) ) ;
2002-06-20 20:41:00 +00:00
if ( prefixIs ( bibstyle , bibtotoc ) ) { // bibtotoc exists?
2002-03-12 14:11:15 +00:00
fl_set_button ( dialog_ - > check_bibtotoc , 1 ) ;
2002-06-20 20:41:00 +00:00
if ( contains ( bibstyle , ' , ' ) ) { // bibstyle exists?
bibstyle = split ( bibstyle , bibtotoc , ' , ' ) ;
2001-08-20 13:41:06 +00:00
} else {
2002-06-20 20:41:00 +00:00
bibstyle = string ( ) ;
2001-08-20 13:41:06 +00:00
}
2002-06-20 20:41:00 +00:00
fl_set_input ( dialog_ - > input_style , bibstyle . c_str ( ) ) ;
2001-08-20 13:41:06 +00:00
} else {
2002-03-12 14:11:15 +00:00
fl_set_button ( dialog_ - > check_bibtotoc , 0 ) ;
2002-06-20 20:41:00 +00:00
fl_set_input ( dialog_ - > input_style , bibstyle . c_str ( ) ) ;
2001-08-20 13:41:06 +00:00
}
2002-07-25 12:07:26 +00:00
fl_clear_browser ( dialog_ - > browser_styles ) ;
2002-06-20 20:41:00 +00:00
string const str =
controller ( ) . getBibStyles ( ) ;
fl_add_browser_line ( dialog_ - > browser_styles , str . c_str ( ) ) ;
2001-02-12 14:09:09 +00:00
}
2001-08-22 15:34:39 +00:00
namespace {
string const unique_and_no_extensions ( string const & str_in )
{
2002-02-16 15:59:55 +00:00
vector < string > dbase = getVectorFromString ( str_in ) ;
for ( vector < string > : : iterator it = dbase . begin ( ) ;
2001-08-22 15:34:39 +00:00
it ! = dbase . end ( ) ; + + it ) {
2002-06-20 20:41:00 +00:00
* it = ChangeExtension ( * it , string ( ) ) ;
2001-08-22 15:34:39 +00:00
}
2002-06-20 20:41:00 +00:00
lyx : : eliminate_duplicates ( dbase ) ;
2002-04-23 10:52:57 +00:00
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
void FormBibtex : : apply ( )
{
2002-03-12 14:11:15 +00:00
string const db = fl_get_input ( dialog_ - > input_database ) ;
2001-08-23 09:04:42 +00:00
if ( db . empty ( ) ) {
// no database -> no bibtex-command and no options!
controller ( ) . params ( ) . setContents ( " " ) ;
controller ( ) . params ( ) . setOptions ( " " ) ;
return ;
}
2002-03-21 21:21:28 +00:00
2001-08-22 15:34:39 +00:00
controller ( ) . params ( ) . setContents ( unique_and_no_extensions ( db ) ) ;
// empty is valid!
2002-03-12 14:11:15 +00:00
string bibstyle = fl_get_input ( dialog_ - > input_style ) ;
2001-08-22 15:34:39 +00:00
if ( ! bibstyle . empty ( ) ) {
// save the BibTeX style without any ".bst" extension
bibstyle = ChangeExtension ( OnlyFilename ( bibstyle ) , " " ) ;
}
2001-08-20 13:41:06 +00:00
2002-03-12 14:11:15 +00:00
bool const bibtotoc = fl_get_button ( dialog_ - > check_bibtotoc ) ;
2002-03-21 21:21:28 +00:00
2001-08-23 09:04:42 +00:00
if ( bibtotoc & & ( ! bibstyle . empty ( ) ) ) {
2001-08-20 13:41:06 +00:00
// both bibtotoc and style
2002-06-20 20:41:00 +00:00
controller ( ) . params ( ) . setOptions ( " bibtotoc, " + bibstyle ) ;
2001-08-23 09:04:42 +00:00
} else if ( bibtotoc ) {
// bibtotoc and no style
controller ( ) . params ( ) . setOptions ( " bibtotoc " ) ;
2002-05-02 13:34:10 +00:00
} else // all other cases
2001-08-23 09:04:42 +00:00
controller ( ) . params ( ) . setOptions ( bibstyle ) ;
2001-02-12 14:09:09 +00:00
}