mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-16 04:58:35 +00:00
380 lines
13 KiB
C++
380 lines
13 KiB
C++
/**
|
|
* \file GuiInfo.cpp
|
|
* This file is part of LyX, the document processor.
|
|
* Licence details can be found in the file COPYING.
|
|
*
|
|
* \author Abdelrazak Younes
|
|
* \author Jürgen Spitzmüller
|
|
*
|
|
* Full author contact details are available in file CREDITS.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "GuiInfo.h"
|
|
|
|
#include "qt_helpers.h"
|
|
|
|
#include "Buffer.h"
|
|
#include "buffer_funcs.h"
|
|
#include "BufferParams.h"
|
|
#include "BufferView.h"
|
|
#include "Cursor.h"
|
|
#include "Language.h"
|
|
|
|
#include "GuiApplication.h"
|
|
#include "GuiView.h"
|
|
|
|
#include "insets/InsetInfo.h"
|
|
|
|
#include "support/debug.h"
|
|
#include "support/gettext.h"
|
|
#include "support/lstrings.h"
|
|
|
|
|
|
using namespace std;
|
|
using namespace lyx::support;
|
|
|
|
namespace lyx {
|
|
namespace frontend {
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
//
|
|
// GuiInfo
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
char const * info_types[] =
|
|
{ "date",
|
|
"moddate",
|
|
"fixdate",
|
|
"time",
|
|
"modtime",
|
|
"fixtime",
|
|
"buffer",
|
|
"vcs",
|
|
"package",
|
|
"textclass",
|
|
"shortcut",
|
|
"shortcuts",
|
|
"menu",
|
|
"l7n",
|
|
"icon",
|
|
"lyxrc",
|
|
"lyxinfo",
|
|
""
|
|
};
|
|
|
|
// GUI names (in combo)
|
|
char const * info_types_gui[] =
|
|
{ N_("Date (current)"),// date
|
|
N_("Date (last modification of document)"),// moddate
|
|
N_("Date (fixed)"),// fixdate
|
|
N_("Time (current)"),// time
|
|
N_("Time (last modification of document)"),// modtime
|
|
N_("Time (fixed)"),// fixtime
|
|
N_("Document Information"),// buffer
|
|
N_("Version Control Information"),// vcs
|
|
N_("LaTeX Package Availability"),// package
|
|
N_("LaTeX Class Availability"),// textclass
|
|
N_("Last Assigned Keyboard Shortcut"),// shortcut
|
|
N_("All Assigned Keyboard Shortcuts"),// shortcuts
|
|
N_("LyX Menu Location"),// menu
|
|
N_("Localized GUI String"),// l7n
|
|
N_("LyX Toolbar Icon"),// icon
|
|
N_("LyX Preferences Entry"),// lyxrc
|
|
N_("LyX Application Information"),// lyxinfo
|
|
""
|
|
};
|
|
|
|
// Line edit label
|
|
char const * info_name_gui[] =
|
|
{ N_("Custom Format"),// date
|
|
N_("Custom Format"),// moddate
|
|
N_("Custom Format"),// fixdate
|
|
N_("Custom Format"),// time
|
|
N_("Custom Format"),// modtime
|
|
N_("Custom Format"),// fixtime
|
|
N_("Not Applicable"),// buffer
|
|
N_("Not Applicable"),// vcs
|
|
N_("Package Name"),// package
|
|
N_("Class Name"),// textclass
|
|
N_("LyX Function"),// shortcut
|
|
N_("LyX Function"),// shortcuts
|
|
N_("LyX Function"),// menu
|
|
N_("English String"),// l7n
|
|
N_("LyX Function"),// icon
|
|
N_("Preferences Key"),// lyxrc
|
|
N_("Not Applicable"),// lyxinfo
|
|
N_("Not Applicable"),// unknown
|
|
""
|
|
};
|
|
|
|
// Line edit tooltip
|
|
char const * info_tooltip[] =
|
|
{ N_("Enter date format specification, using the following placeholders:\n"
|
|
"* d: day as number without a leading zero\n"
|
|
"* dd: day as number with a leading zero\n"
|
|
"* ddd: abbreviated localized day name\n"
|
|
"* dddd: long localized day name\n"
|
|
"* M: month as number without a leading zero\n"
|
|
"* MM: month as number with a leading zero\n"
|
|
"* MMM: abbreviated localized month name\n"
|
|
"* MMMM: long localized month name\n"
|
|
"* yy: year as two digit number\n"
|
|
"* yyyy: year as four digit number"),// date
|
|
N_("Enter date format specification, using the following placeholders:\n"
|
|
"* d: day as number without a leading zero\n"
|
|
"* dd: day as number with a leading zero\n"
|
|
"* ddd: abbreviated localized day name\n"
|
|
"* dddd: long localized day name\n"
|
|
"* M: month as number without a leading zero\n"
|
|
"* MM: month as number with a leading zero\n"
|
|
"* MMM: abbreviated localized month name\n"
|
|
"* MMMM: long localized month name\n"
|
|
"* yy: year as two digit number\n"
|
|
"* yyyy: year as four digit number"),// moddate
|
|
N_("Enter date format specification, using the following placeholders:\n"
|
|
"* d: day as number without a leading zero\n"
|
|
"* dd: day as number with a leading zero\n"
|
|
"* ddd: abbreviated localized day name\n"
|
|
"* dddd: long localized day name\n"
|
|
"* M: month as number without a leading zero\n"
|
|
"* MM: month as number with a leading zero\n"
|
|
"* MMM: abbreviated localized month name\n"
|
|
"* MMMM: long localized month name\n"
|
|
"* yy: year as two digit number\n"
|
|
"* yyyy: year as four digit number"),// fixdate
|
|
N_("Enter time format specification, using the following placeholders:\n"
|
|
"* h: the hour without a leading zero (1-12 in AM/PM)\n"
|
|
"* hh: the hour with a leading zero (01-12 in AM/PM)\n"
|
|
"* H: the hour without a leading zero (0-23 in AM/PM)\n"
|
|
"* HH: the hour with a leading zero (00-23 in AM/PM)\n"
|
|
"* m: the minute without a leading zero\n"
|
|
"* mm: the minute with a leading zero\n"
|
|
"* s: the second without a leading zero\n"
|
|
"* ss: the second with a leading zero\n"
|
|
"* z: the milliseconds without leading zeroes\n"
|
|
"* zzz: the milliseconds with leading zeroes\n"
|
|
"* AP or A: use AM/PM display ('AM'/'PM')\n"
|
|
"* ap or a: use am/pm display ('am'/'pm')\n"
|
|
"* t: the timezone (e.g. CEST)"),// time
|
|
N_("Enter time format specification, using the following placeholders:\n"
|
|
"* h: the hour without a leading zero (1-12 in AM/PM)\n"
|
|
"* hh: the hour with a leading zero (01-12 in AM/PM)\n"
|
|
"* H: the hour without a leading zero (0-23 in AM/PM)\n"
|
|
"* HH: the hour with a leading zero (00-23 in AM/PM)\n"
|
|
"* m: the minute without a leading zero\n"
|
|
"* mm: the minute with a leading zero\n"
|
|
"* s: the second without a leading zero\n"
|
|
"* ss: the second with a leading zero\n"
|
|
"* z: the milliseconds without leading zeroes\n"
|
|
"* zzz: the milliseconds with leading zeroes\n"
|
|
"* AP or A: use AM/PM display ('AM'/'PM')\n"
|
|
"* ap or a: use am/pm display ('am'/'pm')\n"
|
|
"* t: the timezone (e.g. CEST)"),// modtime
|
|
N_("Enter time format specification, using the following placeholders:\n"
|
|
"* h: the hour without a leading zero (1-12 in AM/PM)\n"
|
|
"* hh: the hour with a leading zero (01-12 in AM/PM)\n"
|
|
"* H: the hour without a leading zero (0-23 in AM/PM)\n"
|
|
"* HH: the hour with a leading zero (00-23 in AM/PM)\n"
|
|
"* m: the minute without a leading zero\n"
|
|
"* mm: the minute with a leading zero\n"
|
|
"* s: the second without a leading zero\n"
|
|
"* ss: the second with a leading zero\n"
|
|
"* z: the milliseconds without leading zeroes\n"
|
|
"* zzz: the milliseconds with leading zeroes\n"
|
|
"* AP or A: use AM/PM display ('AM'/'PM')\n"
|
|
"* ap or a: use am/pm display ('am'/'pm')\n"
|
|
"* t: the timezone (e.g. CEST)"),// fixtime
|
|
N_("Please select a valid type above"),// buffer
|
|
N_("Please select a valid type above"),// vcs
|
|
N_("Enter a LaTeX package name such as 'hyperref' (extension is optional). "
|
|
"The output will be 'Yes' (package available) or 'No' (package unavailable)."),// package
|
|
N_("Enter a LaTeX class name such as 'article' (extension is optional). "
|
|
"The output will be 'Yes' (class available) or 'No' (class unavailable)."),// textclass
|
|
N_("Enter a function name such as 'math-insert \\alpha'. Please refer to Help > LyX Functions for a comprehensive list of functions. "
|
|
"The output is the most recently assigned keyboard shortcut for this function"),// shortcut
|
|
N_("Enter a function name such as 'math-insert \\alpha'. Please refer to Help > LyX Functions for a comprehensive list of functions. "
|
|
"The output lists all possible keyboard shortcuts for this function"),// shortcuts
|
|
N_("Enter a function name such as 'math-insert \\alpha'. Please refer to Help > LyX Functions for a comprehensive list of functions. "
|
|
"The output is the path to the function in the menu (using the current localization)."),// menu
|
|
N_("Enter a localizable English string from the LyX User Interface, including accelerator markup ('&' or '|') and trailing colons. "
|
|
"The output is the localized string (using the current localization); trailing colons and accelerator markup are stripped."),// l7n
|
|
N_("Enter a function name such as 'math-insert \\alpha'. Please refer to Help > LyX Functions for a comprehensive list of functions. "
|
|
"The output is the toolbar icon for this function (using the active icon theme)."),// icon
|
|
N_("Enter a LyX preferences key such as 'bind_file'. See the proposed list for available entries. "
|
|
"The output is the current setting of this preference."),// lyxrc
|
|
N_("Please select a valid type above"),// lyxinfo
|
|
N_("Please select a valid type above"),// unknown
|
|
""};
|
|
|
|
|
|
GuiInfo::GuiInfo(QWidget * parent) : InsetParamsWidget(parent)
|
|
{
|
|
setupUi(this);
|
|
|
|
typeCO->blockSignals(true);
|
|
for (int n = 0; info_types[n][0]; ++n)
|
|
typeCO->addItem(qt_(info_types_gui[n]), info_types[n]);
|
|
typeCO->blockSignals(false);
|
|
|
|
connect(typeCO, SIGNAL(currentIndexChanged(int)), this, SLOT(updateArguments(int)));
|
|
connect(nameLE, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
|
|
connect(fixDateLE, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
|
|
connect(infoLW, SIGNAL(currentTextChanged(QString)), this, SIGNAL(changed()));
|
|
}
|
|
|
|
|
|
void GuiInfo::paramsToDialog(Inset const * inset)
|
|
{
|
|
InsetInfo const * ii = static_cast<InsetInfo const *>(inset);
|
|
params_ = ii->params();
|
|
QString const type = toqstr(params_.infoType());
|
|
QString name = toqstr(params_.name);
|
|
QString fixdate;
|
|
if (type == "fixdate" || type == "fixtime") {
|
|
fixdate = name.section('@', 1, 1);
|
|
name = name.section('@', 0, 0);
|
|
if (!fixdate.isEmpty())
|
|
fixDateLE->setText(fixdate);
|
|
else {
|
|
if (type == "fixdate")
|
|
fixDateLE->setText(QDate::currentDate().toString(Qt::ISODate));
|
|
else
|
|
fixDateLE->setText(QTime::currentTime().toString(Qt::ISODate));
|
|
}
|
|
}
|
|
typeCO->blockSignals(true);
|
|
nameLE->blockSignals(true);
|
|
nameLE->clear();
|
|
// The "unknown" item is only in the combo if we open
|
|
// the dialog from an unknown info. The user should not
|
|
// change a valid info to an unknown one.
|
|
int i = typeCO->findData("unknown");
|
|
if (i == -1 && type == "unknown")
|
|
typeCO->addItem(qt_("Unknown"), toqstr("unknown"));
|
|
if (i != -1 && type != "unknown")
|
|
typeCO->removeItem(i);
|
|
i = typeCO->findData(type);
|
|
typeCO->setCurrentIndex(i);
|
|
updateArguments(i);
|
|
int argindex = -1;
|
|
int customindex = 0;
|
|
for (int i = 0 ; i < infoLW->count() ; ++i) {
|
|
if (infoLW->item(i)->data(Qt::UserRole).toString() == name)
|
|
argindex = i;
|
|
else if (infoLW->item(i)->data(Qt::UserRole).toString() == "custom")
|
|
customindex = i;
|
|
}
|
|
if (argindex != -1)
|
|
infoLW->setCurrentRow(argindex);
|
|
else {
|
|
// Without this test, 'math-insert' (name) will replace 'math-insert '
|
|
// in nameLE and effectively disallow the input of spaces after a LFUN.
|
|
if (nameLE->text().trimmed() != name)
|
|
nameLE->setText(name);
|
|
infoLW->setCurrentRow(customindex);
|
|
}
|
|
typeCO->blockSignals(false);
|
|
nameLE->blockSignals(false);
|
|
}
|
|
|
|
|
|
docstring GuiInfo::dialogToParams() const
|
|
{
|
|
QString type =
|
|
typeCO->itemData(typeCO->currentIndex()).toString();
|
|
QString name = infoLW->currentItem() ?
|
|
infoLW->currentItem()->data(Qt::UserRole).toString()
|
|
: QString();
|
|
if (name == "custom")
|
|
name = nameLE->text();
|
|
if (type == "fixdate" || type == "fixtime") {
|
|
QString fd = fixDateLE->text();
|
|
if (fd.isEmpty())
|
|
fd = (type == "fixdate") ?
|
|
QDate::currentDate().toString(Qt::ISODate)
|
|
: QTime::currentTime().toString(Qt::ISODate);
|
|
name += "@" + fd;
|
|
}
|
|
return qstring_to_ucs4(type + ' ' + name);
|
|
}
|
|
|
|
|
|
bool GuiInfo::initialiseParams(std::string const & sdata)
|
|
{
|
|
Language const * lang = languages.getLanguage(sdata);
|
|
if (!lang)
|
|
return false;
|
|
params_.lang = lang;
|
|
updateArguments(typeCO->currentIndex());
|
|
return true;
|
|
}
|
|
|
|
|
|
void GuiInfo::updateArguments(int i)
|
|
{
|
|
if (i == -1)
|
|
i = 0;
|
|
|
|
infoLW->clear();
|
|
BufferView const * bv = guiApp->currentView()->currentBufferView();
|
|
vector<pair<string,docstring>> args = params_.getArguments(const_cast<Buffer *>(&bv->buffer()),
|
|
info_types[i]);
|
|
for (auto const & p : args) {
|
|
QListWidgetItem * li = new QListWidgetItem(toqstr(p.second));
|
|
li->setData(Qt::UserRole, toqstr(p.first));
|
|
if (p.first == "invalid")
|
|
// non-selectable, disabled item!
|
|
li->setFlags(Qt::NoItemFlags);
|
|
if (p.first == "custom")
|
|
li->setData(Qt::ToolTipRole, qt_("Enter a valid value below"));
|
|
infoLW->addItem(li);
|
|
}
|
|
if (infoLW->count() > 0)
|
|
infoLW->setCurrentRow(0);
|
|
changed();
|
|
}
|
|
|
|
|
|
bool GuiInfo::checkWidgets(bool readonly) const
|
|
{
|
|
nameLE->setReadOnly(readonly);
|
|
typeCO->setEnabled(!readonly);
|
|
nameLA->setText(qt_(info_name_gui[typeCO->currentIndex()]) + toqstr(":"));
|
|
|
|
QString const arg = infoLW->currentItem() ?
|
|
infoLW->currentItem()->data(Qt::UserRole).toString()
|
|
: QString();
|
|
|
|
bool const type_enabled = (arg == "custom");
|
|
nameLA->setEnabled(type_enabled);
|
|
nameLE->setEnabled(type_enabled);
|
|
nameLE->setToolTip(qt_(info_tooltip[typeCO->currentIndex()]));
|
|
|
|
string const typestr = info_types[typeCO->currentIndex()];
|
|
bool const fixdate_enabled = (typestr == "fixdate" || typestr == "fixtime");
|
|
fixDateLE->setVisible(fixdate_enabled);
|
|
fixDateLA->setVisible(fixdate_enabled);
|
|
if (typestr == "fixdate") {
|
|
fixDateLE->setToolTip(qt_("Here you can enter a fixed date (in ISO format: YYYY-MM-DD)"));
|
|
fixDateLA->setText(qt_("&Fixed Date:"));
|
|
}
|
|
else if (typestr == "fixtime") {
|
|
fixDateLE->setToolTip(qt_("Here you can enter a fixed time (in ISO format: hh:mm:ss)"));
|
|
fixDateLA->setText(qt_("&Fixed Time:"));
|
|
}
|
|
|
|
if (!InsetParamsWidget::checkWidgets())
|
|
return false;
|
|
return !arg.isEmpty() && (arg != "custom" || !nameLE->text().isEmpty());
|
|
}
|
|
|
|
|
|
|
|
} // namespace frontend
|
|
} // namespace lyx
|
|
|
|
#include "moc_GuiInfo.cpp"
|