mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-16 21:10:26 +00:00
c293be56bd
In particular, the directory frontends/qt4 is renamed to frontends/qt. Many configurations file have to be updated. All mentions of qt4 in the source have been audited, and changed to qt if necessary. The only part that has not been updated is the CMake build system.
356 lines
9.1 KiB
C++
356 lines
9.1 KiB
C++
/**
|
|
* \file GuiInclude.cpp
|
|
* This file is part of LyX, the document processor.
|
|
* Licence details can be found in the file COPYING.
|
|
*
|
|
* \author Alejandro Aguilar Sierra
|
|
* \author John Levon
|
|
* \author Angus Leeming
|
|
*
|
|
* Full author contact details are available in file CREDITS.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "GuiInclude.h"
|
|
|
|
#include "Buffer.h"
|
|
#include "BufferParams.h"
|
|
#include "FuncRequest.h"
|
|
#include "LyXRC.h"
|
|
|
|
#include "qt_helpers.h"
|
|
#include "LyXRC.h"
|
|
|
|
#include "support/gettext.h"
|
|
#include "support/lstrings.h"
|
|
#include "support/os.h"
|
|
#include "support/FileName.h"
|
|
#include "support/filetools.h"
|
|
|
|
#include "insets/InsetListingsParams.h"
|
|
#include "insets/InsetInclude.h"
|
|
|
|
#include <QCheckBox>
|
|
#include <QLineEdit>
|
|
#include <QPushButton>
|
|
|
|
#include <utility>
|
|
|
|
using namespace std;
|
|
using namespace lyx::support;
|
|
using namespace lyx::support::os;
|
|
|
|
namespace lyx {
|
|
namespace frontend {
|
|
|
|
|
|
GuiInclude::GuiInclude(GuiView & lv)
|
|
: GuiDialog(lv, "include", qt_("Child Document")),
|
|
params_(insetCode("include"))
|
|
{
|
|
setupUi(this);
|
|
|
|
connect(buttonBox, SIGNAL(clicked(QAbstractButton *)),
|
|
this, SLOT(slotButtonBox(QAbstractButton *)));
|
|
|
|
connect(visiblespaceCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
|
|
connect(filenameED, SIGNAL(textChanged(const QString &)),
|
|
this, SLOT(change_adaptor()));
|
|
connect(editPB, SIGNAL(clicked()), this, SLOT(edit()));
|
|
connect(browsePB, SIGNAL(clicked()), this, SLOT(browse()));
|
|
connect(typeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
|
|
connect(typeCO, SIGNAL(activated(int)), this, SLOT(typeChanged(int)));
|
|
connect(previewCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
|
|
connect(captionLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
|
|
connect(labelLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
|
|
connect(literalCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
|
|
connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
|
|
connect(listingsED, SIGNAL(textChanged()), this, SLOT(setListingsMsg()));
|
|
connect(bypassCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
|
|
connect(bypassCB, SIGNAL(clicked()), this, SLOT(setListingsMsg()));
|
|
|
|
setFocusProxy(filenameED);
|
|
|
|
bc().setPolicy(ButtonPolicy::OkApplyCancelReadOnlyPolicy);
|
|
bc().setOK(buttonBox->button(QDialogButtonBox::Ok));
|
|
bc().setCancel(buttonBox->button(QDialogButtonBox::Cancel));
|
|
bc().addReadOnly(filenameED);
|
|
bc().addReadOnly(browsePB);
|
|
bc().addReadOnly(visiblespaceCB);
|
|
bc().addReadOnly(typeCO);
|
|
bc().addReadOnly(listingsED);
|
|
|
|
bc().addCheckedLineEdit(filenameED, filenameLA);
|
|
}
|
|
|
|
|
|
void GuiInclude::change_adaptor()
|
|
{
|
|
changed();
|
|
}
|
|
|
|
|
|
docstring GuiInclude::validate_listings_params()
|
|
{
|
|
if (typeCO->currentIndex() != 3 || bypassCB->isChecked())
|
|
return docstring();
|
|
string params = fromqstr(listingsED->toPlainText());
|
|
InsetListingsParams lstparams(params);
|
|
lstparams.setMinted(buffer().params().use_minted);
|
|
return lstparams.validate();
|
|
}
|
|
|
|
|
|
void GuiInclude::setListingsMsg()
|
|
{
|
|
// FIXME THREAD
|
|
static bool isOK = true;
|
|
docstring msg = validate_listings_params();
|
|
if (msg.empty()) {
|
|
if (isOK)
|
|
return;
|
|
isOK = true;
|
|
listingsTB->setPlainText(
|
|
qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
|
|
} else {
|
|
isOK = false;
|
|
listingsTB->setPlainText(toqstr(msg));
|
|
}
|
|
}
|
|
|
|
|
|
void GuiInclude::typeChanged(int v)
|
|
{
|
|
switch (v) {
|
|
//case Include
|
|
case 0:
|
|
visiblespaceCB->setEnabled(false);
|
|
visiblespaceCB->setChecked(false);
|
|
previewCB->setEnabled(false);
|
|
previewCB->setChecked(false);
|
|
listingsGB->setEnabled(false);
|
|
break;
|
|
//case Input
|
|
case 1:
|
|
visiblespaceCB->setEnabled(false);
|
|
visiblespaceCB->setChecked(false);
|
|
previewCB->setEnabled(true);
|
|
listingsGB->setEnabled(false);
|
|
break;
|
|
//case listings
|
|
case 3:
|
|
visiblespaceCB->setEnabled(false);
|
|
visiblespaceCB->setChecked(false);
|
|
previewCB->setEnabled(false);
|
|
previewCB->setChecked(false);
|
|
listingsGB->setEnabled(true);
|
|
break;
|
|
//case Verbatim
|
|
default:
|
|
visiblespaceCB->setEnabled(true);
|
|
previewCB->setEnabled(false);
|
|
previewCB->setChecked(false);
|
|
listingsGB->setEnabled(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void GuiInclude::paramsToDialog(InsetCommandParams const & icp)
|
|
{
|
|
filenameED->setText(toqstr(icp["filename"]));
|
|
|
|
visiblespaceCB->setChecked(false);
|
|
visiblespaceCB->setEnabled(false);
|
|
previewCB->setChecked(false);
|
|
previewCB->setEnabled(false);
|
|
listingsGB->setEnabled(false);
|
|
captionLE->clear();
|
|
labelLE->clear();
|
|
listingsED->clear();
|
|
listingsTB->setPlainText(
|
|
qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
|
|
|
|
string cmdname = icp.getCmdName();
|
|
if (cmdname != "include" &&
|
|
cmdname != "verbatiminput" &&
|
|
cmdname != "verbatiminput*" &&
|
|
cmdname != "lstinputlisting" &&
|
|
cmdname != "inputminted")
|
|
cmdname = "input";
|
|
|
|
if (cmdname == "include") {
|
|
typeCO->setCurrentIndex(0);
|
|
|
|
} else if (cmdname == "input") {
|
|
typeCO->setCurrentIndex(1);
|
|
previewCB->setEnabled(true);
|
|
previewCB->setChecked(icp.preview());
|
|
|
|
} else if (cmdname == "verbatiminput*") {
|
|
typeCO->setCurrentIndex(2);
|
|
visiblespaceCB->setEnabled(true);
|
|
visiblespaceCB->setChecked(true);
|
|
|
|
} else if (cmdname == "verbatiminput") {
|
|
typeCO->setCurrentIndex(2);
|
|
visiblespaceCB->setEnabled(true);
|
|
|
|
} else if (cmdname == "lstinputlisting" || cmdname == "inputminted") {
|
|
typeCO->setCurrentIndex(3);
|
|
listingsGB->setEnabled(true);
|
|
listingsED->setEnabled(true);
|
|
InsetListingsParams par(to_utf8(icp["lstparams"]));
|
|
// extract caption and label and put them into their respective editboxes
|
|
vector<string> pars = getVectorFromString(par.separatedParams(), "\n");
|
|
for (vector<string>::iterator it = pars.begin();
|
|
it != pars.end(); ++it) {
|
|
if (prefixIs(*it, "caption=")) {
|
|
string cap = it->substr(8);
|
|
if (cap[0] == '{' && cap[cap.size() - 1] == '}') {
|
|
captionLE->setText(toqstr(cap.substr(1, cap.size() - 2)));
|
|
*it = "";
|
|
}
|
|
} else if (prefixIs(*it, "label=")) {
|
|
string lbl = it->substr(6);
|
|
if (lbl[0] == '{' && lbl[lbl.size()-1] == '}') {
|
|
labelLE->setText(toqstr(lbl.substr(1, lbl.size() - 2)));
|
|
*it = "";
|
|
}
|
|
}
|
|
}
|
|
// the rest is put to the extra edit box.
|
|
string extra = getStringFromVector(pars);
|
|
listingsED->setPlainText(toqstr(InsetListingsParams(extra).separatedParams()));
|
|
}
|
|
literalCB->setChecked(icp["literal"] == "true");
|
|
|
|
// Make sure that the bc is in the INITIAL state
|
|
if (bc().policy().buttonStatus(ButtonPolicy::OKAY))
|
|
bc().restore();
|
|
}
|
|
|
|
|
|
void GuiInclude::applyView()
|
|
{
|
|
params_["filename"] = from_utf8(internal_path(fromqstr(filenameED->text())));
|
|
params_.preview(previewCB->isChecked());
|
|
|
|
int const item = typeCO->currentIndex();
|
|
if (item == 0) {
|
|
params_.setCmdName("include");
|
|
} else if (item == 1) {
|
|
params_.setCmdName("input");
|
|
} else if (item == 3) {
|
|
if (buffer().params().use_minted)
|
|
params_.setCmdName("inputminted");
|
|
else
|
|
params_.setCmdName("lstinputlisting");
|
|
// the parameter string should have passed validation
|
|
InsetListingsParams par(fromqstr(listingsED->toPlainText()));
|
|
string caption = fromqstr(captionLE->text());
|
|
string label = fromqstr(labelLE->text());
|
|
if (!caption.empty())
|
|
par.addParam("caption", "{" + caption + "}");
|
|
if (!label.empty())
|
|
par.addParam("label", "{" + label + "}");
|
|
string const listparams = par.params();
|
|
params_["lstparams"] = from_utf8(listparams);
|
|
} else {
|
|
if (visiblespaceCB->isChecked())
|
|
params_.setCmdName("verbatiminput*");
|
|
else
|
|
params_.setCmdName("verbatiminput");
|
|
}
|
|
params_["literal"] = literalCB->isChecked()
|
|
? from_ascii("true") : from_ascii("false");
|
|
}
|
|
|
|
|
|
void GuiInclude::browse()
|
|
{
|
|
Type type;
|
|
|
|
int const item = typeCO->currentIndex();
|
|
if (item == 0)
|
|
type = INCLUDE;
|
|
else if (item == 1)
|
|
type = INPUT;
|
|
else if (item == 2)
|
|
type = VERBATIM;
|
|
else
|
|
type = LISTINGS;
|
|
|
|
QString name = browse(filenameED->text(), type);
|
|
if (!name.isEmpty())
|
|
filenameED->setText(name);
|
|
}
|
|
|
|
|
|
void GuiInclude::edit()
|
|
{
|
|
if (!isValid())
|
|
return;
|
|
if (bc().policy().buttonStatus(ButtonPolicy::OKAY)) {
|
|
slotOK();
|
|
applyView();
|
|
} else
|
|
hideView();
|
|
dispatch(FuncRequest(LFUN_INSET_EDIT));
|
|
}
|
|
|
|
|
|
bool GuiInclude::isValid()
|
|
{
|
|
return !filenameED->text().isEmpty() && validate_listings_params().empty();
|
|
}
|
|
|
|
|
|
QString GuiInclude::browse(QString const & in_name, Type in_type) const
|
|
{
|
|
QString const title = qt_("Select document to include");
|
|
|
|
// input TeX, verbatim, or LyX file ?
|
|
QStringList filters;
|
|
switch (in_type) {
|
|
case INCLUDE:
|
|
case INPUT:
|
|
filters = fileFilters(qt_("LaTeX/LyX Documents (*.tex *.lyx)"));
|
|
break;
|
|
case VERBATIM:
|
|
case LISTINGS:
|
|
filters = fileFilters(QString());
|
|
break;
|
|
}
|
|
|
|
QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
|
|
|
|
return browseRelToParent(in_name, docpath, title, filters, false,
|
|
qt_("D&ocuments"), toqstr(lyxrc.document_path));
|
|
}
|
|
|
|
|
|
bool GuiInclude::initialiseParams(std::string const & sdata)
|
|
{
|
|
InsetCommand::string2params(sdata, params_);
|
|
paramsToDialog(params_);
|
|
return true;
|
|
}
|
|
|
|
|
|
void GuiInclude::dispatchParams()
|
|
{
|
|
std::string const lfun = InsetCommand::params2string(params_);
|
|
dispatch(FuncRequest(getLfun(), lfun));
|
|
}
|
|
|
|
|
|
Dialog * createGuiInclude(GuiView & lv) { return new GuiInclude(lv); }
|
|
|
|
|
|
} // namespace frontend
|
|
} // namespace lyx
|
|
|
|
#include "moc_GuiInclude.cpp"
|