X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer.h;h=75f6e0530f2a0c35e10c1c8100ac8d6f75b6169c;hb=09e01879979643949f1f2c7216023f1f35d5ada2;hp=4da4b29a3aca63ad493ee75496e1d8bc1fa5687e;hpb=ad9c1fa3aa8cde8aef91c8ccad6bb03e702c3a18;p=lyx.git diff --git a/src/buffer.h b/src/buffer.h index 4da4b29a3a..75f6e0530f 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -1,54 +1,42 @@ // -*- C++ -*- -/* This file is part of - * ====================================================== +/** + * \file buffer.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * LyX, The Document Processor - * Copyright 1995 Matthias Ettrich + * \author Lars Gullik Bjønnes * - * This file is Copyleft 1996 - * Lars Gullik Bjønnes - * - * ====================================================== */ + * Full author contact details are available in file CREDITS + */ #ifndef BUFFER_H #define BUFFER_H -#ifdef __GNUG__ -#pragma interface -#endif - #include "LString.h" #include "undo.h" #include "support/limited_stack.h" - + #include "lyxvc.h" #include "bufferparams.h" #include "texrow.h" -#include "paragraph.h" +#include "ParagraphList.h" +#include "author.h" +#include "iterators.h" +#include "errorlist.h" + +#include +#include +#include -#include - -class BufferView; class LyXRC; class TeXErrors; class LaTeXFeatures; +class LatexRunParams; class Language; class ParIterator; +class ParConstIterator; +class Messages; -// When lyx 1.3.x starts we should enable this -// btw. we should also test this with 1.2 so that we -// do not get any surprises. (Lgb) -#define NO_COMPABILITY 1 - -/// -struct DEPCLEAN { - /// - bool clean; - /// - string master; - /// - DEPCLEAN * next; -}; /** The buffer object. This is the buffer object. It contains all the informations about @@ -81,66 +69,58 @@ public: /// Maybe we know the function already by number... bool dispatch(int ac, string const & argument, bool * result = 0); - /// - void resizeInsets(BufferView *); - - /// Update window titles of all users. - void updateTitles() const; - - /// Reset autosave timers for all users. - void resetAutosaveTimers() const; - - /** Adds the BufferView to the users list. - Later this func will insert the \c BufferView into a real list, - not just setting a pointer. - */ - void addUser(BufferView * u); - - /** Removes the #BufferView# from the users list. - Since we only can have one at the moment, we just reset it. - */ - void delUser(BufferView *); - - /// - void redraw(); - /// Load the autosaved file. void loadAutoSaveFile(); - /** Reads a file. + /** Inserts a file into a document \param par if != 0 insert the file. \return \c false if method fails. */ - bool readFile(LyXLex &, Paragraph * par = 0); + bool readFile(LyXLex &, string const &, ParagraphList::iterator pit); + + // FIXME: it's very silly to pass a lex in here + /// load a new file + bool readFile(string const &); + + /// read the header, returns number of unknown tokens + int readHeader(LyXLex & lex); /** Reads a file without header. \param par if != 0 insert the file. \return \c false if file is not completely read. */ - bool readLyXformat2(LyXLex &, Paragraph * par = 0); - - /// This parses a single LyXformat-Token. - bool parseSingleLyXformat2Token(LyXLex &, Paragraph *& par, - Paragraph *& return_par, - string const & token, int & pos, - Paragraph::depth_type & depth, - LyXFont &); - /// - void insertStringAsLines(Paragraph *&, lyx::pos_type &, - LyXFont const &, string const &) const; -#ifndef NO_COMPABILITY - /// - Inset * isErtInset(Paragraph * par, int pos) const; + bool readBody(LyXLex &, ParagraphList::iterator pit); + + /// This parses a single token + int readParagraph(LyXLex &, string const & token, + ParagraphList & pars, ParagraphList::iterator & pit, + Paragraph::depth_type & depth); + /// - void insertErtContents(Paragraph * par, int & pos, - bool set_inactive = true); -#endif + void insertStringAsLines(ParagraphList::iterator &, lyx::pos_type &, + LyXFont const &, string const &); /// - Paragraph * getParFromID(int id) const; -private: - /// Parse a single inset. - void readInset(LyXLex &, Paragraph *& par, int & pos, LyXFont &); + ParIterator getParFromID(int id) const; + /// do we have a paragraph with this id? + bool hasParWithID(int id) const; + public: + /// This signal is emitted when a parsing error shows up. + boost::signal1 error; + /// This signal is emitted when some message shows up. + boost::signal1 message; + /// This signal is emitted when the buffer busy status change. + boost::signal1 busy; + /// This signal is emitted when the buffer readonly status change. + boost::signal1 readonly; + /// Update window titles of all users. + boost::signal0 updateTitles; + /// Reset autosave timers for all users. + boost::signal0 resetAutosaveTimers; + /// This signal is emitting if the buffer is being closed. + boost::signal0 closing; + + /** Save file. Takes care of auto-save files and backup file if requested. Returns \c true if the save is successful, \c false otherwise. @@ -148,59 +128,57 @@ public: bool save() const; /// Write file. Returns \c false if unsuccesful. - bool writeFile(string const &, bool) const; + bool writeFile(string const &) const; /// void writeFileAscii(string const & , int); /// void writeFileAscii(std::ostream &, int); /// - string const asciiParagraph(Paragraph const *, unsigned int linelen, + string const asciiParagraph(Paragraph const &, unsigned int linelen, bool noparbreak = false) const; - /// + /// Just a wrapper for the method below, first creating the ofstream. void makeLaTeXFile(string const & filename, string const & original_path, - bool nice, bool only_body = false); - /** LaTeX all paragraphs from par to endpar. - \param \a endpar if == 0 then to the end - */ - void latexParagraphs(std::ostream & os, Paragraph * par, - Paragraph * endpar, TexRow & texrow, bool moving_arg = false) const; + LatexRunParams const &, + bool output_preamble = true, + bool output_body = true); + /// + void makeLaTeXFile(std::ostream & os, + string const & original_path, + LatexRunParams const &, + bool output_preamble = true, + bool output_body = true); /// void simpleDocBookOnePar(std::ostream &, - Paragraph * par, int & desc_on, - Paragraph::depth_type depth) const ; + ParagraphList::iterator par, int & desc_on, + Paragraph::depth_type depth) const; /// - void simpleLinuxDocOnePar(std::ostream & os, Paragraph * par, - Paragraph::depth_type depth); + void simpleLinuxDocOnePar(std::ostream & os, + ParagraphList::iterator par, + Paragraph::depth_type depth) const; /// void makeLinuxDocFile(string const & filename, bool nice, bool only_body = false); /// void makeDocBookFile(string const & filename, bool nice, bool only_body = false); - /// Open SGML/XML tag. - void sgmlOpenTag(std::ostream & os, Paragraph::depth_type depth, - string const & latexname) const; - /// Closes SGML/XML tag. - void sgmlCloseTag(std::ostream & os, Paragraph::depth_type depth, - string const & latexname) const; - /// - void sgmlError(Paragraph * par, int pos, string const & message) const; - /// returns the main language for the buffer (document) Language const * getLanguage() const; + /// get l10n translated to the buffers language + string const B_(string const & l10n) const; + /// int runChktex(); - /// - bool isLyxClean() const; + /// return true if the main lyx file does not need saving + bool isClean() const; /// bool isBakClean() const; /// bool isDepClean(string const & name) const; - /// - void markLyxClean() const; + /// mark the main lyx file as not needing saving + void markClean() const; /// void markBakClean(); @@ -267,45 +245,26 @@ public: */ void validate(LaTeXFeatures &) const; + /// return all bibkeys from buffer and its childs + void fillWithBibKeys(std::vector > & keys) const; /// - string const getIncludeonlyList(char delim = ','); - /// - std::vector > const getBibkeyList() const; - /// - struct TocItem { - TocItem(Paragraph * p, int d, string const & s) - : par(p), depth(d), str(s) {} - /// - Paragraph * par; - /// - int depth; - /// - string str; - }; - /// - typedef std::vector SingleList; - /// - typedef std::map Lists; - /// - Lists const getLists() const; - /// - std::vector const getLabelList(); - - /** This will clearly have to change later. Later we can have more - than one user per buffer. */ - BufferView * getUser() const; + void getLabelList(std::vector &) const; /// void changeLanguage(Language const * from, Language const * to); + + /// + void updateDocLang(Language const * nlang); + /// bool isMultiLingual(); /// Does this mean that this is buffer local? - limited_stack > undostack; - - /// Does this mean that this is buffer local? - limited_stack > redostack; - + limited_stack undostack; + + /// Does this mean that this is buffer local? + limited_stack redostack; + /// BufferParams params; @@ -313,7 +272,7 @@ public: This is a linked list of paragraph, this list holds the whole contents of the document. */ - Paragraph * paragraph; + ParagraphList paragraphs; /// LyX version control object. LyXVC lyxvc; @@ -328,7 +287,18 @@ public: /// Used when typesetting to place errorboxes. TexRow texrow; + + /// the author list for the document + AuthorList & authors(); + private: + bool do_writeFile(std::ostream & ofs) const; + + typedef std::map DepClean; + + /// need to regenerate .tex ? + DepClean dep_clean_; + /// is save needed mutable bool lyx_clean; @@ -338,9 +308,6 @@ private: /// is this a unnamed file (New...) bool unnamed; - /// is regenerating #.tex# necessary - DEPCLEAN * dep_clean; - /// buffer is r/o bool read_only; @@ -350,66 +317,39 @@ private: /// The path to the document file. string filepath_; - /// Format number of buffer - int file_format; - /** A list of views using this buffer. - Why not keep a list of the BufferViews that use this buffer? - - At least then we don't have to do a lot of magic like: - #buffer->lyx_gui->bufferview->updateLayoutChoice#. Just ask each - of the buffers in the list of users to do a #updateLayoutChoice#. - */ - BufferView * users; - + /// + boost::scoped_ptr messages_; public: /// class inset_iterator { public: typedef std::input_iterator_tag iterator_category; - typedef Inset value_type; + typedef InsetOld value_type; typedef ptrdiff_t difference_type; - typedef Inset * pointer; - typedef Inset & reference; - + typedef InsetOld * pointer; + typedef InsetOld & reference; + typedef ParagraphList::iterator base_type; /// - inset_iterator() : par(0) /*, it(0)*/ {} - // - inset_iterator(Paragraph * paragraph) : par(paragraph) { - setParagraph(); - } + inset_iterator(); /// - inset_iterator(Paragraph * paragraph, lyx::pos_type pos); + inset_iterator(base_type p, base_type e); /// - inset_iterator & operator++() { // prefix ++ - if (par) { - ++it; - if (it == par->inset_iterator_end()) { - par = par->next(); - setParagraph(); - } - } - return *this; - } + inset_iterator(base_type p, lyx::pos_type pos, base_type e); + + /// prefix ++ + inset_iterator & operator++(); + /// postfix ++ + inset_iterator operator++(int); /// - inset_iterator operator++(int) { // postfix ++ - inset_iterator tmp(par, it.getPos()); - if (par) { - ++it; - if (it == par->inset_iterator_end()) { - par = par->next(); - setParagraph(); - } - } - return tmp; - } + reference operator*(); /// - Inset * operator*() { return *it; } + pointer operator->(); /// - Paragraph * getPar() { return par; } + ParagraphList::iterator getPar() const; /// - lyx::pos_type getPos() const { return it.getPos(); } + lyx::pos_type getPos() const; /// friend bool operator==(inset_iterator const & iter1, @@ -418,192 +358,41 @@ public: /// void setParagraph(); /// - Paragraph * par; + ParagraphList::iterator pit; /// - Paragraph::inset_iterator it; + ParagraphList::iterator pend; + /// + InsetList::iterator it; }; - /// - inset_iterator inset_iterator_begin() { - return inset_iterator(paragraph); - } - /// - inset_iterator inset_iterator_end() { - return inset_iterator(); - } - /// - inset_iterator inset_const_iterator_begin() const { - return inset_iterator(paragraph); - } - /// - inset_iterator inset_const_iterator_end() const { - return inset_iterator(); - } + /// return an iterator to all *top-level* insets in the buffer + inset_iterator inset_iterator_begin(); + + /// return the end of all *top-level* insets in the buffer + inset_iterator inset_iterator_end(); + + /// return a const iterator to all *top-level* insets in the buffer + inset_iterator inset_const_iterator_begin() const; + + /// return the const end of all *top-level* insets in the buffer + inset_iterator inset_const_iterator_end() const; /// ParIterator par_iterator_begin(); /// + ParConstIterator par_iterator_begin() const; + /// ParIterator par_iterator_end(); + /// + ParConstIterator par_iterator_end() const; /// - Inset * getInsetFromID(int id_arg) const; + InsetOld * getInsetFromID(int id_arg) const; }; - -inline -void Buffer::addUser(BufferView * u) -{ - users = u; -} - - -inline -void Buffer::delUser(BufferView *) -{ - users = 0; -} - - -inline -Language const * Buffer::getLanguage() const -{ - return params.language; -} - - -inline -bool Buffer::isLyxClean() const -{ - return lyx_clean; -} - - -inline -bool Buffer::isBakClean() const -{ - return bak_clean; -} - - -inline -void Buffer::markLyxClean() const -{ - if (!lyx_clean) { - lyx_clean = true; - updateTitles(); - } - // if the .lyx file has been saved, we don't need an - // autosave - bak_clean = true; -} - - -inline -void Buffer::markBakClean() -{ - bak_clean = true; -} - - -inline -void Buffer::setUnnamed(bool flag) -{ - unnamed = flag; -} - - -inline -bool Buffer::isUnnamed() -{ - return unnamed; -} - - -inline -void Buffer::markDirty() -{ - if (lyx_clean) { - lyx_clean = false; - updateTitles(); - } - bak_clean = false; - DEPCLEAN * tmp = dep_clean; - while (tmp) { - tmp->clean = false; - tmp = tmp->next; - } -} - - -inline -string const & Buffer::fileName() const -{ - return filename_; -} - - -inline -string const & Buffer::filePath() const -{ - return filepath_; -} - - -inline -bool Buffer::isReadonly() const -{ - return read_only; -} - - -inline -BufferView * Buffer::getUser() const -{ - return users; -} - - -inline -void Buffer::setParentName(string const & name) -{ - params.parentname = name; -} - - -/// -inline -bool operator==(Buffer::TocItem const & a, Buffer::TocItem const & b) -{ - return a.par == b.par && a.str == b.str; - // No need to compare depth. -} - - -/// -inline -bool operator!=(Buffer::TocItem const & a, Buffer::TocItem const & b) -{ - return !(a == b); - // No need to compare depth. -} - - -/// -inline bool operator==(Buffer::inset_iterator const & iter1, - Buffer::inset_iterator const & iter2) -{ - return iter1.par == iter2.par - && (iter1.par == 0 || iter1.it == iter2.it); -} - + Buffer::inset_iterator const & iter2); -/// -inline bool operator!=(Buffer::inset_iterator const & iter1, - Buffer::inset_iterator const & iter2) -{ - return !(iter1 == iter2); -} - + Buffer::inset_iterator const & iter2); #endif