// handle inputenc etc.
writeEncodingPreamble(os, features, texrow);
- if (!listings_params.empty()) {
+ if (!listings_params.empty() || features.isRequired("listings")) {
os << "\\usepackage{listings}\n";
texrow.newline();
+ }
+ if (!listings_params.empty()) {
os << "\\lstset{";
// do not test validity because listings_params is
// supposed to be valid
string par =
InsetListingsParams(listings_params).separatedParams(true);
- os << from_ascii(par);
+ // we can't support all packages, but we should load the color package
+ if (par.find("\\color", 0) != string::npos)
+ features.require("color");
+ os << from_utf8(par);
// count the number of newlines
for (size_t i = 0; i < par.size(); ++i)
if (par[i] == '\n')
"endnotes",
"ifthen",
"amsthm",
- "listings",
+ // listings is handled in BufferParams.cpp
"bm",
"pdfpages",
"relsize",
lastlineLE->setValidator(new QIntValidator(0, 1000000, this));
placementLE->setValidator(new QRegExpValidator(QRegExp("[\\*tbph]*"), this));
+ bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
bc().setOK(okPB);
bc().setApply(applyPB);
bc().setCancel(closePB);
<string>Feedback window</string>
</property>
<property name="frameShape" >
- <enum>QFrame::NoFrame</enum>
+ <enum>QFrame::Box</enum>
</property>
<property name="frameShadow" >
<enum>QFrame::Plain</enum>
</property>
- <property name="lineWidth" >
- <number>0</number>
- </property>
<property name="acceptRichText" >
<bool>false</bool>
</property>
</property>
</widget>
</item>
- <item row="0" column="1" >
+ <item row="0" column="0" >
<widget class="QTextBrowser" name="listingsTB" >
<property name="sizePolicy" >
<sizepolicy>
<property name="acceptDrops" >
<bool>false</bool>
</property>
+ <property name="toolTip" >
+ <string>Feedback window</string>
+ </property>
<property name="frameShape" >
<enum>QFrame::Box</enum>
</property>
</property>
</widget>
</item>
- <item row="0" column="0" >
+ <item row="0" column="1" >
<widget class="QTextEdit" name="listingsED" >
<property name="sizePolicy" >
<sizepolicy>
if (param_string.empty())
os << "\\lstinline" << *delimiter;
else
- os << "\\lstinline[" << from_ascii(param_string) << "]" << *delimiter;
+ os << "\\lstinline[" << from_utf8(param_string) << "]" << *delimiter;
os << code
<< *delimiter;
} else {
void InsetListings::validate(LaTeXFeatures & features) const
{
features.require("listings");
+ string param_string = params().params();
+ if (param_string.find("\\color") != string::npos)
+ features.require("color");
InsetCollapsable::validate(features);
}
bool unclosed = false;
string par2 = par;
// braces are allowed
- if (prefixIs(par, "{") && suffixIs(par, "}"))
+ if (prefixIs(par, "{") && suffixIs(par, "}") && !suffixIs(par, "\\}"))
par2 = par.substr(1, par.size() - 2);
- else if (prefixIs(par, "{")) {
- par2 = par.substr(1);
- unclosed = true;
- }
+ // check for unmatched braces
+ int braces = 0;
+ for (size_t i = 0; i < par2.size(); ++i) {
+ if (par2[i] == '{' && (i == 0 || par2[i-1] != '\\'))
+ ++braces;
+ else if (par2[i] == '}' && (i == 0 || par2[i-1] != '\\'))
+ --braces;
+ }
+ unclosed = braces != 0;
+
switch (type_) {
case ALL:
return _("A value is expected.");
}
if (unclosed)
- return _("Unbalanced braces!");
+ return _("Unbalanced braces!");
return docstring();
case TRUEFALSE:
} else if (par[i] == '=' && braces == 0) {
isValue = true;
continue;
- } else if (par[i] == '{' && i > 0 && par[i - 1] == '=')
- braces ++;
- else if (par[i] == '}'
- && (i == par.size() - 1 || par[i + 1] == ',' || par[i + 1] == '\n'))
- braces --;
+ } else if (par[i] == '{' && i > 0 && par[i-1] != '\\')
+ // don't count a brace in first position
+ ++braces;
+ else if (par[i] == '}' && i != par.size() - 1
+ && (i == 0 || (i > 0 && par[i-1] != '\\')))
+ --braces;
if (isValue)
value += par[i];