#include "lyxtextclasslist.h"
#include "sgml.h"
#include "paragraph_funcs.h"
+#include "messages.h"
#include "author.h"
#include "frontends/LyXView.h"
#include <boost/bind.hpp>
#include <boost/tuple/tuple.hpp>
-#include "BoostFormat.h"
+#include "support/BoostFormat.h"
#include <fstream>
#include <iomanip>
" class %1$s is unknown.")) % unknown);
#else
_("Using the default document class, because the "
- " class ") + unknown + (" is unknown.");
+ " class ") + unknown + (" is unknown.");
#endif
Alert::warning(_("Unknown document class"), msg);
}
// needed to insert the selection
-void Buffer::insertStringAsLines(Paragraph *& par, pos_type & pos,
+void Buffer::insertStringAsLines(ParagraphList::iterator & par, pos_type & pos,
LyXFont const & fn,string const & str)
{
LyXLayout_ptr const & layout = par->layout();
if (autobreakrows && (!par->empty() || layout->keepempty)) {
breakParagraph(params, paragraphs, par, pos,
layout->isEnvironment());
- par = par->next();
+ ++par;
pos = 0;
space_inserted = true;
} else {
bool Buffer::readFile(LyXLex & lex, string const & filename)
{
- return readFile(lex, filename, paragraphs.begin());
+ bool ret = readFile(lex, filename, paragraphs.begin());
+
+ // After we have read a file, we must ensure that the buffer
+ // language is set and used in the gui.
+ // If you know of a better place to put this, please tell me. (Lgb)
+ updateDocLang(params.language);
+
+ return ret;
}
// FIXME: all the below Alerts should give the filename..
-bool Buffer::readFile(LyXLex & lex, string const & filename, ParagraphList::iterator pit)
+bool Buffer::readFile(LyXLex & lex, string const & filename,
+ ParagraphList::iterator pit)
{
if (!lex.isOK()) {
Alert::error(_("Document could not be read"),
texrow.reset();
// The starting paragraph of the coming rows is the
// first paragraph of the document. (Asger)
- texrow.start(&*(paragraphs.begin()), 0);
+ texrow.start(paragraphs.begin()->id(), 0);
if (!only_body && nice) {
os << "%% " << lyx_docversion << " created this file. "
<< " -->\n";
Paragraph::depth_type depth = 0; // paragraph depth
- Paragraph * par = &*(paragraphs.begin());
string item_name;
vector<string> environment_stack(5);
- while (par) {
- LyXLayout_ptr const & style = par->layout();
+ ParagraphList::iterator pit = paragraphs.begin();
+ ParagraphList::iterator pend = paragraphs.end();
+ for (; pit != pend; ++pit) {
+ LyXLayout_ptr const & style = pit->layout();
// treat <toc> as a special case for compatibility with old code
- if (par->isInset(0)) {
- Inset * inset = par->getInset(0);
+ if (pit->isInset(0)) {
+ Inset * inset = pit->getInset(0);
Inset::Code lyx_code = inset->lyxCode();
if (lyx_code == Inset::TOC_CODE) {
string const temp = "toc";
sgml::openTag(ofs, depth, false, temp);
-
- par = par->next();
continue;
}
}
// environment tag closing
- for (; depth > par->params().depth(); --depth) {
+ for (; depth > pit->params().depth(); --depth) {
sgml::closeTag(ofs, depth, false, environment_stack[depth]);
environment_stack[depth].erase();
}
// write opening SGML tags
switch (style->latextype) {
case LATEX_PARAGRAPH:
- if (depth == par->params().depth()
+ if (depth == pit->params().depth()
&& !environment_stack[depth].empty()) {
sgml::closeTag(ofs, depth, false, environment_stack[depth]);
environment_stack[depth].erase();
break;
case LATEX_COMMAND:
- if (depth!= 0)
- sgmlError(par, 0,
+ if (depth != 0)
+ sgmlError(&*pit, 0,
_("Error: Wrong depth for LatexType Command.\n"));
if (!environment_stack[depth].empty()) {
{
string const & latexname = style->latexname();
- if (depth == par->params().depth()
+ if (depth == pit->params().depth()
&& environment_stack[depth] != latexname) {
sgml::closeTag(ofs, depth, false,
environment_stack[depth]);
environment_stack[depth].erase();
}
- if (depth < par->params().depth()) {
- depth = par->params().depth();
+ if (depth < pit->params().depth()) {
+ depth = pit->params().depth();
environment_stack[depth].erase();
}
if (environment_stack[depth] != latexname) {
break;
}
- simpleLinuxDocOnePar(ofs, par, depth);
-
- par = par->next();
+ simpleLinuxDocOnePar(ofs, pit, depth);
ofs << "\n";
// write closing SGML tags
// Handle internal paragraph parsing -- layout already processed.
void Buffer::simpleLinuxDocOnePar(ostream & os,
- Paragraph * par,
- Paragraph::depth_type /*depth*/)
+ ParagraphList::iterator par,
+ Paragraph::depth_type /*depth*/) const
{
LyXLayout_ptr const & style = par->layout();
PAR_TAG tag_close = NONE;
list < PAR_TAG > tag_open;
- LyXFont const font = par->getFont(params, i);
+ LyXFont const font = par->getFont(params, i, outerFont(par, paragraphs));
if (font_old.family() != font.family()) {
switch (family_type) {
// Print an error message.
-void Buffer::sgmlError(Paragraph * /*par*/, int /*pos*/,
+void Buffer::sgmlError(ParagraphList::iterator /*par*/, int /*pos*/,
string const & /*message*/) const
{
#ifdef WITH_WARNINGS
#endif
Alert::error(_("Could not save document"), text);
return;
- return;
}
- Paragraph * par = &*(paragraphs.begin());
-
niceFile = nice; // this will be used by Insetincludes.
LaTeXFeatures features(params);
string item_name;
string command_name;
- while (par) {
+ ParagraphList::iterator par = paragraphs.begin();
+ ParagraphList::iterator pend = paragraphs.end();
+
+ for (; par != pend; ++par) {
string sgmlparam;
string c_depth;
string c_params;
simpleDocBookOnePar(ofs, par, desc_on,
depth + 1 + command_depth);
- par = par->next();
string end_tag;
// write closing SGML tags
void Buffer::simpleDocBookOnePar(ostream & os,
- Paragraph * par, int & desc_on,
+ ParagraphList::iterator par, int & desc_on,
Paragraph::depth_type depth) const
{
bool emph_flag = false;
// parsing main loop
for (pos_type i = 0; i < par->size(); ++i) {
- LyXFont font = par->getFont(params, i);
+ LyXFont font = par->getFont(params, i, outerFont(par, paragraphs));
// handle <emphasis> tag
if (font_old.emph() != font.emph()) {
void Buffer::changeLanguage(Language const * from, Language const * to)
{
+ lyxerr << "Changing Language!" << endl;
+
+ // Take care of l10n/i18n
+ updateDocLang(to);
ParIterator end = par_iterator_end();
for (ParIterator it = par_iterator_begin(); it != end; ++it)
}
+void Buffer::updateDocLang(Language const * nlang)
+{
+ messages_.reset(new Messages(nlang->code()));
+}
+
+
bool Buffer::isMultiLingual()
{
ParIterator end = par_iterator_end();
}
-Paragraph * Buffer::getParFromID(int id) const
+ParagraphList::iterator Buffer::getParFromID(int id) const
{
- if (id < 0)
- return 0;
+#warning FIXME: const correctness! (Andre)
+ ParIterator it(const_cast<Buffer*>(this)->par_iterator_begin());
+ ParIterator end(const_cast<Buffer*>(this)->par_iterator_end());
- // why should we allow < 0 ??
- //lyx::Assert(id >= 0);
-
- ParConstIterator it(par_iterator_begin());
- ParConstIterator end(par_iterator_end());
+#warning FIXME, perhaps this func should return a ParIterator? (Lgb)
+ if (id < 0) {
+ // John says this is called with id == -1 from undo
+ lyxerr << "getParFromID(), id: " << id << endl;
+ return 0;
+ }
for (; it != end; ++it) {
// go on then, show me how to remove
// the cast
if ((*it)->id() == id) {
- return const_cast<Paragraph*>(*it);
+ return *it;
}
}
}
+bool Buffer::hasParWithID(int id) const
+{
+ ParIterator it(const_cast<Buffer*>(this)->par_iterator_begin());
+ ParIterator end(const_cast<Buffer*>(this)->par_iterator_end());
+
+ if (id < 0) {
+ // John says this is called with id == -1 from undo
+ lyxerr << "hasParWithID(), id: " << id << endl;
+ return 0;
+ }
+
+ for (; it != end; ++it)
+ if ((*it)->id() == id)
+ return true;
+
+ return false;
+}
+
+
ParIterator Buffer::par_iterator_begin()
{
return ParIterator(&*(paragraphs.begin()));
}
+string const Buffer::B_(string const & l10n) const
+{
+ if (messages_.get()) {
+ return messages_->get(l10n);
+ }
+
+ return _(l10n);
+}
+
+
bool Buffer::isClean() const
{
return lyx_clean;
}
-Paragraph * Buffer::inset_iterator::getPar()
+ParagraphList::iterator Buffer::inset_iterator::getPar() const
{
- return &(*pit);
+ return pit;
}