2001-02-12 14:09:09 +00:00
/**
* \ file FormBibtex . C
* Copyright 2001 the LyX Team
* Read the file COPYING
*
2002-03-11 17:00:41 +00:00
* \ author Angus Leeming , a . leeming @ ic . ac . uk
* \ 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"
2001-03-20 10:14:03 +00:00
# include "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"
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"
2001-02-12 14:09:09 +00:00
2002-02-16 15:59:55 +00:00
using std : : vector ;
using std : : sort ;
2001-03-20 10:14:03 +00:00
typedef FormCB < ControlBibtex , FormDB < FD_form_bibtex > > base_class ;
2001-03-19 16:37:01 +00:00
FormBibtex : : FormBibtex ( ControlBibtex & c )
2001-03-20 10:14:03 +00:00
: base_class ( c , _ ( " BibTeX Database " ) )
2001-03-19 16:37:01 +00:00
{ }
2001-02-12 14:09:09 +00:00
void FormBibtex : : build ( )
{
2001-03-15 13:37:04 +00:00
dialog_ . reset ( build_bibtex ( ) ) ;
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
2001-02-12 14:09:09 +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 ) ;
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
string str = N_ ( " 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-12 14:11:15 +00:00
tooltips ( ) . initTooltip ( dialog_ - > button_database_browse , str ) ;
2002-03-11 09:54:42 +00:00
str = N_ ( " Browse your directory for BibTeX stylefiles. " ) ;
2002-03-12 14:11:15 +00:00
tooltips ( ) . initTooltip ( dialog_ - > button_style_browse , str ) ;
2002-03-11 09:54:42 +00:00
str = N_ ( " The BibTeX style to use (only one allowed). Insert it without the default extension \" .bst \" and without path. Most of the bibstyles are stored in $TEXMF/bibtex/bst. $TEXMF is the root dir of the local TeX tree. In \" Help->TeX Info \" you can list all installed styles. " ) ;
2002-03-12 14:11:15 +00:00
tooltips ( ) . initTooltip ( dialog_ - > input_style , str ) ;
2002-03-11 09:54:42 +00:00
str = N_ ( " Activate this option if you want the bibliography to appear in the Table of Contents (which doesn't happen by default). " ) ;
2002-03-12 14:11:15 +00:00
tooltips ( ) . initTooltip ( dialog_ - > check_bibtotoc , str ) ;
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 ) {
2001-08-22 15:34:39 +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 ) ;
2001-08-20 13:41:06 +00:00
string out_name =
2001-08-23 09:04:42 +00:00
controller ( ) . Browse ( " " ,
2001-08-20 13:41:06 +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 ( ) )
out_name = in_name + " , " + out_name ;
2001-08-21 14:52:50 +00:00
2001-08-20 15:44:24 +00:00
fl_freeze_form ( form ( ) ) ;
2002-03-12 14:11:15 +00:00
fl_set_input ( dialog_ - > input_database , out_name . c_str ( ) ) ;
2001-08-20 15:44:24 +00:00
fl_unfreeze_form ( form ( ) ) ;
}
2001-08-21 14:52:50 +00:00
}
2001-08-20 13:41:06 +00:00
2002-03-12 14:11:15 +00:00
if ( ob = = dialog_ - > button_style_browse ) {
string const in_name = fl_get_input ( dialog_ - > input_style ) ;
2001-08-20 13:41:06 +00:00
string out_name =
controller ( ) . Browse ( in_name ,
" Select BibTeX-Style " ,
" *.bst| BibTeX Styles (*.bst) " ) ;
2001-08-20 15:44:24 +00:00
if ( ! out_name . empty ( ) ) {
fl_freeze_form ( form ( ) ) ;
2002-03-12 14:11:15 +00:00
fl_set_input ( dialog_ - > input_style , out_name . c_str ( ) ) ;
2001-08-20 15:44:24 +00:00
fl_unfreeze_form ( form ( ) ) ;
2001-08-20 13:41:06 +00:00
}
}
2002-03-12 14:11:15 +00:00
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 ( ) ) ;
2001-08-20 13:41:06 +00:00
string bibtotoc = " bibtotoc " ;
string bibstyle ( controller ( ) . params ( ) . getOptions ( ) . c_str ( ) ) ;
if ( prefixIs ( bibstyle , bibtotoc ) ) { // bibtotoc exists?
2002-03-12 14:11:15 +00:00
fl_set_button ( dialog_ - > check_bibtotoc , 1 ) ;
2001-08-20 13:41:06 +00:00
if ( contains ( bibstyle , ' , ' ) ) { // bibstyle exists?
bibstyle = split ( bibstyle , bibtotoc , ' , ' ) ;
} else {
bibstyle = " " ;
}
2002-03-12 14:11:15 +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 ) ;
fl_set_input ( dialog_ - > input_style , bibstyle . c_str ( ) ) ;
2001-08-20 13:41:06 +00:00
}
2001-02-12 14:09:09 +00:00
}
2001-08-22 15:34:39 +00:00
namespace {
// Remove all duplicate entries in c.
// Taken stright out of Stroustrup
2002-02-16 15:59:55 +00:00
template < class C >
void eliminate_duplicates ( C & c )
2001-08-22 15:34:39 +00:00
{
2002-02-16 15:59:55 +00:00
sort ( c . begin ( ) , c . end ( ) ) ;
typename C : : iterator p = std : : unique ( c . begin ( ) , c . end ( ) ) ;
c . erase ( p , c . end ( ) ) ;
2001-08-22 15:34:39 +00:00
}
2002-02-16 15:59:55 +00:00
2001-08-22 15:34:39 +00:00
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 ) {
* it = ChangeExtension ( * it , " " ) ;
}
eliminate_duplicates ( dbase ) ;
2001-08-23 09:04:42 +00:00
return subst ( getStringFromVector ( dbase ) , " , " , " , " ) ;
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 ;
}
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 ) ;
2001-08-23 09:04:42 +00:00
if ( bibtotoc & & ( ! bibstyle . empty ( ) ) ) {
2001-08-20 13:41:06 +00:00
// both bibtotoc and style
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-02-16 15:59:55 +00:00
} else if ( ! bibstyle . empty ( ) ) {
2001-08-23 09:04:42 +00:00
// only style
controller ( ) . params ( ) . setOptions ( bibstyle ) ;
2001-08-20 13:41:06 +00:00
}
2001-02-12 14:09:09 +00:00
}