3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "support/os.h"
14 #include "support/lstrings.h"
16 #include "GuiInclude.h"
19 #include "qt_helpers.h"
22 #include "insets/InsetListingsParams.h"
24 #include <QPushButton>
26 #include <QCloseEvent>
32 using lyx::support::os::internal_path;
33 using lyx::support::prefixIs;
34 using lyx::support::getStringFromVector;
35 using lyx::support::getVectorFromString;
40 /////////////////////////////////////////////////////////////////////
44 /////////////////////////////////////////////////////////////////////
46 GuiIncludeDialog::GuiIncludeDialog(GuiInclude * form)
50 connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
51 connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
53 connect(visiblespaceCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
54 connect(filenameED, SIGNAL(textChanged(const QString &)),
55 this, SLOT(change_adaptor()));
56 connect(editPB, SIGNAL(clicked()), this, SLOT(editClicked()));
57 connect(browsePB, SIGNAL(clicked()), this, SLOT(browseClicked()));
58 connect(typeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
59 connect(typeCO, SIGNAL(activated(int)), this, SLOT(typeChanged(int)));
60 connect(previewCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
61 connect(captionLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
62 connect(labelLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
63 connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
64 connect(listingsED, SIGNAL(textChanged()), this, SLOT(set_listings_msg()));
65 connect(bypassCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
66 connect(bypassCB, SIGNAL(clicked()), this, SLOT(set_listings_msg()));
68 setFocusProxy(filenameED);
72 void GuiIncludeDialog::show()
78 void GuiIncludeDialog::change_adaptor()
84 docstring GuiIncludeDialog::validate_listings_params()
86 // use a cache here to avoid repeated validation
87 // of the same parameters
88 static string param_cache = string();
89 static docstring msg_cache = docstring();
91 if (typeCO->currentIndex() != 3 || bypassCB->isChecked())
94 string params = fromqstr(listingsED->toPlainText());
95 if (params != param_cache) {
97 msg_cache = InsetListingsParams(params).validate();
103 void GuiIncludeDialog::set_listings_msg()
105 static bool isOK = true;
106 docstring msg = validate_listings_params();
111 listingsTB->setPlainText(
112 qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
115 listingsTB->setPlainText(toqstr(msg));
120 void GuiIncludeDialog::closeEvent(QCloseEvent * e)
127 void GuiIncludeDialog::typeChanged(int v)
132 visiblespaceCB->setEnabled(false);
133 visiblespaceCB->setChecked(false);
134 previewCB->setEnabled(false);
135 previewCB->setChecked(false);
136 listingsGB->setEnabled(false);
140 visiblespaceCB->setEnabled(false);
141 visiblespaceCB->setChecked(false);
142 previewCB->setEnabled(true);
143 listingsGB->setEnabled(false);
147 visiblespaceCB->setEnabled(false);
148 visiblespaceCB->setChecked(false);
149 previewCB->setEnabled(false);
150 previewCB->setChecked(false);
151 listingsGB->setEnabled(true);
155 visiblespaceCB->setEnabled(true);
156 previewCB->setEnabled(false);
157 previewCB->setChecked(false);
158 listingsGB->setEnabled(false);
162 // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg118471.html
163 //for the reason this is here.
164 okPB->setDefault(true);
168 void GuiIncludeDialog::editClicked()
174 void GuiIncludeDialog::browseClicked()
180 /////////////////////////////////////////////////////////////////////
184 /////////////////////////////////////////////////////////////////////
187 GuiInclude::GuiInclude(Dialog & parent)
188 : GuiView<GuiIncludeDialog>(parent, _("Child Document"))
192 void GuiInclude::build_dialog()
194 dialog_.reset(new GuiIncludeDialog(this));
196 bcview().setOK(dialog_->okPB);
197 bcview().setCancel(dialog_->closePB);
198 bcview().addReadOnly(dialog_->filenameED);
199 bcview().addReadOnly(dialog_->browsePB);
200 bcview().addReadOnly(dialog_->visiblespaceCB);
201 bcview().addReadOnly(dialog_->typeCO);
202 bcview().addReadOnly(dialog_->listingsED);
204 addCheckedLineEdit(bcview(), dialog_->filenameED, dialog_->filenameLA);
208 void GuiInclude::update_contents()
210 InsetCommandParams const & params = controller().params();
212 dialog_->filenameED->setText(toqstr(params["filename"]));
214 dialog_->visiblespaceCB->setChecked(false);
215 dialog_->visiblespaceCB->setEnabled(false);
216 dialog_->previewCB->setChecked(false);
217 dialog_->previewCB->setEnabled(false);
218 dialog_->listingsGB->setEnabled(false);
219 dialog_->captionLE->clear();
220 dialog_->labelLE->clear();
221 dialog_->listingsED->clear();
222 dialog_->listingsTB->setPlainText(
223 qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
225 string cmdname = controller().params().getCmdName();
226 if (cmdname != "include" &&
227 cmdname != "verbatiminput" &&
228 cmdname != "verbatiminput*" &&
229 cmdname != "lstinputlisting")
232 if (cmdname == "include") {
233 dialog_->typeCO->setCurrentIndex(0);
235 } else if (cmdname == "input") {
236 dialog_->typeCO->setCurrentIndex(1);
237 dialog_->previewCB->setEnabled(true);
238 dialog_->previewCB->setChecked(params.preview());
240 } else if (cmdname == "verbatiminput*") {
241 dialog_->typeCO->setCurrentIndex(2);
242 dialog_->visiblespaceCB->setEnabled(true);
243 dialog_->visiblespaceCB->setChecked(true);
245 } else if (cmdname == "verbatiminput") {
246 dialog_->typeCO->setCurrentIndex(2);
247 dialog_->visiblespaceCB->setEnabled(true);
249 } else if (cmdname == "lstinputlisting") {
250 dialog_->typeCO->setCurrentIndex(3);
251 dialog_->listingsGB->setEnabled(true);
252 dialog_->listingsED->setEnabled(true);
253 InsetListingsParams par(params.getOptions());
254 // extract caption and label and put them into their respective editboxes
255 vector<string> pars = getVectorFromString(par.separatedParams(), "\n");
256 for (vector<string>::iterator it = pars.begin();
257 it != pars.end(); ++it) {
258 if (prefixIs(*it, "caption=")) {
259 string cap = it->substr(8);
260 if (cap[0] == '{' && cap[cap.size()-1] == '}') {
261 dialog_->captionLE->setText(toqstr(cap.substr(1, cap.size()-2)));
264 } else if (prefixIs(*it, "label=")) {
265 string lbl = it->substr(6);
266 if (lbl[0] == '{' && lbl[lbl.size()-1] == '}') {
267 dialog_->labelLE->setText(toqstr(lbl.substr(1, lbl.size()-2)));
272 // the rest is put to the extra edit box.
273 string extra = getStringFromVector(pars);
274 dialog_->listingsED->setPlainText(toqstr(InsetListingsParams(extra).separatedParams()));
279 void GuiInclude::apply()
281 InsetCommandParams params = controller().params();
283 params["filename"] = from_utf8(internal_path(fromqstr(dialog_->filenameED->text())));
284 params.preview(dialog_->previewCB->isChecked());
286 int const item = dialog_->typeCO->currentIndex();
288 params.setCmdName("include");
289 } else if (item == 1) {
290 params.setCmdName("input");
291 } else if (item == 3) {
292 params.setCmdName("lstinputlisting");
293 // the parameter string should have passed validation
294 InsetListingsParams par(fromqstr(dialog_->listingsED->toPlainText()));
295 string caption = fromqstr(dialog_->captionLE->text());
296 string label = fromqstr(dialog_->labelLE->text());
297 if (!caption.empty())
298 par.addParam("caption", "{" + caption + "}");
300 par.addParam("label", "{" + label + "}");
301 params.setOptions(par.params());
303 if (dialog_->visiblespaceCB->isChecked())
304 params.setCmdName("verbatiminput*");
306 params.setCmdName("verbatiminput");
308 controller().setParams(params);
312 void GuiInclude::browse()
314 ControlInclude::Type type;
316 int const item = dialog_->typeCO->currentIndex();
318 type = ControlInclude::INCLUDE;
320 type = ControlInclude::INPUT;
322 type = ControlInclude::VERBATIM;
324 type = ControlInclude::LISTINGS;
326 docstring const & name =
327 controller().browse(qstring_to_ucs4(dialog_->filenameED->text()), type);
329 dialog_->filenameED->setText(toqstr(name));
333 void GuiInclude::edit()
336 string const file = fromqstr(dialog_->filenameED->text());
338 controller().edit(file);
343 bool GuiInclude::isValid()
345 return !dialog_->filenameED->text().isEmpty() &&
346 dialog_->validate_listings_params().empty();
349 } // namespace frontend
352 #include "GuiInclude_moc.cpp"