#include "GuiDocument.h"
+#include "GuiApplication.h"
+#include "GuiBranches.h"
+#include "LaTeXHighlighter.h"
+#include "LengthCombo.h"
+#include "PanelStack.h"
+#include "Validator.h"
+
#include "LayoutFile.h"
#include "BranchList.h"
#include "buffer_funcs.h"
#include "Encoding.h"
#include "FloatPlacement.h"
#include "FuncRequest.h"
-#include "support/gettext.h"
-#include "GuiBranches.h"
#include "Language.h"
#include "LaTeXFeatures.h"
-#include "LaTeXHighlighter.h"
#include "Layout.h"
-#include "LengthCombo.h"
#include "LyXRC.h" // defaultUnit
#include "ModuleList.h"
#include "OutputParams.h"
-#include "PanelStack.h"
#include "PDFOptions.h"
#include "qt_helpers.h"
#include "Spacing.h"
-#include "Validator.h"
#include "insets/InsetListingsParams.h"
#include "support/debug.h"
#include "support/FileName.h"
#include "support/filetools.h"
+#include "support/gettext.h"
#include "support/lstrings.h"
#include "frontends/alert.h"
+#include <QAbstractItemModel>
#include <QCloseEvent>
#include <QScrollBar>
#include <QTextCursor>
namespace {
- vector<string> getRequiredList(string const & modName)
- {
- LyXModule const * const mod = moduleList[modName];
- if (!mod)
- return vector<string>(); //empty such thing
- return mod->getRequiredModules();
- }
+vector<string> getRequiredList(string const & modName)
+{
+ LyXModule const * const mod = moduleList[modName];
+ if (!mod)
+ return vector<string>(); //empty such thing
+ return mod->getRequiredModules();
+}
- vector<string> getExcludedList(string const & modName)
- {
- LyXModule const * const mod = moduleList[modName];
- if (!mod)
- return vector<string>(); //empty such thing
- return mod->getExcludedModules();
- }
+
+vector<string> getExcludedList(string const & modName)
+{
+ LyXModule const * const mod = moduleList[modName];
+ if (!mod)
+ return vector<string>(); //empty such thing
+ return mod->getExcludedModules();
+}
- docstring getModuleDescription(string const & modName)
- {
- LyXModule const * const mod = moduleList[modName];
- if (!mod)
- return _("Module not found!");
- return _(mod->getDescription());
- }
+docstring getModuleDescription(string const & modName)
+{
+ LyXModule const * const mod = moduleList[modName];
+ if (!mod)
+ return _("Module not found!");
+ return _(mod->getDescription());
+}
- vector<string> getPackageList(string const & modName)
- {
- LyXModule const * const mod = moduleList[modName];
- if (!mod)
- return vector<string>(); //empty such thing
- return mod->getPackageList();
- }
+vector<string> getPackageList(string const & modName)
+{
+ LyXModule const * const mod = moduleList[modName];
+ if (!mod)
+ return vector<string>(); //empty such thing
+ return mod->getPackageList();
+}
- bool isModuleAvailable(string const & modName)
- {
- LyXModule * mod = moduleList[modName];
- if (!mod)
- return false;
- return mod->isAvailable();
- }
-} //anonymous namespace
+bool isModuleAvailable(string const & modName)
+{
+ LyXModule * mod = moduleList[modName];
+ if (!mod)
+ return false;
+ return mod->isAvailable();
+}
+
+} // anonymous namespace
-ModuleSelMan::ModuleSelMan(
+/////////////////////////////////////////////////////////////////////
+//
+// ModuleSelectionManager
+//
+/////////////////////////////////////////////////////////////////////
+
+ModuleSelectionManager::ModuleSelectionManager(
QListView * availableLV,
QListView * selectedLV,
QPushButton * addPB,
{}
-void ModuleSelMan::updateAddPB()
+void ModuleSelectionManager::updateAddPB()
{
int const arows = availableModel->rowCount();
QModelIndexList const availSels =
}
-void ModuleSelMan::updateDownPB()
+void ModuleSelectionManager::updateDownPB()
{
int const srows = selectedModel->rowCount();
if (srows == 0) {
find(reqs.begin(), reqs.end(), curModName) == reqs.end());
}
-void ModuleSelMan::updateUpPB()
+void ModuleSelectionManager::updateUpPB()
{
int const srows = selectedModel->rowCount();
if (srows == 0) {
upPB->setEnabled(find(reqs.begin(), reqs.end(), preModName) == reqs.end());
}
-void ModuleSelMan::updateDelPB()
+void ModuleSelectionManager::updateDelPB()
{
int const srows = selectedModel->rowCount();
if (srows == 0) {
//
/////////////////////////////////////////////////////////////////////
-PreambleModule::PreambleModule(): current_id_(0)
+PreambleModule::PreambleModule() : current_id_(0)
{
// This is not a memory leak. The object will be destroyed
// with this.
Coords::const_iterator it = preamble_coords_.find(current_id_);
if (it == preamble_coords_.end())
// First time we open this one.
- preamble_coords_[current_id_] = make_pair(0,0);
+ preamble_coords_[current_id_] = make_pair(0, 0);
else {
// Restore saved coords.
QTextCursor cur = preambleTE->textCursor();
GuiDocument::GuiDocument(GuiView & lv)
- : GuiDialog(lv, "document", qt_("Document Settings")), current_id_(0)
+ : GuiDialog(lv, "document", qt_("Document Settings"))
{
setupUi(this);
connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
this, SLOT(change_adaptor()));
connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
- this, SLOT(set_listings_msg()));
+ this, SLOT(setListingsMessage()));
connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
- this, SLOT(set_listings_msg()));
+ this, SLOT(setListingsMessage()));
textLayoutModule->listingsTB->setPlainText(
qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
this, SLOT(change_adaptor()));
connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
this, SLOT(change_adaptor()));
+ connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
+ this, SLOT(change_adaptor()));
connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
this, SLOT(change_adaptor()));
connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
this, SLOT(change_adaptor()));
// language & quotes
-
- Languages::const_iterator lit = languages.begin();
- Languages::const_iterator lend = languages.end();
- for (; lit != lend; ++lit) {
- lang_.append(toqstr(lit->second.lang()));
- langModule->languageCO->addItem(qt_(lit->second.display()));
- }
+ QAbstractItemModel * language_model = guiApp->languageModel();
+ // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
+ language_model->sort(0);
+ langModule->languageCO->setModel(language_model);
// Always put the default encoding in the first position.
- // It is special because the displayed text is translated.
- langModule->encodingCO->addItem(qt_("LaTeX default"));
+ langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
+ QStringList encodinglist;
Encodings::const_iterator it = encodings.begin();
Encodings::const_iterator const end = encodings.end();
for (; it != end; ++it)
- langModule->encodingCO->addItem(toqstr(it->latexName()));
+ encodinglist.append(qt_(it->guiName()));
+ encodinglist.sort();
+ langModule->encodingCO->addItems(encodinglist);
langModule->quoteStyleCO->addItem(qt_("``text''"));
langModule->quoteStyleCO->addItem(qt_("''text''"));
this, SLOT(change_adaptor()));
connect(latexModule->layoutPB, SIGNAL(clicked()),
this, SLOT(browseLayout()));
+ connect(latexModule->layoutPB, SIGNAL(clicked()),
+ this, SLOT(change_adaptor()));
connect(latexModule->childDocGB, SIGNAL(clicked()),
this, SLOT(change_adaptor()));
connect(latexModule->childDocLE, SIGNAL(textChanged(const QString &)),
this, SLOT(browseMaster()));
selectionManager =
- new ModuleSelMan(latexModule->availableLV, latexModule->selectedLV,
+ new ModuleSelectionManager(latexModule->availableLV,
+ latexModule->selectedLV,
latexModule->addPB, latexModule->deletePB,
latexModule->upPB, latexModule->downPB,
availableModel(), selectedModel());
}
-docstring GuiDocument::validate_listings_params()
+QString GuiDocument::validateListingsParameters()
{
// use a cache here to avoid repeated validation
// of the same parameters
- static string param_cache = string();
- static docstring msg_cache = docstring();
+ static string param_cache;
+ static QString msg_cache;
if (textLayoutModule->bypassCB->isChecked())
- return docstring();
+ return QString();
string params = fromqstr(textLayoutModule->listingsED->toPlainText());
if (params != param_cache) {
param_cache = params;
- msg_cache = InsetListingsParams(params).validate();
+ msg_cache = toqstr(InsetListingsParams(params).validate());
}
return msg_cache;
}
-void GuiDocument::set_listings_msg()
+void GuiDocument::setListingsMessage()
{
static bool isOK = true;
- docstring msg = validate_listings_params();
- if (msg.empty()) {
+ QString msg = validateListingsParameters();
+ if (msg.isEmpty()) {
if (isOK)
return;
isOK = true;
// listingsTB->setTextColor("black");
textLayoutModule->listingsTB->setPlainText(
- qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
+ qt_("Input listings parameters on the right. "
+ "Enter ? for a list of parameters."));
} else {
isOK = false;
// listingsTB->setTextColor("red");
- textLayoutModule->listingsTB->setPlainText(toqstr(msg));
+ textLayoutModule->listingsTB->setPlainText(msg);
}
}
FileName layoutFile = support::makeAbsPath(fromqstr(file),
fromqstr(bufferFilepath()));
+ int const ret = Alert::prompt(_("Local layout file"),
+ _("The layout file you have selected is a local layout\n"
+ "file, not one in the system or user directory. Your\n"
+ "document may not work with this layout if you do not\n"
+ "keep the layout file in the document directory."),
+ 1, 1, _("&Set Layout"), _("&Cancel"));
+ if (ret == 1)
+ return;
+
// load the layout file
LayoutFileList & bcl = LayoutFileList::get();
string classname = layoutFile.onlyFileName();
- LayoutFileIndex name = bcl.addLayoutFile(
+ // this will update an existing layout if that layout has been loaded before.
+ LayoutFileIndex name = bcl.addLocalLayout(
classname.substr(0, classname.size() - 7),
- layoutFile.onlyPath().absFilename(),
- LayoutFileList::Local);
+ layoutFile.onlyPath().absFilename());
if (name.empty()) {
Alert::error(_("Error"),
latexModule->classCO->setCurrentIndex(0);
} else
latexModule->classCO->setCurrentIndex(idx);
+
classChanged();
}
if (idx < 0)
return;
string const classname = classes_model_.getIDString(idx);
- // check if this is a local layout file
- if (prefixIs(classname, LayoutFileList::localPrefix)) {
- int const ret = Alert::prompt(_("Local layout file"),
- _("The layout file you have selected is a local layout\n"
- "file, not one in the system or user directory. Your\n"
- "document may not work with this layout if you do not\n"
- "keep the layout file in the same directory."),
- 1, 1, _("&Set Layout"), _("&Cancel"));
- if (ret == 1) {
- // try to reset the layout combo
- setLayoutComboByIDString(bp_.baseClassID());
- return;
- }
- }
+
// FIXME Note that by doing things this way, we load the TextClass
// as soon as it is selected. So, if you use the scroll wheel when
// sitting on the combo box, we'll load a lot of TextClass objects
applyView();
}
bp_.useClassDefaults();
- forceUpdate();
+ paramsToDialog(bp_);
}
+ // FIXME There's a little bug here connected with auto_reset, namely,
+ // that, if the preceding is skipped and the user has changed the
+ // modules before changing the class, those changes will be lost on
+ // update. But maybe that's what we want?
+ updateSelectedModules();
}
int i = langModule->encodingCO->currentIndex();
if (i == 0)
params.inputenc = "default";
- else
- params.inputenc =
- fromqstr(langModule->encodingCO->currentText());
+ else {
+ QString const enc_gui =
+ langModule->encodingCO->currentText();
+ Encodings::const_iterator it = encodings.begin();
+ Encodings::const_iterator const end = encodings.end();
+ bool found = false;
+ for (; it != end; ++it) {
+ if (qt_(it->guiName()) == enc_gui) {
+ params.inputenc = it->latexName();
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ // should not happen
+ lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
+ params.inputenc = "default";
+ }
+ }
}
InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
}
params.quotes_language = lga;
- int const pos = langModule->languageCO->currentIndex();
- params.language = lyx::languages.getLanguage(fromqstr(lang_[pos]));
+ QString const lang = langModule->languageCO->itemData(
+ langModule->languageCO->currentIndex()).toString();
+ params.language = lyx::languages.getLanguage(fromqstr(lang));
// numbering
if (params.documentClass().hasTocLevels()) {
}
// bullets
- params.user_defined_bullet(0) = bulletsModule->getBullet(0);
- params.user_defined_bullet(1) = bulletsModule->getBullet(1);
- params.user_defined_bullet(2) = bulletsModule->getBullet(2);
- params.user_defined_bullet(3) = bulletsModule->getBullet(3);
+ params.user_defined_bullet(0) = bulletsModule->bullet(0);
+ params.user_defined_bullet(1) = bulletsModule->bullet(1);
+ params.user_defined_bullet(2) = bulletsModule->bullet(2);
+ params.user_defined_bullet(3) = bulletsModule->bullet(3);
// packages
params.graphicsDriver =
vector<string> selModList;
for (int i = 0; i < srows; ++i)
params.addLayoutModule(modules_sel_model_.getIDString(i));
+ // update the list of removed modules
+ params.clearRemovedModules();
+ set<string> const & reqmods = params.baseClass()->defaultModules();
+ set<string>::const_iterator rit = reqmods.begin();
+ set<string>::const_iterator ren = reqmods.end();
+ // check each of the required modules
+ for (; rit != ren; rit++) {
+ vector<string>::const_iterator mit = params.getModules().begin();
+ vector<string>::const_iterator men = params.getModules().end();
+ bool found = false;
+ for (; mit != men; mit++) {
+ if (*rit == *mit) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ // the module isn't present so must have been removed by the user
+ params.addRemovedModule(*rit);
+ }
+ }
if (mathsModule->amsautoCB->isChecked()) {
params.use_amsmath = BufferParams::package_auto;
params.fontsTypewriter =
tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
+ params.fontsCJK =
+ fromqstr(fontModule->cjkFontLE->text());
+
params.fontsSansScale = fontModule->scaleSansSB->value();
params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
}
-static int findPos(QStringList const & vec, QString const & val)
-{
- for (int i = 0; i != vec.size(); ++i)
- if (vec[i] == val)
- return i;
- return 0;
-}
-
-
-void GuiDocument::updateParams()
-{
- updateParams(bp_);
-}
-
-
-void GuiDocument::updateParams(BufferParams const & params)
+void GuiDocument::paramsToDialog(BufferParams const & params)
{
// set the default unit
Length::UNIT defaultUnit = Length::CM;
params.use_bibtopic);
// language & quotes
- int const pos = findPos(lang_, toqstr(params.language->lang()));
+ int const pos = langModule->languageCO->findData(toqstr(
+ params.language->lang()));
langModule->languageCO->setCurrentIndex(pos);
langModule->quoteStyleCO->setCurrentIndex(
if (params.inputenc == "default") {
langModule->encodingCO->setCurrentIndex(0);
} else {
+ string enc_gui;
+ Encodings::const_iterator it = encodings.begin();
+ Encodings::const_iterator const end = encodings.end();
+ for (; it != end; ++it) {
+ if (it->latexName() == params.inputenc) {
+ enc_gui = it->guiName();
+ break;
+ }
+ }
int const i = langModule->encodingCO->findText(
- toqstr(params.inputenc));
+ qt_(enc_gui));
if (i >= 0)
langModule->encodingCO->setCurrentIndex(i);
else
ttChanged(n);
}
+ if (!params.fontsCJK.empty())
+ fontModule->cjkFontLE->setText(
+ toqstr(params.fontsCJK));
+ else
+ fontModule->cjkFontLE->setText(QString());
+
fontModule->fontScCB->setChecked(params.fontsSC);
fontModule->fontOsfCB->setChecked(params.fontsOSF);
fontModule->scaleSansSB->setValue(params.fontsSansScale);
void GuiDocument::updateContents()
{
- if (id() == current_id_)
- return;
-
- updateAvailableModules();
- updateSelectedModules();
-
- //FIXME It'd be nice to make sure here that the selected
- //modules are consistent: That required modules are actually
- //selected, and that we don't have conflicts. If so, we could
- //at least pop up a warning.
- updateParams(bp_);
- current_id_ = id();
-}
-
-
-void GuiDocument::forceUpdate()
-{
- // reset to force dialog update
- current_id_ = 0;
- updateContents();
+ // Nothing to do here as the document settings is not cursor dependant.
+ return;
}
return;
}
bp_.useClassDefaults();
- forceUpdate();
+ paramsToDialog(bp_);
}
bool GuiDocument::isValid()
{
- return validate_listings_params().empty()
+ return validateListingsParameters().isEmpty()
&& (textLayoutModule->skipCO->currentIndex() != 3
|| !textLayoutModule->skipLE->text().isEmpty());
}
bool GuiDocument::initialiseParams(string const &)
{
- bp_ = buffer().params();
- // Force update on next updateContent() round.
- current_id_ = 0;
+ BufferView * view = bufferview();
+ if (!view) {
+ bp_ = BufferParams();
+ paramsToDialog(bp_);
+ return true;
+ }
+ bp_ = view->buffer().params();
loadModuleInfo();
+ updateAvailableModules();
+ updateSelectedModules();
+ //FIXME It'd be nice to make sure here that the selected
+ //modules are consistent: That required modules are actually
+ //selected, and that we don't have conflicts. If so, we could
+ //at least pop up a warning.
+ paramsToDialog(bp_);
return true;
}
BufferId GuiDocument::id() const
{
- return &buffer();
+ BufferView const * const view = bufferview();
+ return view? &view->buffer() : 0;
}