#include "support/debug.h"
#include "support/FileName.h"
#include "support/filetools.h"
-#include "support/foreach.h"
#include "support/gettext.h"
#include "support/lassert.h"
#include "support/lstrings.h"
dviCB->addItem("synctex view -i $$n:0:$$t -o $$o -x \"evince -i %{page+1} $$o\"");
pdfCB->addItem("");
pdfCB->addItem("CMCDDE SUMATRA control [ForwardSearch(\\\"$$o\\\",\\\"$$t\\\",$$n,0,0,1)]");
- pdfCB->addItem("SumatraPDF -reuse-instance $$o -forward-search $$t $$n");
+ pdfCB->addItem("SumatraPDF -reuse-instance \"$$o\" -forward-search \"$$t\" $$n");
pdfCB->addItem("synctex view -i $$n:0:$$t -o $$o -x \"xpdf -raise -remote $$t.tmp $$o %{page+1}\"");
pdfCB->addItem("okular --unique \"$$o#src:$$n $$f\"");
pdfCB->addItem("qpdfview --unique \"$$o#src:$$f:$$n:0\"");
this, SIGNAL(changed()));
connect(latexBibtexED, SIGNAL(textChanged(QString)),
this, SIGNAL(changed()));
+ connect(latexJBibtexCO, SIGNAL(activated(int)),
+ this, SIGNAL(changed()));
connect(latexJBibtexED, SIGNAL(textChanged(QString)),
this, SIGNAL(changed()));
connect(latexIndexCO, SIGNAL(activated(int)),
QString const bibtex = latexBibtexCO->itemData(n).toString();
if (bibtex.isEmpty()) {
latexBibtexED->clear();
- latexBibtexOptionsLA->setText(qt_("Co&mmand:"));
+ latexBibtexOptionsLA->setText(qt_("C&ommand:"));
return;
}
for (LyXRC::CommandSet::const_iterator it = bibtex_alternatives.begin();
}
+void PrefLatex::on_latexJBibtexCO_activated(int n)
+{
+ QString const jbibtex = latexJBibtexCO->itemData(n).toString();
+ if (jbibtex.isEmpty()) {
+ latexJBibtexED->clear();
+ latexJBibtexOptionsLA->setText(qt_("Co&mmand:"));
+ return;
+ }
+ for (LyXRC::CommandSet::const_iterator it = jbibtex_alternatives.begin();
+ it != jbibtex_alternatives.end(); ++it) {
+ QString const bib = toqstr(*it);
+ int ind = bib.indexOf(" ");
+ QString sel_command = bib.left(ind);
+ QString sel_options = ind < 0 ? QString() : bib.mid(ind + 1);
+ if (jbibtex == sel_command) {
+ if (ind < 0)
+ latexJBibtexED->clear();
+ else
+ latexJBibtexED->setText(sel_options.trimmed());
+ }
+ }
+ latexJBibtexOptionsLA->setText(qt_("Opt&ions:"));
+}
+
+
void PrefLatex::on_latexIndexCO_activated(int n)
{
QString const index = latexIndexCO->itemData(n).toString();
else
rc.bibtex_command = fromqstr(bibtex) + " " + fromqstr(bibopt);
+ // If jbibtex is not empty, jbibopt contains the options, otherwise
+ // it is a customized bibtex command with options.
+ QString const jbibtex = latexJBibtexCO->itemData(
+ latexJBibtexCO->currentIndex()).toString();
+ QString const jbibopt = latexJBibtexED->text();
+ if (jbibtex.isEmpty())
+ rc.jbibtex_command = fromqstr(jbibopt);
+ else if (jbibopt.isEmpty())
+ rc.jbibtex_command = fromqstr(jbibtex);
+ else
+ rc.jbibtex_command = fromqstr(jbibtex) + " " + fromqstr(jbibopt);
+
// If index is not empty, idxopt contains the options, otherwise
// it is a customized index command with options.
QString const index = latexIndexCO->itemData(
else
rc.fontenc = "default";
rc.chktex_command = fromqstr(latexChecktexED->text());
- rc.jbibtex_command = fromqstr(latexJBibtexED->text());
rc.jindex_command = fromqstr(latexJIndexED->text());
rc.nomencl_command = fromqstr(latexNomenclED->text());
rc.auto_reset_options = latexAutoresetCB->isChecked();
{
latexBibtexCO->clear();
+ latexBibtexCO->addItem(qt_("Automatic"), "automatic");
latexBibtexCO->addItem(qt_("Custom"), QString());
for (LyXRC::CommandSet::const_iterator it = rc.bibtex_alternatives.begin();
it != rc.bibtex_alternatives.end(); ++it) {
} else {
latexBibtexED->setText(toqstr(rc.bibtex_command));
latexBibtexCO->setCurrentIndex(0);
- latexBibtexOptionsLA->setText(qt_("Co&mmand:"));
+ latexBibtexOptionsLA->setText(qt_("C&ommand:"));
+ }
+
+ latexJBibtexCO->clear();
+
+ latexJBibtexCO->addItem(qt_("Automatic"), "automatic");
+ latexJBibtexCO->addItem(qt_("Custom"), QString());
+ for (LyXRC::CommandSet::const_iterator it = rc.jbibtex_alternatives.begin();
+ it != rc.jbibtex_alternatives.end(); ++it) {
+ QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
+ latexJBibtexCO->addItem(command, command);
+ }
+
+ jbibtex_alternatives = rc.jbibtex_alternatives;
+
+ QString const jbib = toqstr(rc.jbibtex_command);
+ ind = jbib.indexOf(" ");
+ sel_command = jbib.left(ind);
+ sel_options = ind < 0 ? QString() : jbib.mid(ind + 1);
+
+ pos = latexJBibtexCO->findData(sel_command);
+ if (pos != -1) {
+ latexJBibtexCO->setCurrentIndex(pos);
+ latexJBibtexED->setText(sel_options.trimmed());
+ latexJBibtexOptionsLA->setText(qt_("Opt&ions:"));
+ } else {
+ latexJBibtexED->setText(toqstr(rc.bibtex_command));
+ latexJBibtexCO->setCurrentIndex(0);
+ latexJBibtexOptionsLA->setText(qt_("Co&mmand:"));
}
latexIndexCO->clear();
latexEncodingED->setText(toqstr(rc.fontenc));
}
latexChecktexED->setText(toqstr(rc.chktex_command));
- latexJBibtexED->setText(toqstr(rc.jbibtex_command));
latexJIndexED->setText(toqstr(rc.jindex_command));
latexNomenclED->setText(toqstr(rc.nomencl_command));
latexAutoresetCB->setChecked(rc.auto_reset_options);
this, SIGNAL(changed()));
connect(maxAgeLE, SIGNAL(textEdited(QString)),
this, SIGNAL(changed()));
+ connect(needauthForbiddenCB, SIGNAL(toggled(bool)),
+ this, SIGNAL(changed()));
+ connect(needauthCB, SIGNAL(toggled(bool)),
+ this, SIGNAL(changed()));
converterED->setValidator(new NoNewLineValidator(converterED));
converterFlagED->setValidator(new NoNewLineValidator(converterFlagED));
void PrefConverters::applyRC(LyXRC & rc) const
{
rc.use_converter_cache = cacheCB->isChecked();
+ rc.use_converter_needauth_forbidden = needauthForbiddenCB->isChecked();
+ rc.use_converter_needauth = needauthCB->isChecked();
rc.converter_cache_maxage = int(widgetToDouble(maxAgeLE) * 86400.0);
}
void PrefConverters::updateRC(LyXRC const & rc)
{
cacheCB->setChecked(rc.use_converter_cache);
+ needauthForbiddenCB->setChecked(rc.use_converter_needauth_forbidden);
+ needauthCB->setChecked(rc.use_converter_needauth);
QString max_age;
doubleToWidget(maxAgeLE, (double(rc.converter_cache_maxage) / 86400.0), 'g', 6);
updateGui();
void PrefConverters::updateGui()
{
+ QString const pattern("%1 -> %2");
form_->formats().sort();
form_->converters().update(form_->formats());
// save current selection
- QString current = converterFromCO->currentText()
- + " -> " + converterToCO->currentText();
+ QString current =
+ pattern
+ .arg(converterFromCO->currentText())
+ .arg(converterToCO->currentText());
converterFromCO->clear();
converterToCO->clear();
- Formats::const_iterator cit = form_->formats().begin();
- Formats::const_iterator end = form_->formats().end();
- for (; cit != end; ++cit) {
- converterFromCO->addItem(qt_(cit->prettyname()));
- converterToCO->addItem(qt_(cit->prettyname()));
+ for (Format const & f : form_->formats()) {
+ QString const name = toqstr(translateIfPossible(f.prettyname()));
+ converterFromCO->addItem(name);
+ converterToCO->addItem(name);
}
// currentRowChanged(int) is also triggered when updating the listwidget
convertersLW->blockSignals(true);
convertersLW->clear();
- Converters::const_iterator ccit = form_->converters().begin();
- Converters::const_iterator cend = form_->converters().end();
- for (; ccit != cend; ++ccit) {
+ for (Converter const & c : form_->converters()) {
QString const name =
- qt_(ccit->From()->prettyname()) + " -> " + qt_(ccit->To()->prettyname());
- int type = form_->converters().getNumber(ccit->From()->name(), ccit->To()->name());
+ pattern
+ .arg(toqstr(translateIfPossible(c.From()->prettyname())))
+ .arg(toqstr(translateIfPossible(c.To()->prettyname())));
+ int type = form_->converters().getNumber(c.From()->name(),
+ c.To()->name());
new QListWidgetItem(name, convertersLW, type);
}
convertersLW->sortItems(Qt::AscendingOrder);
convertersLW->blockSignals(false);
// restore selection
- if (!current.isEmpty()) {
+ if (current != pattern.arg(QString()).arg(QString())) {
QList<QListWidgetItem *> const item =
convertersLW->findItems(current, Qt::MatchExactly);
if (!item.isEmpty())
}
+void PrefConverters::on_needauthForbiddenCB_toggled(bool checked)
+{
+ needauthCB->setEnabled(!checked);
+}
+
+
/////////////////////////////////////////////////////////////////////
//
// FormatValidator
private:
QString toString(Format const & format) const
{
- return qt_(format.prettyname());
+ return toqstr(translateIfPossible(format.prettyname()));
}
};
namespace {
-string const l10n_shortcut(string const & prettyname, string const & shortcut)
+string const l10n_shortcut(docstring const & prettyname, string const & shortcut)
{
if (shortcut.empty())
return string();
string l10n_format =
- to_utf8(_(prettyname + '|' + shortcut));
+ to_utf8(_(to_utf8(prettyname) + '|' + shortcut));
return split(l10n_format, '|');
}
defaultFormatCB->clear();
defaultOTFFormatCB->clear();
form_->formats().sort();
- Formats::const_iterator cit = form_->formats().begin();
- Formats::const_iterator end = form_->formats().end();
- for (; cit != end; ++cit) {
- formatsCB->addItem(qt_(cit->prettyname()),
- QVariant(form_->formats().getNumber(cit->name())));
- if (cit->viewer().empty())
+ for (Format const & f : form_->formats()) {
+ QString const prettyname = toqstr(translateIfPossible(f.prettyname()));
+ formatsCB->addItem(prettyname,
+ QVariant(form_->formats().getNumber(f.name())));
+ if (f.viewer().empty())
continue;
- if (form_->converters().isReachable("xhtml", cit->name())
- || form_->converters().isReachable("dviluatex", cit->name())
- || form_->converters().isReachable("luatex", cit->name())
- || form_->converters().isReachable("xetex", cit->name())) {
- defaultFormatCB->addItem(qt_(cit->prettyname()),
- QVariant(toqstr(cit->name())));
- defaultOTFFormatCB->addItem(qt_(cit->prettyname()),
- QVariant(toqstr(cit->name())));
- } else if (form_->converters().isReachable("latex", cit->name())
- || form_->converters().isReachable("pdflatex", cit->name()))
- defaultFormatCB->addItem(qt_(cit->prettyname()),
- QVariant(toqstr(cit->name())));
+ if (form_->converters().isReachable("xhtml", f.name())
+ || form_->converters().isReachable("dviluatex", f.name())
+ || form_->converters().isReachable("luatex", f.name())
+ || form_->converters().isReachable("xetex", f.name())) {
+ defaultFormatCB->addItem(prettyname,
+ QVariant(toqstr(f.name())));
+ defaultOTFFormatCB->addItem(prettyname,
+ QVariant(toqstr(f.name())));
+ } else if (form_->converters().isReachable("latex", f.name())
+ || form_->converters().isReachable("pdflatex", f.name()))
+ defaultFormatCB->addItem(prettyname,
+ QVariant(toqstr(f.name())));
}
// restore selections
void PrefFileformats::updatePrettyname()
{
QString const newname = formatsCB->currentText();
- if (newname == qt_(currentFormat().prettyname()))
+ if (newname == toqstr(translateIfPossible(currentFormat().prettyname())))
return;
- currentFormat().setPrettyname(fromqstr(newname));
+ currentFormat().setPrettyname(qstring_to_ucs4(newname));
formatsChanged();
updateView();
changed();
void PrefFileformats::on_formatNewPB_clicked()
{
- form_->formats().add("", "", "", "", "", "", "", Format::none);
+ form_->formats().add("", "", docstring(), "", "", "", "", Format::none);
updateView();
formatsCB->setCurrentIndex(0);
formatsCB->setFocus(Qt::OtherFocusReason);
KeyMap::BindingList::const_iterator it = bindinglist.begin();
KeyMap::BindingList::const_iterator it_end = bindinglist.end();
for (; it != it_end; ++it)
- insertShortcutItem(it->request, it->sequence, KeyMap::ItemType(it->tag));
+ insertShortcutItem(it->request, it->sequence, it->tag);
shortcutsTW->sortItems(0, Qt::AscendingOrder);
on_shortcutsTW_itemSelectionChanged();
}
+//static
+bool PrefShortcuts::isAlwaysHidden(QTreeWidgetItem & item)
+{
+ // Hide rebound system settings that are empty
+ return itemType(item) == KeyMap::UserUnbind && item.text(1).isEmpty();
+}
+
+
void PrefShortcuts::setItemType(QTreeWidgetItem * item, KeyMap::ItemType tag)
{
item->setData(0, Qt::UserRole, QVariant(tag));
font.setStrikeOut(true);
break;
}
-
+ item->setHidden(isAlwaysHidden(*item));
item->setFont(1, font);
}
}
+void PrefShortcuts::unhideEmpty(QString const & lfun, bool select)
+{
+ // list of items that match lfun
+ QList<QTreeWidgetItem*> items = shortcutsTW->findItems(lfun,
+ Qt::MatchFlags(Qt::MatchExactly | Qt::MatchRecursive), 0);
+ for (int i = 0; i < items.size(); ++i) {
+ QTreeWidgetItem * item = items[i];
+ if (isAlwaysHidden(*item)) {
+ setItemType(item, KeyMap::System);
+ if (select)
+ shortcutsTW->setCurrentItem(item);
+ return;
+ }
+ }
+}
+
+
void PrefShortcuts::removeShortcut()
{
// it seems that only one item can be selected, but I am
else
shortcutsTW->scrollToItem(parent);
user_bind_.unbind(shortcut, func);
+ // If this user binding hid an empty system binding, unhide the
+ // latter and select it.
+ unhideEmpty(items[i]->text(0), true);
break;
}
case KeyMap::UserUnbind: {
int itemIdx = parent->indexOfChild(items[i]);
parent->takeChild(itemIdx);
user_bind_.unbind(shortcut, func);
+ unhideEmpty(items[i]->text(0), false);
break;
}
default:
if (searchLE->text().isEmpty()) {
// show all hidden items
QTreeWidgetItemIterator it(shortcutsTW, QTreeWidgetItemIterator::Hidden);
- while (*it)
- shortcutsTW->setItemHidden(*it++, false);
+ for (; *it; ++it)
+ shortcutsTW->setItemHidden(*it, isAlwaysHidden(**it));
+ // close all categories
+ for (int i = 0; i < shortcutsTW->topLevelItemCount(); ++i)
+ shortcutsTW->collapseItem(shortcutsTW->topLevelItem(i));
return;
}
// search both columns
while (*it)
shortcutsTW->setItemHidden(*it++, true);
// show matched items
- for (int i = 0; i < matched.size(); ++i) {
- shortcutsTW->setItemHidden(matched[i], false);
- shortcutsTW->setItemExpanded(matched[i]->parent(), true);
- }
+ for (int i = 0; i < matched.size(); ++i)
+ if (!isAlwaysHidden(*matched[i])) {
+ shortcutsTW->setItemHidden(matched[i], false);
+ shortcutsTW->setItemExpanded(matched[i]->parent(), true);
+ }
}
return false;
}
+ // It is not currently possible to bind Hidden lfuns such as self-insert. In
+ // the future, to remove this limitation, see GuiPrefs::insertShortcutItem
+ // and how it is used in GuiPrefs::shortcutOkPressed.
+ if (lyxaction.getActionType(func.action()) == LyXAction::Hidden) {
+ Alert::error(_("Failed to create shortcut"),
+ _("This LyX function is hidden and cannot be bound."));
+ return false;
+ }
+
if (k.length() == 0) {
Alert::error(_("Failed to create shortcut"),
_("Invalid or empty key sequence"));
theConverters() = converters_;
theConverters().update(lyx::formats);
theConverters().buildGraph();
-
+ theBufferList().invalidateConverterCache();
+
theMovers() = movers_;
vector<string>::const_iterator it = colors_.begin();