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 "CheckedLineEdit.h"
20 #include "qt_helpers.h"
24 #include "insets/InsetListingsParams.h"
26 #include <QPushButton>
28 #include <QCloseEvent>
34 using lyx::support::os::internal_path;
35 using lyx::support::prefixIs;
36 using lyx::support::getStringFromVector;
37 using lyx::support::getVectorFromString;
42 /////////////////////////////////////////////////////////////////////
46 /////////////////////////////////////////////////////////////////////
48 GuiIncludeDialog::GuiIncludeDialog(GuiInclude * form)
52 connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
53 connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
55 connect(visiblespaceCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
56 connect(filenameED, SIGNAL(textChanged(const QString &)),
57 this, SLOT(change_adaptor()));
58 connect(editPB, SIGNAL(clicked()), this, SLOT(editClicked()));
59 connect(browsePB, SIGNAL(clicked()), this, SLOT(browseClicked()));
60 connect(typeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
61 connect(typeCO, SIGNAL(activated(int)), this, SLOT(typeChanged(int)));
62 connect(previewCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
63 connect(captionLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
64 connect(labelLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
65 connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
66 connect(listingsED, SIGNAL(textChanged()), this, SLOT(set_listings_msg()));
67 connect(bypassCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
68 connect(bypassCB, SIGNAL(clicked()), this, SLOT(set_listings_msg()));
70 setFocusProxy(filenameED);
74 void GuiIncludeDialog::show()
80 void GuiIncludeDialog::change_adaptor()
86 docstring GuiIncludeDialog::validate_listings_params()
88 // use a cache here to avoid repeated validation
89 // of the same parameters
90 static string param_cache = string();
91 static docstring msg_cache = docstring();
93 if (typeCO->currentIndex() != 3 || bypassCB->isChecked())
96 string params = fromqstr(listingsED->toPlainText());
97 if (params != param_cache) {
99 msg_cache = InsetListingsParams(params).validate();
105 void GuiIncludeDialog::set_listings_msg()
107 static bool isOK = true;
108 docstring msg = validate_listings_params();
113 listingsTB->setPlainText(
114 qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
117 listingsTB->setPlainText(toqstr(msg));
122 void GuiIncludeDialog::closeEvent(QCloseEvent * e)
129 void GuiIncludeDialog::typeChanged(int v)
134 visiblespaceCB->setEnabled(false);
135 visiblespaceCB->setChecked(false);
136 previewCB->setEnabled(false);
137 previewCB->setChecked(false);
138 listingsGB->setEnabled(false);
142 visiblespaceCB->setEnabled(false);
143 visiblespaceCB->setChecked(false);
144 previewCB->setEnabled(true);
145 listingsGB->setEnabled(false);
149 visiblespaceCB->setEnabled(false);
150 visiblespaceCB->setChecked(false);
151 previewCB->setEnabled(false);
152 previewCB->setChecked(false);
153 listingsGB->setEnabled(true);
157 visiblespaceCB->setEnabled(true);
158 previewCB->setEnabled(false);
159 previewCB->setChecked(false);
160 listingsGB->setEnabled(false);
164 // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg118471.html
165 //for the reason this is here.
166 okPB->setDefault(true);
170 void GuiIncludeDialog::editClicked()
176 void GuiIncludeDialog::browseClicked()
182 /////////////////////////////////////////////////////////////////////
186 /////////////////////////////////////////////////////////////////////
189 GuiInclude::GuiInclude(Dialog & parent)
190 : GuiView<GuiIncludeDialog>(parent, _("Child Document"))
194 void GuiInclude::build_dialog()
196 dialog_.reset(new GuiIncludeDialog(this));
198 bcview().setOK(dialog_->okPB);
199 bcview().setCancel(dialog_->closePB);
200 bcview().addReadOnly(dialog_->filenameED);
201 bcview().addReadOnly(dialog_->browsePB);
202 bcview().addReadOnly(dialog_->visiblespaceCB);
203 bcview().addReadOnly(dialog_->typeCO);
204 bcview().addReadOnly(dialog_->listingsED);
206 addCheckedLineEdit(bcview(), dialog_->filenameED, dialog_->filenameLA);
210 void GuiInclude::update_contents()
212 InsetCommandParams const & params = controller().params();
214 dialog_->filenameED->setText(toqstr(params["filename"]));
216 dialog_->visiblespaceCB->setChecked(false);
217 dialog_->visiblespaceCB->setEnabled(false);
218 dialog_->previewCB->setChecked(false);
219 dialog_->previewCB->setEnabled(false);
220 dialog_->listingsGB->setEnabled(false);
221 dialog_->captionLE->clear();
222 dialog_->labelLE->clear();
223 dialog_->listingsED->clear();
224 dialog_->listingsTB->setPlainText(
225 qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
227 string cmdname = controller().params().getCmdName();
228 if (cmdname != "include" &&
229 cmdname != "verbatiminput" &&
230 cmdname != "verbatiminput*" &&
231 cmdname != "lstinputlisting")
234 if (cmdname == "include") {
235 dialog_->typeCO->setCurrentIndex(0);
237 } else if (cmdname == "input") {
238 dialog_->typeCO->setCurrentIndex(1);
239 dialog_->previewCB->setEnabled(true);
240 dialog_->previewCB->setChecked(params.preview());
242 } else if (cmdname == "verbatiminput*") {
243 dialog_->typeCO->setCurrentIndex(2);
244 dialog_->visiblespaceCB->setEnabled(true);
245 dialog_->visiblespaceCB->setChecked(true);
247 } else if (cmdname == "verbatiminput") {
248 dialog_->typeCO->setCurrentIndex(2);
249 dialog_->visiblespaceCB->setEnabled(true);
251 } else if (cmdname == "lstinputlisting") {
252 dialog_->typeCO->setCurrentIndex(3);
253 dialog_->listingsGB->setEnabled(true);
254 dialog_->listingsED->setEnabled(true);
255 InsetListingsParams par(params.getOptions());
256 // extract caption and label and put them into their respective editboxes
257 vector<string> pars = getVectorFromString(par.separatedParams(), "\n");
258 for (vector<string>::iterator it = pars.begin();
259 it != pars.end(); ++it) {
260 if (prefixIs(*it, "caption=")) {
261 string cap = it->substr(8);
262 if (cap[0] == '{' && cap[cap.size()-1] == '}') {
263 dialog_->captionLE->setText(toqstr(cap.substr(1, cap.size()-2)));
266 } else if (prefixIs(*it, "label=")) {
267 string lbl = it->substr(6);
268 if (lbl[0] == '{' && lbl[lbl.size()-1] == '}') {
269 dialog_->labelLE->setText(toqstr(lbl.substr(1, lbl.size()-2)));
274 // the rest is put to the extra edit box.
275 string extra = getStringFromVector(pars);
276 dialog_->listingsED->setPlainText(toqstr(InsetListingsParams(extra).separatedParams()));
281 void GuiInclude::apply()
283 InsetCommandParams params = controller().params();
285 params["filename"] = from_utf8(internal_path(fromqstr(dialog_->filenameED->text())));
286 params.preview(dialog_->previewCB->isChecked());
288 int const item = dialog_->typeCO->currentIndex();
290 params.setCmdName("include");
291 } else if (item == 1) {
292 params.setCmdName("input");
293 } else if (item == 3) {
294 params.setCmdName("lstinputlisting");
295 // the parameter string should have passed validation
296 InsetListingsParams par(fromqstr(dialog_->listingsED->toPlainText()));
297 string caption = fromqstr(dialog_->captionLE->text());
298 string label = fromqstr(dialog_->labelLE->text());
299 if (!caption.empty())
300 par.addParam("caption", "{" + caption + "}");
302 par.addParam("label", "{" + label + "}");
303 params.setOptions(par.params());
305 if (dialog_->visiblespaceCB->isChecked())
306 params.setCmdName("verbatiminput*");
308 params.setCmdName("verbatiminput");
310 controller().setParams(params);
314 void GuiInclude::browse()
316 ControlInclude::Type type;
318 int const item = dialog_->typeCO->currentIndex();
320 type = ControlInclude::INCLUDE;
322 type = ControlInclude::INPUT;
324 type = ControlInclude::VERBATIM;
326 type = ControlInclude::LISTINGS;
328 docstring const & name =
329 controller().browse(qstring_to_ucs4(dialog_->filenameED->text()), type);
331 dialog_->filenameED->setText(toqstr(name));
335 void GuiInclude::edit()
338 string const file = fromqstr(dialog_->filenameED->text());
340 controller().edit(file);
345 bool GuiInclude::isValid()
347 return !dialog_->filenameED->text().isEmpty() &&
348 dialog_->validate_listings_params().empty();
351 } // namespace frontend
354 #include "GuiInclude_moc.cpp"