]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
fix "make check" with gcc 4.3
[lyx.git] / src / BufferParams.cpp
index 875c3c5fb0200aac1a904c5949b92f534564f2df..53de012b389535734b9cdaf340d36cd3971a9606 100644 (file)
@@ -4,10 +4,10 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Alfredo Braunstein
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author Jean-Marc Lasgouttes
  * \author John Levon
- * \author André Pönitz
+ * \author André Pönitz
  * \author Martin Vermeer
  *
  * Full author contact details are available in file CREDITS.
@@ -23,6 +23,7 @@
 #include "buffer_funcs.h"
 #include "Bullet.h"
 #include "Color.h"
+#include "ColorSet.h"
 #include "Encoding.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
@@ -565,7 +566,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
        } else if (token == "\\output_changes") {
                lex >> outputChanges;
        } else if (token == "\\branch") {
-               lex.next();
+               lex.eatLine();
                docstring branch = lex.getDocString();
                branchlist().add(branch);
                while (true) {
@@ -707,8 +708,8 @@ void BufferParams::writeFile(ostream & os) const
        // removed modules
        if (!removedModules_.empty()) {
                os << "\\begin_removed_modules" << '\n';
-               set<string>::const_iterator it = removedModules_.begin();
-               set<string>::const_iterator en = removedModules_.end();
+               list<string>::const_iterator it = removedModules_.begin();
+               list<string>::const_iterator en = removedModules_.end();
                for (; it != en; it++)
                        os << *it << '\n';
                os << "\\end_removed_modules" << '\n';
@@ -858,7 +859,7 @@ void BufferParams::validate(LaTeXFeatures & features) const
 
        if (outputChanges) {
                bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
-               bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+               bool xcolorulem = LaTeXFeatures::isAvailable("ulem") &&
                                  LaTeXFeatures::isAvailable("xcolor");
 
                switch (features.runparams().flavor) {
@@ -866,18 +867,18 @@ void BufferParams::validate(LaTeXFeatures & features) const
                        if (dvipost) {
                                features.require("ct-dvipost");
                                features.require("dvipost");
-                       } else if (xcolorsoul) {
-                               features.require("ct-xcolor-soul");
-                               features.require("soul");
+                       } else if (xcolorulem) {
+                               features.require("ct-xcolor-ulem");
+                               features.require("ulem");
                                features.require("xcolor");
                        } else {
                                features.require("ct-none");
                        }
                        break;
                case OutputParams::PDFLATEX:
-                       if (xcolorsoul) {
-                               features.require("ct-xcolor-soul");
-                               features.require("soul");
+                       if (xcolorulem) {
+                               features.require("ct-xcolor-ulem");
+                               features.require("ulem");
                                features.require("xcolor");
                                // improves color handling in PDF output
                                features.require("pdfcolmk"); 
@@ -1129,71 +1130,71 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                texrow.newline();
        }
        if (use_geometry || nonstandard_papersize) {
-               os << "\\usepackage{geometry}\n";
-               texrow.newline();
-               os << "\\geometry{verbose";
+               odocstringstream ods;
+               if (!getGraphicsDriver("geometry").empty())
+                       ods << getGraphicsDriver("geometry");
                if (orientation == ORIENTATION_LANDSCAPE)
-                       os << ",landscape";
+                       ods << ",landscape";
                switch (papersize) {
                case PAPER_CUSTOM:
                        if (!paperwidth.empty())
-                               os << ",paperwidth="
+                               ods << ",paperwidth="
                                   << from_ascii(paperwidth);
                        if (!paperheight.empty())
-                               os << ",paperheight="
+                               ods << ",paperheight="
                                   << from_ascii(paperheight);
                        break;
                case PAPER_USLETTER:
-                       os << ",letterpaper";
+                       ods << ",letterpaper";
                        break;
                case PAPER_USLEGAL:
-                       os << ",legalpaper";
+                       ods << ",legalpaper";
                        break;
                case PAPER_USEXECUTIVE:
-                       os << ",executivepaper";
+                       ods << ",executivepaper";
                        break;
                case PAPER_A3:
-                       os << ",a3paper";
+                       ods << ",a3paper";
                        break;
                case PAPER_A4:
-                       os << ",a4paper";
+                       ods << ",a4paper";
                        break;
                case PAPER_A5:
-                       os << ",a5paper";
+                       ods << ",a5paper";
                        break;
                case PAPER_B3:
-                       os << ",b3paper";
+                       ods << ",b3paper";
                        break;
                case PAPER_B4:
-                       os << ",b4paper";
+                       ods << ",b4paper";
                        break;
                case PAPER_B5:
-                       os << ",b5paper";
+                       ods << ",b5paper";
                        break;
                default:
                        // default papersize ie PAPER_DEFAULT
                        switch (lyxrc.default_papersize) {
                        case PAPER_DEFAULT: // keep compiler happy
                        case PAPER_USLETTER:
-                               os << ",letterpaper";
+                               ods << ",letterpaper";
                                break;
                        case PAPER_USLEGAL:
-                               os << ",legalpaper";
+                               ods << ",legalpaper";
                                break;
                        case PAPER_USEXECUTIVE:
-                               os << ",executivepaper";
+                               ods << ",executivepaper";
                                break;
                        case PAPER_A3:
-                               os << ",a3paper";
+                               ods << ",a3paper";
                                break;
                        case PAPER_A4:
-                               os << ",a4paper";
+                               ods << ",a4paper";
                                break;
                        case PAPER_A5:
-                               os << ",a5paper";
+                               ods << ",a5paper";
                                break;
                        case PAPER_B5:
-                               os << ",b5paper";
+                               ods << ",b5paper";
                                break;
                        case PAPER_B3:
                        case PAPER_B4:
@@ -1201,6 +1202,13 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                                break;
                        }
                }
+               docstring const g_options = trim(ods.str(), ",");
+               os << "\\usepackage";
+               if (!g_options.empty())
+                       os << '[' << g_options << ']';
+               os << "{geometry}\n";
+               texrow.newline();
+               os << "\\geometry{verbose";
                if (!topmargin.empty())
                        os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
                if (!bottommargin.empty())
@@ -1411,6 +1419,10 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                lyxpreamble += from_utf8(features.getBabelOptions()) + '\n';
        }
 
+       docstring const i18npreamble = features.getTClassI18nPreamble(use_babel);
+       if (!i18npreamble.empty())
+               lyxpreamble += i18npreamble + '\n';
+
        int const nlines =
                int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
        for (int j = 0; j != nlines; ++j) {
@@ -1468,176 +1480,6 @@ void BufferParams::setDocumentClass(DocumentClass const * const tc) {
 }
 
 
-void BufferParams::removeExcludedModules()
-{
-       // remove any modules the new base class excludes
-       list<string> oldModules = getModules();
-       clearLayoutModules();
-       list<string>::const_iterator oit = oldModules.begin();
-       list<string>::const_iterator oen = oldModules.end();
-       list<string> const & provmods = baseClass()->providedModules();
-       list<string> const & exclmods = baseClass()->excludedModules();
-       for (; oit != oen; ++oit) {
-               string const & modname = *oit;
-               // are we excluded by the document class?
-               if (find(exclmods.begin(), exclmods.end(), modname) != exclmods.end()) {
-                       LYXERR0("Module " << modname << " dropped because excluded by document class.");
-                       continue;
-               }
-               // determine whether some provided module excludes us or we exclude it
-               list<string>::const_iterator pit = provmods.begin();
-               list<string>::const_iterator pen = provmods.end();
-               bool excluded = false;
-               for (; !excluded && pit != pen; ++pit) {
-                       if (!LyXModule::areCompatible(modname, *pit)) {
-                               LYXERR0("Module " << modname << 
-                                               " dropped becuase it conflicts with provided module " << *pit);
-                               excluded = true;
-                       }
-               }
-               if (excluded)
-                       continue;
-               layoutModules_.push_back(*oit);
-       }
-}
-
-
-void BufferParams::addDefaultModules()
-{
-       // add any default modules not already in use
-       list<string> const & mods = baseClass()->defaultModules();
-       list<string>::const_iterator mit = mods.begin();
-       list<string>::const_iterator men = mods.end();
-
-       // we want to add these to the front, but in the right order,
-       // so we collect them here first.
-       list<string> modulesToAdd;
-
-       for (; mit != men; mit++) {
-               string const & modName = *mit;
-               // make sure the user hasn't removed it
-               if (find(removedModules_.begin(), removedModules_.end(), modName) !=
-                   removedModules_.end()) {
-                       LYXERR(Debug::TCLASS, "Default module `" << modName << 
-                                       "' not added because removed by user.");
-                       continue;
-               }
-
-               if (moduleCanBeAdded(modName)) {
-                       LYXERR(Debug::TCLASS, "Default module `" << modName << "' added.");
-                       modulesToAdd.push_back(modName);
-               } else
-                       LYXERR(Debug::TCLASS, 
-                                       "Default module `" << modName << "' could not be added.");
-       }
-
-       // OK, now we can add the default modules.
-       layoutModules_.insert(
-                       layoutModules_.begin(), modulesToAdd.begin(), modulesToAdd.end());
-}
-
-
-bool BufferParams::checkModuleConsistency() {
-       bool consistent = true;
-       // Perform a consistency check on the set of modules.
-       // In particular, we need to check that modules provided by this class
-       // do not conflict with modules chosen by the user.
-       list<string> oldModules = getModules();
-       clearLayoutModules();
-       list<string>::const_iterator oit = oldModules.begin();
-       list<string>::const_iterator oen = oldModules.end();
-       list<string> const & provmods = baseClass()->providedModules();
-       list<string> const & exclmods = baseClass()->excludedModules();
-       for (; oit != oen; ++oit) {
-               string const & modname = *oit;
-               // skip modules that the class provides
-               if (find(provmods.begin(), provmods.end(), modname) != provmods.end()) {
-                       consistent = false;
-                       LYXERR0("Module " << modname << " dropped because provided by document class.");
-                       continue;
-               }
-               // are we excluded by the document class?
-               // FIXME This can probably be removed, since removeExcludedModules ought
-               // already to have done this test.
-               if (find(exclmods.begin(), exclmods.end(), modname) != exclmods.end()) {
-                       consistent = false;
-                       LYXERR0("WARNING: Module " << modname << " should already have been dropped!");
-                       continue;
-               }
-
-               // determine whether some provided module excludes us or we exclude it
-               list<string>::const_iterator pit = provmods.begin();
-               list<string>::const_iterator pen = provmods.end();
-               bool excluded = false;
-               for (; !excluded && pit != pen; ++pit) {
-                       if (!LyXModule::areCompatible(modname, *pit)) {
-                               consistent = false;
-                               LYXERR0("Module " << modname << 
-                                               " dropped becuase it conflicts with provided module " << *pit);
-                               excluded = true;
-                       }
-               }
-
-               if (excluded)
-                       continue;
-
-               // Determine whether some prior module excludes us, or we exclude it
-               list<string>::const_iterator lit = layoutModules_.begin();
-               list<string>::const_iterator len = layoutModules_.end();
-               for (; !excluded && lit != len; ++lit) {
-                       if (!LyXModule::areCompatible(modname, *lit)) {
-                               consistent = false;
-                               LYXERR0("Module " << modname << 
-                                               " dropped because it is excluded by prior module " << *lit);
-                               excluded = true;
-                       }
-               }
-
-               if (excluded)
-                       continue;
-
-               // determine whether some provided module or some prior module
-               // satisfies our requirements
-               LyXModule const * const oldmod = moduleList[modname];
-               if (!oldmod) {
-                       LYXERR0("Default module " << modname << 
-                                       " added although it is unavailable and can't check requirements.");
-                       continue;
-               }
-                       
-               vector<string> const & reqs = oldmod->getRequiredModules();
-               if (!reqs.empty()) {
-                       // we now set excluded to true, meaning that we haven't
-                       // yet found a required module.
-                       excluded = true;
-                       vector<string>::const_iterator rit  = reqs.begin();
-                       vector<string>::const_iterator ren = reqs.end();
-                       for (; rit != ren; ++rit) {
-                               string const reqmod = *rit;
-                               if (find(provmods.begin(), provmods.end(), reqmod) != 
-                                               provmods.end()) {
-                                       excluded = false;
-                                       break;
-                               }
-                               if (find(layoutModules_.begin(), layoutModules_.end(), reqmod) != 
-                                               layoutModules_.end()) {
-                                       excluded = false;
-                                       break;
-                               }
-                       }
-               }
-               if (excluded) {
-                       consistent = false;
-                       LYXERR0("Module " << modname << " dropped because requirements not met.");
-               } else {
-                       LYXERR(Debug::TCLASS, "Module " << modname << " passed consistency check.");
-                       layoutModules_.push_back(modname);
-               }
-       }
-       return consistent;
-}
-
-
 bool BufferParams::setBaseClass(string const & classname)
 {
        LYXERR(Debug::TCLASS, "setBaseClass: " << classname);
@@ -1663,22 +1505,7 @@ bool BufferParams::setBaseClass(string const & classname)
        }
 
        pimpl_->baseClass_ = classname;
-       // the previous document class may have loaded some modules that the
-       // new one excludes, and the new class may provide, etc, some that
-       // conflict with ones that were already loaded. So we need to go 
-       // through the list and fix everything. I suppose there are various
-       // ways this could be done, but the following seems to work at the 
-       // moment. (Thanks to Philippe Charpentier for helping work out all 
-       // the bugs---rgh.)
-       // 
-       // first, we remove any modules the new document class excludes
-       removeExcludedModules();
-       // next, we add any default modules the new class provides
-       addDefaultModules();
-       // finally, we perform a general consistency check on the set of
-       // loaded modules
-       checkModuleConsistency();
-
+       layoutModules_.adaptToBaseClass(baseClass(), removedModules_);
        return true;
 }
 
@@ -1703,41 +1530,8 @@ void BufferParams::makeDocumentClass()
        if (!baseClass())
                return;
 
-       doc_class_ = &(DocumentClassBundle::get().newClass(*baseClass()));
+       doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), layoutModules_));
 
-       // FIXME It might be worth loading the children's modules here,
-       // just as we load their bibliographies and such, instead of just 
-       // doing a check in InsetInclude.
-       LayoutModuleList::const_iterator it = layoutModules_.begin();
-       for (; it != layoutModules_.end(); it++) {
-               string const modName = *it;
-               LyXModule * lm = moduleList[modName];
-               if (!lm) {
-                       docstring const msg =
-                               bformat(_("The module %1$s has been requested by\n"
-                                       "this document but has not been found in the list of\n"
-                                       "available modules. If you recently installed it, you\n"
-                                       "probably need to reconfigure LyX.\n"), from_utf8(modName));
-                       frontend::Alert::warning(_("Module not available"),
-                                       msg + _("Some layouts may not be available."));
-                       LYXERR0("BufferParams::makeDocumentClass(): Module " <<
-                                       modName << " requested but not found in module list.");
-                       continue;
-               }
-               if (!lm->isAvailable()) {
-                       docstring const msg =
-                                               bformat(_("The module %1$s requires a package that is\n"
-                                               "not available in your LaTeX installation. LaTeX output\n"
-                                               "may not be possible.\n"), from_utf8(modName));
-                       frontend::Alert::warning(_("Package not available"), msg);
-               }
-               FileName layout_file = libFileSearch("layouts", lm->getFilename());
-               if (!doc_class_->read(layout_file, TextClass::MODULE)) {
-                       docstring const msg =
-                               bformat(_("Error reading module %1$s\n"), from_utf8(modName));
-                       frontend::Alert::warning(_("Read Error"), msg);
-               }
-       }
        if (!local_layout.empty()) {
                if (!doc_class_->read(local_layout, TextClass::MODULE)) {
                        docstring const msg = _("Error reading internal layout information");
@@ -1746,68 +1540,9 @@ void BufferParams::makeDocumentClass()
        }
 }
 
-
 bool BufferParams::moduleCanBeAdded(string const & modName) const
 {
-       // Is the module already present?
-       LayoutModuleList::const_iterator it = layoutModules_.begin();
-       LayoutModuleList::const_iterator end = layoutModules_.end();
-       for (; it != end; it++)
-               if (*it == modName) 
-                       return false;
-
-       LyXModule const * const lm = moduleList[modName];
-       if (!lm)
-               return true;
-
-       // Is this module explicitly excluded by the document class?
-       list<string>::const_iterator const exclmodstart = 
-                       baseClass()->excludedModules().begin();
-       list<string>::const_iterator const exclmodend = 
-                       baseClass()->excludedModules().end();
-       if (find(exclmodstart, exclmodend, modName) != exclmodend)
-               return false;
-
-       // Is this module already provided by the document class?
-       list<string>::const_iterator const provmodstart = 
-                       baseClass()->providedModules().begin();
-       list<string>::const_iterator const provmodend = 
-                       baseClass()->providedModules().end();
-       if (find(provmodstart, provmodend, modName) != provmodend)
-               return false;
-
-       // Check for conflicts with used modules
-       // first the provided modules...
-       list<string>::const_iterator provmodit = provmodstart;
-       for (; provmodit != provmodend; ++provmodit) {
-               if (!LyXModule::areCompatible(modName, *provmodit))
-                       return false;
-       }
-       // and then the selected modules
-       LayoutModuleList::const_iterator mit = getModules().begin();
-       LayoutModuleList::const_iterator const men = getModules().end();
-       for (; mit != men; ++mit)
-               if (!LyXModule::areCompatible(modName, *mit))
-                       return false;
-
-       // Check whether some required module is available
-       vector<string> const reqs = lm->getRequiredModules();
-       if (reqs.empty())
-               return true;
-
-       mit = getModules().begin(); // reset
-       vector<string>::const_iterator rit = reqs.begin();
-       vector<string>::const_iterator ren = reqs.end();
-       bool foundone = false;
-       for (; rit != ren; ++rit) {
-               if (find(mit, men, *rit) != men || 
-                   find(provmodstart, provmodend, *rit) != provmodend) {
-                       foundone = true;
-                       break;
-               }
-       }
-
-       return foundone;
+       return layoutModules_.moduleCanBeAdded(modName, baseClass());
 }
 
 
@@ -1961,15 +1696,15 @@ void BufferParams::readRemovedModules(Lexer & lex)
                string mod = lex.getString();
                if (mod == "\\end_removed_modules")
                        break;
-               removedModules_.insert(mod);
+               removedModules_.push_back(mod);
                lex.eatLine();
        }
        // now we want to remove any removed modules that were previously 
        // added. normally, that will be because default modules were added in 
        // setBaseClass(), which gets called when \textclass is read at the 
        // start of the read.
-       set<string>::const_iterator rit = removedModules_.begin();
-       set<string>::const_iterator const ren = removedModules_.end();
+       list<string>::const_iterator rit = removedModules_.begin();
+       list<string>::const_iterator const ren = removedModules_.end();
        for (; rit != ren; rit++) {
                LayoutModuleList::iterator const mit = layoutModules_.begin();
                LayoutModuleList::iterator const men = layoutModules_.end();
@@ -2106,6 +1841,24 @@ string BufferParams::babelCall(string const & lang_opts) const
 }
 
 
+docstring BufferParams::getGraphicsDriver(string const & package) const
+{
+       docstring result;
+
+       if (package == "geometry") {
+               if (graphicsDriver == "dvips"
+                   || graphicsDriver == "dvipdfm"
+                   || graphicsDriver == "pdftex"
+                   || graphicsDriver == "vtex")
+                       result = from_ascii(graphicsDriver);
+               else if (graphicsDriver == "dvipdfmx")
+                       result = from_ascii("dvipdfm");
+       }
+
+       return result;
+}
+
+
 void BufferParams::writeEncodingPreamble(odocstream & os,
                LaTeXFeatures & features, TexRow & texrow) const
 {
@@ -2146,7 +1899,11 @@ void BufferParams::writeEncodingPreamble(odocstream & os,
                        texrow.newline();
                }
                if (package == Encoding::CJK || features.mustProvide("CJK")) {
-                       os << "\\usepackage{CJK}\n";
+                       if (language->encoding()->name() == "utf8-cjk"
+                           && LaTeXFeatures::isAvailable("CJKutf8"))
+                               os << "\\usepackage{CJKutf8}\n";
+                       else
+                               os << "\\usepackage{CJK}\n";
                        texrow.newline();
                }
        } else if (inputenc != "default") {
@@ -2163,7 +1920,11 @@ void BufferParams::writeEncodingPreamble(odocstream & os,
                        texrow.newline();
                        break;
                case Encoding::CJK:
-                       os << "\\usepackage{CJK}\n";
+                       if (encoding().name() == "utf8-cjk"
+                           && LaTeXFeatures::isAvailable("CJKutf8"))
+                               os << "\\usepackage{CJKutf8}\n";
+                       else
+                               os << "\\usepackage{CJK}\n";
                        texrow.newline();
                        break;
                }