]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/FormBibtex.C
(Rob Laheye): changes to the document dialog + some trivia.
[lyx.git] / src / frontends / xforms / FormBibtex.C
1 /**
2  * \file FormBibtex.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming 
7  * \author John Levon
8  * \author Herbert Voss
9  * \author Rob Lahaye
10  *
11  * Full author contact details are available in file CREDITS
12  */
13
14 #ifdef __GNUG__
15 #pragma implementation
16 #endif
17
18 #include <config.h>
19 #include "xformsBC.h"
20 #include "ControlBibtex.h"
21 #include "FormBibtex.h"
22 #include "forms/form_bibtex.h"
23 #include "Tooltips.h"
24 #include "xforms_helpers.h"
25 #include FORMS_H_LOCATION
26
27 #include "helper_funcs.h"
28 #include "gettext.h"
29 #include "support/lstrings.h"
30 #include "support/filetools.h"
31 #include "support/lyxalgo.h"
32
33
34 using std::vector;
35 using std::sort;
36
37
38 typedef FormCB<ControlBibtex, FormDB<FD_bibtex> > base_class;
39
40 FormBibtex::FormBibtex()
41         : base_class(_("BibTeX Database"))
42 {}
43
44
45 void FormBibtex::build()
46 {
47         dialog_.reset(build_bibtex(this));
48
49         // Manage the ok, apply, restore and cancel/close buttons
50         bc().setOK(dialog_->button_ok);
51         bc().setApply(dialog_->button_apply);
52         bc().setCancel(dialog_->button_close);
53         bc().setRestore(dialog_->button_restore);
54
55         // disable for read-only documents
56         bc().addReadOnly(dialog_->input_database);
57         bc().addReadOnly(dialog_->button_database_browse);
58         bc().addReadOnly(dialog_->button_style_browse);
59         bc().addReadOnly(dialog_->button_rescan);
60         bc().addReadOnly(dialog_->input_style);
61         bc().addReadOnly(dialog_->check_bibtotoc);
62
63         // trigger an input event for cut&paste with middle mouse button.
64         setPrehandler(dialog_->input_database);
65         setPrehandler(dialog_->input_style);
66
67         fl_set_input_return(dialog_->input_database, FL_RETURN_CHANGED);
68         fl_set_input_return(dialog_->input_style, FL_RETURN_CHANGED);
69
70         // set up the tooltips
71         string str = _("The database you want to cite from. Insert it "
72                        "without the default extension \".bib\". Use comma "
73                        "to separate databases.");
74         tooltips().init(dialog_->button_database_browse, str);
75
76         str = _("Browse directory for BibTeX stylefiles");
77         tooltips().init(dialog_->button_style_browse, str);
78
79         str = _("The BibTeX style to use (only one allowed). Insert it without "
80                 "the default extension \".bst\" and without path.");
81         tooltips().init(dialog_->input_style, str);
82
83         str = _("Select if the bibliography should appear in the Table "
84                 "of Contents");
85         tooltips().init(dialog_->check_bibtotoc, str);
86
87         str = _("Choose a BibTeX style from the list.");
88         tooltips().init(dialog_->browser_styles, str);
89
90         str = _("Updates your TeX system for a new bibstyle list. Only "
91                 "the styles which are in directories where TeX finds them "
92                 "are listed!");
93         tooltips().init(dialog_->button_rescan, str);
94 }
95
96
97 ButtonPolicy::SMInput FormBibtex::input(FL_OBJECT * ob, long)
98 {
99         if (ob == dialog_->button_database_browse) {
100                 // When browsing, take the first file only
101                 string const in_name = getString(dialog_->input_database);
102                 string out_name =
103                         controller().Browse("",
104                                 _("Select Database"),
105                                 _("*.bib| BibTeX Databases (*.bib)"));
106                 if (!out_name.empty()) {
107                         // add the database to any existing ones
108                         if (!in_name.empty())
109                                 out_name = in_name + ',' + out_name;
110
111                         fl_set_input(dialog_->input_database, out_name.c_str());
112                 }
113
114         } else if (ob == dialog_->button_style_browse) {
115                 string const in_name = getString(dialog_->input_style);
116                 string const style = controller().Browse(in_name,
117                                         _("Select BibTeX-Style"),
118                                         _("*.bst| BibTeX Styles (*.bst)"));
119                 if (!style.empty()) {
120                         fl_set_input(dialog_->input_style, style.c_str());
121                 }
122
123         } else if (ob == dialog_->browser_styles) {
124                 string const style = getString(dialog_->browser_styles);
125                 if (style.empty()) {
126                         return ButtonPolicy::SMI_NOOP;
127                 } else {
128                         fl_set_input(dialog_->input_style,
129                                         ChangeExtension(style, "").c_str());
130                 }
131
132         } else if (ob == dialog_->button_rescan) {
133                 fl_clear_browser(dialog_->browser_styles);
134                 controller().rescanBibStyles();
135                 string const str =
136                         controller().getBibStyles();
137                 fl_add_browser_line(dialog_->browser_styles, str.c_str());
138         }
139
140         // with an empty database nothing makes sense ...
141         if (!compare(fl_get_input(dialog_->input_database), "")) {
142                 return ButtonPolicy::SMI_NOOP;
143         }
144
145         return ButtonPolicy::SMI_VALID;
146 }
147
148
149 void FormBibtex::update()
150 {
151         fl_set_input(dialog_->input_database,
152                      controller().params().getContents().c_str());
153
154         string bibtotoc = "bibtotoc";
155         string bibstyle = controller().params().getOptions();
156
157         bool const bibtotoc_exists = prefixIs(bibstyle, bibtotoc);
158         fl_set_button(dialog_->check_bibtotoc, bibtotoc_exists);
159         if (bibtotoc_exists) {
160                 if (contains(bibstyle, ',')) { // bibstyle exists?
161                         bibstyle = split(bibstyle, bibtotoc, ',');
162                 } else {
163                         bibstyle.erase();
164                 }
165         }
166         fl_set_input(dialog_->input_style, bibstyle.c_str());
167
168         fl_clear_browser(dialog_->browser_styles);
169         string const str = controller().getBibStyles();
170         fl_add_browser_line(dialog_->browser_styles, str.c_str());
171 }
172
173 namespace {
174
175 string const unique_and_no_extensions(string const & str_in)
176 {
177         vector<string> dbase = getVectorFromString(str_in);
178         for (vector<string>::iterator it = dbase.begin();
179              it != dbase.end(); ++it) {
180                 *it = ChangeExtension(*it, string());
181         }
182         lyx::eliminate_duplicates(dbase);
183         return getStringFromVector(dbase);
184 }
185
186 } // namespace anon
187
188
189 void FormBibtex::apply()
190 {
191         string const db = getString(dialog_->input_database);
192         if (db.empty()) {
193                 // no database -> no bibtex-command and no options!
194                 controller().params().setContents("");
195                 controller().params().setOptions("");
196                 return;
197         }
198
199         controller().params().setContents(unique_and_no_extensions(db));
200
201         // empty is valid!
202         string bibstyle = getString(dialog_->input_style);
203         if (!bibstyle.empty()) {
204                 // save the BibTeX style without any ".bst" extension
205                 bibstyle = ChangeExtension(OnlyFilename(bibstyle), "");
206         }
207
208         bool const addtotoc = fl_get_button(dialog_->check_bibtotoc);
209         string const bibtotoc = addtotoc ? "bibtotoc" : "";
210         if (addtotoc && !bibstyle.empty()) {
211                 // Both bibtotoc and style.
212                 controller().params().setOptions(bibtotoc + "," + bibstyle);
213
214         } else {
215                 // At least one of addtotoc and bibstyle is empty. No harm to output both!
216                 controller().params().setOptions(bibtotoc + bibstyle);
217         }
218 }