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"
18 #include "qt_helpers.h"
21 #include "insets/InsetListingsParams.h"
23 #include <QPushButton>
25 #include <QCloseEvent>
31 using lyx::support::os::internal_path;
32 using lyx::support::prefixIs;
33 using lyx::support::getStringFromVector;
34 using lyx::support::getVectorFromString;
39 /////////////////////////////////////////////////////////////////////
43 /////////////////////////////////////////////////////////////////////
45 GuiIncludeDialog::GuiIncludeDialog(GuiInclude * form)
49 connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
50 connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
52 connect(visiblespaceCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
53 connect(filenameED, SIGNAL(textChanged(const QString &)),
54 this, SLOT(change_adaptor()));
55 connect(editPB, SIGNAL(clicked()), this, SLOT(editClicked()));
56 connect(browsePB, SIGNAL(clicked()), this, SLOT(browseClicked()));
57 connect(typeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
58 connect(typeCO, SIGNAL(activated(int)), this, SLOT(typeChanged(int)));
59 connect(previewCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
60 connect(captionLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
61 connect(labelLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
62 connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
63 connect(listingsED, SIGNAL(textChanged()), this, SLOT(set_listings_msg()));
64 connect(bypassCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
65 connect(bypassCB, SIGNAL(clicked()), this, SLOT(set_listings_msg()));
67 setFocusProxy(filenameED);
71 void GuiIncludeDialog::showView()
77 void GuiIncludeDialog::change_adaptor()
83 docstring GuiIncludeDialog::validate_listings_params()
85 // use a cache here to avoid repeated validation
86 // of the same parameters
87 static string param_cache = string();
88 static docstring msg_cache = docstring();
90 if (typeCO->currentIndex() != 3 || bypassCB->isChecked())
93 string params = fromqstr(listingsED->toPlainText());
94 if (params != param_cache) {
96 msg_cache = InsetListingsParams(params).validate();
102 void GuiIncludeDialog::set_listings_msg()
104 static bool isOK = true;
105 docstring msg = validate_listings_params();
110 listingsTB->setPlainText(
111 qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
114 listingsTB->setPlainText(toqstr(msg));
119 void GuiIncludeDialog::closeEvent(QCloseEvent * e)
126 void GuiIncludeDialog::typeChanged(int v)
131 visiblespaceCB->setEnabled(false);
132 visiblespaceCB->setChecked(false);
133 previewCB->setEnabled(false);
134 previewCB->setChecked(false);
135 listingsGB->setEnabled(false);
139 visiblespaceCB->setEnabled(false);
140 visiblespaceCB->setChecked(false);
141 previewCB->setEnabled(true);
142 listingsGB->setEnabled(false);
146 visiblespaceCB->setEnabled(false);
147 visiblespaceCB->setChecked(false);
148 previewCB->setEnabled(false);
149 previewCB->setChecked(false);
150 listingsGB->setEnabled(true);
154 visiblespaceCB->setEnabled(true);
155 previewCB->setEnabled(false);
156 previewCB->setChecked(false);
157 listingsGB->setEnabled(false);
161 // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg118471.html
162 //for the reason this is here.
163 okPB->setDefault(true);
167 void GuiIncludeDialog::editClicked()
173 void GuiIncludeDialog::browseClicked()
179 /////////////////////////////////////////////////////////////////////
183 /////////////////////////////////////////////////////////////////////
186 GuiInclude::GuiInclude(GuiDialog & parent)
187 : GuiView<GuiIncludeDialog>(parent, _("Child Document"))
191 void GuiInclude::build_dialog()
193 dialog_.reset(new GuiIncludeDialog(this));
195 bc().setOK(dialog_->okPB);
196 bc().setCancel(dialog_->closePB);
197 bc().addReadOnly(dialog_->filenameED);
198 bc().addReadOnly(dialog_->browsePB);
199 bc().addReadOnly(dialog_->visiblespaceCB);
200 bc().addReadOnly(dialog_->typeCO);
201 bc().addReadOnly(dialog_->listingsED);
203 bc().addCheckedLineEdit(dialog_->filenameED, dialog_->filenameLA);
207 void GuiInclude::update_contents()
209 InsetCommandParams const & params = controller().params();
211 dialog_->filenameED->setText(toqstr(params["filename"]));
213 dialog_->visiblespaceCB->setChecked(false);
214 dialog_->visiblespaceCB->setEnabled(false);
215 dialog_->previewCB->setChecked(false);
216 dialog_->previewCB->setEnabled(false);
217 dialog_->listingsGB->setEnabled(false);
218 dialog_->captionLE->clear();
219 dialog_->labelLE->clear();
220 dialog_->listingsED->clear();
221 dialog_->listingsTB->setPlainText(
222 qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
224 string cmdname = controller().params().getCmdName();
225 if (cmdname != "include" &&
226 cmdname != "verbatiminput" &&
227 cmdname != "verbatiminput*" &&
228 cmdname != "lstinputlisting")
231 if (cmdname == "include") {
232 dialog_->typeCO->setCurrentIndex(0);
234 } else if (cmdname == "input") {
235 dialog_->typeCO->setCurrentIndex(1);
236 dialog_->previewCB->setEnabled(true);
237 dialog_->previewCB->setChecked(params.preview());
239 } else if (cmdname == "verbatiminput*") {
240 dialog_->typeCO->setCurrentIndex(2);
241 dialog_->visiblespaceCB->setEnabled(true);
242 dialog_->visiblespaceCB->setChecked(true);
244 } else if (cmdname == "verbatiminput") {
245 dialog_->typeCO->setCurrentIndex(2);
246 dialog_->visiblespaceCB->setEnabled(true);
248 } else if (cmdname == "lstinputlisting") {
249 dialog_->typeCO->setCurrentIndex(3);
250 dialog_->listingsGB->setEnabled(true);
251 dialog_->listingsED->setEnabled(true);
252 InsetListingsParams par(params.getOptions());
253 // extract caption and label and put them into their respective editboxes
254 vector<string> pars = getVectorFromString(par.separatedParams(), "\n");
255 for (vector<string>::iterator it = pars.begin();
256 it != pars.end(); ++it) {
257 if (prefixIs(*it, "caption=")) {
258 string cap = it->substr(8);
259 if (cap[0] == '{' && cap[cap.size()-1] == '}') {
260 dialog_->captionLE->setText(toqstr(cap.substr(1, cap.size()-2)));
263 } else if (prefixIs(*it, "label=")) {
264 string lbl = it->substr(6);
265 if (lbl[0] == '{' && lbl[lbl.size()-1] == '}') {
266 dialog_->labelLE->setText(toqstr(lbl.substr(1, lbl.size()-2)));
271 // the rest is put to the extra edit box.
272 string extra = getStringFromVector(pars);
273 dialog_->listingsED->setPlainText(toqstr(InsetListingsParams(extra).separatedParams()));
278 void GuiInclude::applyView()
280 InsetCommandParams params = controller().params();
282 params["filename"] = from_utf8(internal_path(fromqstr(dialog_->filenameED->text())));
283 params.preview(dialog_->previewCB->isChecked());
285 int const item = dialog_->typeCO->currentIndex();
287 params.setCmdName("include");
288 } else if (item == 1) {
289 params.setCmdName("input");
290 } else if (item == 3) {
291 params.setCmdName("lstinputlisting");
292 // the parameter string should have passed validation
293 InsetListingsParams par(fromqstr(dialog_->listingsED->toPlainText()));
294 string caption = fromqstr(dialog_->captionLE->text());
295 string label = fromqstr(dialog_->labelLE->text());
296 if (!caption.empty())
297 par.addParam("caption", "{" + caption + "}");
299 par.addParam("label", "{" + label + "}");
300 params.setOptions(par.params());
302 if (dialog_->visiblespaceCB->isChecked())
303 params.setCmdName("verbatiminput*");
305 params.setCmdName("verbatiminput");
307 controller().setParams(params);
311 void GuiInclude::browse()
313 ControlInclude::Type type;
315 int const item = dialog_->typeCO->currentIndex();
317 type = ControlInclude::INCLUDE;
319 type = ControlInclude::INPUT;
321 type = ControlInclude::VERBATIM;
323 type = ControlInclude::LISTINGS;
325 docstring const & name =
326 controller().browse(qstring_to_ucs4(dialog_->filenameED->text()), type);
328 dialog_->filenameED->setText(toqstr(name));
332 void GuiInclude::edit()
335 string const file = fromqstr(dialog_->filenameED->text());
337 controller().edit(file);
342 bool GuiInclude::isValid()
344 return !dialog_->filenameED->text().isEmpty() &&
345 dialog_->validate_listings_params().empty();
348 } // namespace frontend
351 #include "GuiInclude_moc.cpp"