2002-03-11 17:00:41 +00:00
/**
2003-02-27 15:57:11 +00:00
* \ file FormCitation . 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 .
2002-03-11 17:00:41 +00:00
*
2002-10-23 10:08:55 +00:00
* \ author Angus Leeming
* \ author Rob Lahaye
2002-09-05 14:10:50 +00:00
*
* Full author contact details are available in file CREDITS
2000-07-07 07:46:37 +00:00
*/
2001-03-28 13:11:08 +00:00
# include <config.h>
2000-08-01 18:11:14 +00:00
# include <algorithm>
2000-07-27 10:26:38 +00:00
2001-03-28 13:11:08 +00:00
# include "xformsBC.h"
2001-03-15 13:37:04 +00:00
# include "ControlCitation.h"
2000-07-27 08:55:59 +00:00
# include "FormCitation.h"
2002-06-13 13:43:51 +00:00
# include "forms/form_citation.h"
2003-02-25 14:51:38 +00:00
# include "Kernel.h"
2002-03-11 09:54:42 +00:00
# include "Tooltips.h"
# include "helper_funcs.h"
# include "xforms_helpers.h"
2002-06-13 13:43:51 +00:00
# include FORMS_H_LOCATION
2001-03-15 13:37:04 +00:00
# include "gettext.h"
2002-02-05 20:36:12 +00:00
# include "support/LAssert.h"
2001-03-15 13:37:04 +00:00
# include "support/lstrings.h"
2000-07-07 07:46:37 +00:00
2000-11-29 15:06:42 +00:00
using std : : find ;
2000-07-07 07:46:37 +00:00
using std : : max ;
using std : : min ;
2000-11-29 15:06:42 +00:00
using std : : pair ;
using std : : sort ;
using std : : vector ;
2000-07-07 07:46:37 +00:00
2001-07-19 14:12:37 +00:00
namespace {
// shamelessly stolen from Menubar_pimpl.C
2002-03-21 21:21:28 +00:00
int string_width ( string const & str )
2001-07-19 14:12:37 +00:00
{
return fl_get_string_widthTAB ( FL_NORMAL_STYLE , FL_NORMAL_SIZE ,
str . c_str ( ) ,
static_cast < int > ( str . length ( ) ) ) ;
}
2002-06-13 13:43:51 +00:00
void fillChoice ( FD_citation * dialog , vector < string > vec )
2001-07-19 14:12:37 +00:00
{
2001-09-24 16:37:24 +00:00
// Check whether the current contents of the browser will be
// changed by loading the contents of the vec...
2003-02-18 12:36:02 +00:00
vector < string > const choice_style = getVector ( dialog - > choice_style ) ;
2001-09-24 16:37:24 +00:00
if ( vec = = choice_style )
return ;
// They will be changed. Proceed
2002-10-23 10:08:55 +00:00
bool const noVec = vec . empty ( ) ;
string const str = noVec ? string ( ) : getStringFromVector ( vec , " | " ) ;
2002-07-02 19:23:10 +00:00
2001-08-28 13:48:40 +00:00
fl_clear_choice ( dialog - > choice_style ) ;
fl_addto_choice ( dialog - > choice_style , str . c_str ( ) ) ;
2002-10-23 10:08:55 +00:00
setEnabled ( dialog - > choice_style , ! noVec ) ;
2001-07-19 14:12:37 +00:00
}
2001-08-28 13:48:40 +00:00
2002-06-13 13:43:51 +00:00
void updateStyle ( FD_citation * dialog , string command )
2001-07-19 14:12:37 +00:00
{
// Find the style of the citekeys
vector < biblio : : CiteStyle > const & styles =
ControlCitation : : getCiteStyles ( ) ;
biblio : : CitationStyle cs = biblio : : getCitationStyle ( command ) ;
vector < biblio : : CiteStyle > : : const_iterator cit =
find ( styles . begin ( ) , styles . end ( ) , cs . style ) ;
// Use this to initialise the GUI
2002-10-23 10:08:55 +00:00
bool const noStyles = cit = = styles . end ( ) ;
int const index = 1 + ( noStyles ? 0 : int ( cit - styles . begin ( ) ) ) ;
fl_set_choice ( dialog - > choice_style , index ) ;
2002-12-01 22:59:25 +00:00
2002-10-23 10:08:55 +00:00
// Disable if there are no styles, otherwise use cs member settings.
fl_set_button ( dialog - > check_full_author_list , ! noStyles & & cs . full ) ;
fl_set_button ( dialog - > check_force_uppercase , ! noStyles & & cs . forceUCase ) ;
2001-07-19 14:12:37 +00:00
}
} // namespace anon
2002-03-21 16:59:12 +00:00
2003-02-25 14:51:38 +00:00
typedef FormController < ControlCitation , FormView < FD_citation > > base_class ;
2001-03-20 10:14:03 +00:00
2002-03-21 16:59:12 +00:00
2003-02-25 14:51:38 +00:00
FormCitation : : FormCitation ( Dialog & parent )
: base_class ( parent , _ ( " Citation " ) )
2001-03-15 13:37:04 +00:00
{ }
2000-07-07 07:46:37 +00:00
2001-03-15 13:37:04 +00:00
void FormCitation : : apply ( )
2000-10-03 05:53:25 +00:00
{
2002-04-24 10:00:39 +00:00
string command = " cite " ;
2002-10-23 10:08:55 +00:00
if ( isActive ( dialog_ - > choice_style ) ) {
2002-04-24 10:00:39 +00:00
vector < biblio : : CiteStyle > const & styles =
ControlCitation : : getCiteStyles ( ) ;
int const choice =
2002-04-26 09:27:45 +00:00
std : : max ( 0 , fl_get_choice ( dialog_ - > choice_style ) - 1 ) ;
2002-04-24 10:00:39 +00:00
bool const full =
fl_get_button ( dialog_ - > check_full_author_list ) ;
bool const force =
fl_get_button ( dialog_ - > check_force_uppercase ) ;
command = biblio : : getCiteCommand ( styles [ choice ] , full , force ) ;
}
2001-07-19 14:12:37 +00:00
controller ( ) . params ( ) . setCmdName ( command ) ;
2001-03-15 13:37:04 +00:00
controller ( ) . params ( ) . setContents ( getStringFromVector ( citekeys ) ) ;
2000-10-03 05:53:25 +00:00
2002-10-23 10:08:55 +00:00
string const after = getString ( dialog_ - > input_after ) ;
2001-03-15 13:37:04 +00:00
controller ( ) . params ( ) . setOptions ( after ) ;
2000-10-20 09:50:09 +00:00
}
2001-03-15 13:37:04 +00:00
void FormCitation : : hide ( )
2000-08-03 12:56:25 +00:00
{
citekeys . clear ( ) ;
bibkeys . clear ( ) ;
2000-10-13 05:57:05 +00:00
2003-02-25 14:51:38 +00:00
FormDialogView : : hide ( ) ;
2000-08-03 12:56:25 +00:00
}
2000-07-07 07:46:37 +00:00
void FormCitation : : build ( )
{
2002-06-13 13:43:51 +00:00
dialog_ . reset ( build_citation ( this ) ) ;
2000-10-20 09:50:09 +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 ) ;
bc ( ) . setApply ( dialog_ - > button_apply ) ;
2002-03-12 14:11:15 +00:00
bc ( ) . setCancel ( dialog_ - > button_close ) ;
2001-04-03 14:30:58 +00:00
bc ( ) . setRestore ( dialog_ - > button_restore ) ;
2001-03-15 13:37:04 +00:00
2002-10-23 10:08:55 +00:00
// disable for read-only documents
2001-03-15 13:37:04 +00:00
bc ( ) . addReadOnly ( dialog_ - > button_add ) ;
bc ( ) . addReadOnly ( dialog_ - > button_del ) ;
bc ( ) . addReadOnly ( dialog_ - > button_up ) ;
bc ( ) . addReadOnly ( dialog_ - > button_down ) ;
bc ( ) . addReadOnly ( dialog_ - > choice_style ) ;
bc ( ) . addReadOnly ( dialog_ - > input_before ) ;
bc ( ) . addReadOnly ( dialog_ - > input_after ) ;
2002-03-12 14:11:15 +00:00
bc ( ) . addReadOnly ( dialog_ - > check_full_author_list ) ;
bc ( ) . addReadOnly ( dialog_ - > check_force_uppercase ) ;
2002-02-05 20:36:12 +00:00
2002-10-23 10:08:55 +00:00
// trigger an input event for cut&paste with middle mouse button.
setPrehandler ( dialog_ - > input_search ) ;
setPrehandler ( dialog_ - > input_before ) ;
setPrehandler ( dialog_ - > input_after ) ;
fl_set_input_return ( dialog_ - > input_after , FL_RETURN_CHANGED ) ;
fl_set_input_return ( dialog_ - > input_before , FL_RETURN_CHANGED ) ;
fl_set_input_return ( dialog_ - > input_search , FL_RETURN_END ) ;
2002-02-05 20:36:12 +00:00
//set up the tooltip mechanism
2002-04-02 17:04:23 +00:00
string str = _ ( " Add the selected entry to the current citation reference. " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > button_add , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Delete the selected entry from the current citation reference. " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > button_del , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Move the selected entry upwards (in the current list). " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > button_up , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Move the selected entry downwards (in the current list). " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > button_down , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " The entries which will be cited. Select them with the arrow buttons from the right browser window. " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > browser_cite , str ) ;
2002-10-28 12:53:23 +00:00
// Work-around xforms' bug; enable tooltips for browser widgets.
setPrehandler ( dialog_ - > browser_cite ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " All entries in the database you have loaded (via \" Insert->Lists&TOC->BibTex Reference \" ). Move the ones you want to cite with the arrow buttons into the left browser window. " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > browser_bib , str ) ;
2002-10-28 12:53:23 +00:00
// Work-around xforms' bug; enable tooltips for browser widgets.
setPrehandler ( dialog_ - > browser_bib ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Information about the selected entry " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > browser_info , str ) ;
2002-10-28 12:53:23 +00:00
// Work-around xforms' bug; enable tooltips for browser widgets.
setPrehandler ( dialog_ - > browser_info ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Here you may select how the citation label should look inside the text (Natbib). " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > choice_style , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-30 17:03:39 +00:00
str = _ ( " Activate if you want to print all authors in a reference with more than three authors, and not \" <First Author> et al. \" (Natbib). " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > check_full_author_list , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Activate if you want to print the first character of the author name as uppercase ( \" Van Gogh \" , not \" van Gogh \" ). Useful at the beginning of sentences (Natbib). " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > check_force_uppercase , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Optional text which appears before the citation reference, e.g. \" see <Ref> \" " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > input_before , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Optional text which appears after the citation reference, e.g. \" pp. 12 \" " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > input_after , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Search your database (all fields will be searched). " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > input_search , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Activate if you want to have case sensitive search: \" bibtex \" finds \" bibtex \" , but not \" BibTeX \" . " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > check_search_case , str ) ;
2002-03-11 09:54:42 +00:00
2002-04-02 17:04:23 +00:00
str = _ ( " Activate if you want to enter Regular Expressions. " ) ;
2002-03-18 15:56:00 +00:00
tooltips ( ) . init ( dialog_ - > check_search_type , str ) ;
2000-07-07 07:46:37 +00:00
}
2001-08-24 14:57:27 +00:00
void FormCitation : : findBiblio ( biblio : : Direction const dir )
{
2002-10-23 10:08:55 +00:00
string const str = getString ( dialog_ - > input_search ) ;
2001-08-24 14:57:27 +00:00
biblio : : InfoMap const & theMap = controller ( ) . bibkeysInfo ( ) ;
bool const caseSensitive =
2002-03-12 14:11:15 +00:00
fl_get_button ( dialog_ - > check_search_case ) ;
2001-08-24 14:57:27 +00:00
biblio : : Search const type =
2002-03-12 14:11:15 +00:00
fl_get_button ( dialog_ - > check_search_type ) ?
2001-08-24 14:57:27 +00:00
biblio : : REGEX : biblio : : SIMPLE ;
vector < string > : : const_iterator start = bibkeys . begin ( ) ;
int const sel = fl_get_browser ( dialog_ - > browser_bib ) ;
if ( sel > = 1 & & sel < = int ( bibkeys . size ( ) ) )
start + = sel - 1 ;
// Find the NEXT instance...
( dir = = biblio : : FORWARD ) ? + + start : - - start ;
vector < string > : : const_iterator const cit =
2002-03-21 16:59:12 +00:00
biblio : : searchKeys ( theMap , bibkeys , str ,
start , type , dir , caseSensitive ) ;
2001-08-24 14:57:27 +00:00
if ( cit = = bibkeys . end ( ) )
return ;
int const found = int ( cit - bibkeys . begin ( ) ) + 1 ;
if ( found = = sel )
return ;
// Update the display
int const top = max ( found - 5 , 1 ) ;
fl_set_browser_topline ( dialog_ - > browser_bib , top ) ;
fl_select_browser_line ( dialog_ - > browser_bib , found ) ;
input ( dialog_ - > browser_bib , 0 ) ;
}
2002-03-21 21:21:28 +00:00
2001-08-24 14:57:27 +00:00
2001-03-15 13:37:04 +00:00
ButtonPolicy : : SMInput FormCitation : : input ( FL_OBJECT * ob , long )
2000-07-07 07:46:37 +00:00
{
2001-03-15 13:37:04 +00:00
ButtonPolicy : : SMInput activate = ButtonPolicy : : SMI_NOOP ;
2001-02-14 18:56:38 +00:00
2001-03-28 13:11:08 +00:00
biblio : : InfoMap const & theMap = controller ( ) . bibkeysInfo ( ) ;
2001-07-19 14:12:37 +00:00
string topCitekey ;
if ( ! citekeys . empty ( ) ) topCitekey = citekeys [ 0 ] ;
2001-03-15 13:37:04 +00:00
if ( ob = = dialog_ - > browser_bib ) {
fl_deselect_browser ( dialog_ - > browser_cite ) ;
unsigned int const sel = fl_get_browser ( dialog_ - > browser_bib ) ;
if ( sel < 1 | | sel > bibkeys . size ( ) )
return ButtonPolicy : : SMI_NOOP ;
// Put into browser_info the additional info associated with
// the selected browser_bib key
fl_clear_browser ( dialog_ - > browser_info ) ;
2001-03-28 13:11:08 +00:00
string const tmp = formatted ( biblio : : getInfo ( theMap ,
2002-08-23 11:47:03 +00:00
bibkeys [ sel - 1 ] ) ,
dialog_ - > browser_info - > w - 10 ) ;
2001-03-15 13:37:04 +00:00
fl_add_browser_line ( dialog_ - > browser_info , tmp . c_str ( ) ) ;
// Highlight the selected browser_bib key in browser_cite if
// present
vector < string > : : const_iterator cit =
2002-08-23 11:47:03 +00:00
find ( citekeys . begin ( ) , citekeys . end ( ) , bibkeys [ sel - 1 ] ) ;
2001-03-15 13:37:04 +00:00
if ( cit ! = citekeys . end ( ) ) {
int const n = int ( cit - citekeys . begin ( ) ) ;
2002-08-23 11:47:03 +00:00
fl_select_browser_line ( dialog_ - > browser_cite , n + 1 ) ;
fl_set_browser_topline ( dialog_ - > browser_cite , n + 1 ) ;
2001-03-15 13:37:04 +00:00
}
2003-02-25 14:51:38 +00:00
if ( ! kernel ( ) . isBufferReadonly ( ) ) {
2001-03-15 13:37:04 +00:00
if ( cit ! = citekeys . end ( ) ) {
setBibButtons ( OFF ) ;
setCiteButtons ( ON ) ;
} else {
setBibButtons ( ON ) ;
setCiteButtons ( OFF ) ;
}
}
} else if ( ob = = dialog_ - > browser_cite ) {
unsigned int const sel = fl_get_browser ( dialog_ - > browser_cite ) ;
if ( sel < 1 | | sel > citekeys . size ( ) )
return ButtonPolicy : : SMI_NOOP ;
2003-02-25 14:51:38 +00:00
if ( ! kernel ( ) . isBufferReadonly ( ) ) {
2001-03-15 13:37:04 +00:00
setBibButtons ( OFF ) ;
setCiteButtons ( ON ) ;
}
// Highlight the selected browser_cite key in browser_bib
vector < string > : : const_iterator cit =
2002-08-23 11:47:03 +00:00
find ( bibkeys . begin ( ) , bibkeys . end ( ) , citekeys [ sel - 1 ] ) ;
2001-03-15 13:37:04 +00:00
if ( cit ! = bibkeys . end ( ) ) {
int const n = int ( cit - bibkeys . begin ( ) ) ;
2002-08-23 11:47:03 +00:00
fl_select_browser_line ( dialog_ - > browser_bib , n + 1 ) ;
fl_set_browser_topline ( dialog_ - > browser_bib , n + 1 ) ;
2001-03-15 13:37:04 +00:00
// Put into browser_info the additional info associated
// with the selected browser_cite key
fl_clear_browser ( dialog_ - > browser_info ) ;
string const tmp =
2003-02-18 12:36:02 +00:00
formatted ( biblio : : getInfo ( theMap , citekeys [ sel - 1 ] ) ,
2002-08-23 11:47:03 +00:00
dialog_ - > browser_info - > w - 10 ) ;
2001-03-15 13:37:04 +00:00
fl_add_browser_line ( dialog_ - > browser_info , tmp . c_str ( ) ) ;
}
} else if ( ob = = dialog_ - > button_add ) {
unsigned int const sel = fl_get_browser ( dialog_ - > browser_bib ) ;
if ( sel < 1 | | sel > bibkeys . size ( ) )
return ButtonPolicy : : SMI_NOOP ;
// Add the selected browser_bib key to browser_cite
fl_addto_browser ( dialog_ - > browser_cite ,
2002-08-23 11:47:03 +00:00
bibkeys [ sel - 1 ] . c_str ( ) ) ;
citekeys . push_back ( bibkeys [ sel - 1 ] ) ;
2001-03-15 13:37:04 +00:00
int const n = int ( citekeys . size ( ) ) ;
fl_select_browser_line ( dialog_ - > browser_cite , n ) ;
setBibButtons ( OFF ) ;
setCiteButtons ( ON ) ;
activate = ButtonPolicy : : SMI_VALID ;
} else if ( ob = = dialog_ - > button_del ) {
unsigned int const sel = fl_get_browser ( dialog_ - > browser_cite ) ;
if ( sel < 1 | | sel > citekeys . size ( ) )
return ButtonPolicy : : SMI_NOOP ;
// Remove the selected key from browser_cite
fl_delete_browser_line ( dialog_ - > browser_cite , sel ) ;
2002-08-23 11:47:03 +00:00
citekeys . erase ( citekeys . begin ( ) + sel - 1 ) ;
2001-03-15 13:37:04 +00:00
setBibButtons ( ON ) ;
setCiteButtons ( OFF ) ;
activate = ButtonPolicy : : SMI_VALID ;
} else if ( ob = = dialog_ - > button_up ) {
unsigned int const sel = fl_get_browser ( dialog_ - > browser_cite ) ;
if ( sel < 2 | | sel > citekeys . size ( ) )
return ButtonPolicy : : SMI_NOOP ;
// Move the selected key up one line
2002-08-23 11:47:03 +00:00
vector < string > : : iterator it = citekeys . begin ( ) + sel - 1 ;
2001-03-15 13:37:04 +00:00
string const tmp = * it ;
fl_delete_browser_line ( dialog_ - > browser_cite , sel ) ;
citekeys . erase ( it ) ;
2002-08-23 11:47:03 +00:00
fl_insert_browser_line ( dialog_ - > browser_cite , sel - 1 , tmp . c_str ( ) ) ;
fl_select_browser_line ( dialog_ - > browser_cite , sel - 1 ) ;
citekeys . insert ( it - 1 , tmp ) ;
2001-03-15 13:37:04 +00:00
setCiteButtons ( ON ) ;
activate = ButtonPolicy : : SMI_VALID ;
} else if ( ob = = dialog_ - > button_down ) {
unsigned int const sel = fl_get_browser ( dialog_ - > browser_cite ) ;
2002-08-23 11:47:03 +00:00
if ( sel < 1 | | sel > citekeys . size ( ) - 1 )
2001-03-15 13:37:04 +00:00
return ButtonPolicy : : SMI_NOOP ;
// Move the selected key down one line
2002-08-23 11:47:03 +00:00
vector < string > : : iterator it = citekeys . begin ( ) + sel - 1 ;
2001-03-15 13:37:04 +00:00
string const tmp = * it ;
fl_delete_browser_line ( dialog_ - > browser_cite , sel ) ;
citekeys . erase ( it ) ;
fl_insert_browser_line ( dialog_ - > browser_cite , sel + 1 , tmp . c_str ( ) ) ;
fl_select_browser_line ( dialog_ - > browser_cite , sel + 1 ) ;
citekeys . insert ( it + 1 , tmp ) ;
setCiteButtons ( ON ) ;
activate = ButtonPolicy : : SMI_VALID ;
2001-08-24 14:57:27 +00:00
} else if ( ob = = dialog_ - > button_previous ) {
findBiblio ( biblio : : BACKWARD ) ;
} else if ( ob = = dialog_ - > button_next ) {
findBiblio ( biblio : : FORWARD ) ;
} else if ( ob = = dialog_ - > input_search ) {
findBiblio ( biblio : : FORWARD ) ;
2001-03-15 13:37:04 +00:00
} else if ( ob = = dialog_ - > choice_style | |
2002-03-12 14:11:15 +00:00
ob = = dialog_ - > check_full_author_list | |
ob = = dialog_ - > check_force_uppercase | |
2001-03-15 13:37:04 +00:00
ob = = dialog_ - > input_before | |
ob = = dialog_ - > input_after ) {
activate = ButtonPolicy : : SMI_VALID ;
2000-07-07 07:46:37 +00:00
}
2001-03-15 13:37:04 +00:00
2001-07-19 14:12:37 +00:00
string currentCitekey ;
if ( ! citekeys . empty ( ) )
currentCitekey = citekeys [ 0 ] ;
if ( topCitekey ! = currentCitekey ) {
2002-04-26 09:27:45 +00:00
int choice = std : : max ( 1 , fl_get_choice ( dialog_ - > choice_style ) ) ;
2001-08-28 13:48:40 +00:00
fillChoice ( dialog_ . get ( ) ,
2001-07-19 14:12:37 +00:00
controller ( ) . getCiteStrings ( currentCitekey ) ) ;
fl_set_choice ( dialog_ - > choice_style , choice ) ;
}
2001-03-15 13:37:04 +00:00
return activate ;
}
void FormCitation : : update ( )
{
// Make the list of all available bibliography keys
2001-03-28 13:11:08 +00:00
bibkeys = biblio : : getKeys ( controller ( ) . bibkeysInfo ( ) ) ;
2001-02-16 18:50:28 +00:00
updateBrowser ( dialog_ - > browser_bib , bibkeys ) ;
2000-07-07 07:46:37 +00:00
2001-02-16 18:50:28 +00:00
// Ditto for the keys cited in this inset
2001-03-15 13:37:04 +00:00
citekeys = getVectorFromString ( controller ( ) . params ( ) . getContents ( ) ) ;
2001-02-16 18:50:28 +00:00
updateBrowser ( dialog_ - > browser_cite , citekeys ) ;
2000-07-07 07:46:37 +00:00
2001-07-19 14:12:37 +00:00
// Use the first citekey to fill choice_style
string key ;
2003-02-18 12:36:02 +00:00
if ( ! citekeys . empty ( ) )
key = citekeys [ 0 ] ;
2001-07-19 14:12:37 +00:00
2001-08-28 13:48:40 +00:00
fillChoice ( dialog_ . get ( ) , controller ( ) . getCiteStrings ( key ) ) ;
2001-07-19 14:12:37 +00:00
// Use the citation command to update the GUI
2001-08-28 13:48:40 +00:00
updateStyle ( dialog_ . get ( ) , controller ( ) . params ( ) . getCmdName ( ) ) ;
2001-08-09 15:10:24 +00:00
bool const natbib = controller ( ) . usingNatbib ( ) ;
2002-03-12 14:11:15 +00:00
setEnabled ( dialog_ - > check_full_author_list , natbib ) ;
setEnabled ( dialog_ - > check_force_uppercase , natbib ) ;
2001-08-09 15:10:24 +00:00
setEnabled ( dialog_ - > choice_style , natbib ) ;
2002-03-21 21:21:28 +00:00
2000-07-07 07:46:37 +00:00
// No keys have been selected yet, so...
2001-02-16 18:50:28 +00:00
fl_clear_browser ( dialog_ - > browser_info ) ;
setBibButtons ( OFF ) ;
setCiteButtons ( OFF ) ;
2000-07-07 07:46:37 +00:00
2001-07-19 14:12:37 +00:00
// Natbib can have comments before and after the citation.
// This is not yet supported. After only.
2001-03-15 13:37:04 +00:00
fl_set_input ( dialog_ - > input_after ,
controller ( ) . params ( ) . getOptions ( ) . c_str ( ) ) ;
2001-07-19 14:12:37 +00:00
fl_set_input ( dialog_ - > input_before , _ ( " Not yet supported " ) ) ;
setEnabled ( dialog_ - > input_before , false ) ;
2000-07-07 07:46:37 +00:00
}
2001-02-16 18:50:28 +00:00
void FormCitation : : updateBrowser ( FL_OBJECT * browser ,
2001-03-15 13:37:04 +00:00
vector < string > const & keys ) const
2000-07-07 07:46:37 +00:00
{
2001-09-24 16:37:24 +00:00
// Check whether the current contents of the browser will be
// changed by loading the contents of the vec...
2002-07-21 15:51:07 +00:00
vector < string > browser_keys = getVector ( browser ) ;
2001-09-24 16:37:24 +00:00
2002-10-15 09:09:48 +00:00
if ( browser_keys = = keys ) {
fl_deselect_browser ( browser ) ;
fl_set_browser_topline ( browser , 1 ) ;
2001-09-24 16:37:24 +00:00
return ;
2002-10-15 09:09:48 +00:00
}
2001-09-24 16:37:24 +00:00
// They will be changed. Proceed.
2001-02-16 18:50:28 +00:00
fl_clear_browser ( browser ) ;
2000-07-07 07:46:37 +00:00
2001-03-21 13:27:03 +00:00
for ( vector < string > : : const_iterator it = keys . begin ( ) ;
2003-02-18 12:36:02 +00:00
it ! = keys . end ( ) ; + + it ) {
2002-07-28 22:50:13 +00:00
string key = trim ( * it ) ;
2001-03-30 13:47:39 +00:00
if ( ! key . empty ( ) )
fl_add_browser_line ( browser , key . c_str ( ) ) ;
2001-03-21 13:27:03 +00:00
}
2000-07-07 07:46:37 +00:00
}
2001-02-16 18:50:28 +00:00
void FormCitation : : setBibButtons ( State status ) const
2000-07-07 07:46:37 +00:00
{
2001-03-05 19:02:40 +00:00
setEnabled ( dialog_ - > button_add , ( status = = ON ) ) ;
2000-07-07 07:46:37 +00:00
}
2001-02-16 18:50:28 +00:00
void FormCitation : : setCiteButtons ( State status ) const
2000-07-07 07:46:37 +00:00
{
2001-03-05 19:02:40 +00:00
int const sel = fl_get_browser ( dialog_ - > browser_cite ) ;
int const maxline = fl_get_browser_maxline ( dialog_ - > browser_cite ) ;
bool const activate = ( status = = ON ) ;
bool const activate_up = ( activate & & sel ! = 1 ) ;
bool const activate_down = ( activate & & sel ! = maxline ) ;
2000-07-07 07:46:37 +00:00
2001-03-05 19:02:40 +00:00
setEnabled ( dialog_ - > button_del , activate ) ;
setEnabled ( dialog_ - > button_up , activate_up ) ;
setEnabled ( dialog_ - > button_down , activate_down ) ;
2000-07-07 07:46:37 +00:00
}