X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer.h;h=75f6e0530f2a0c35e10c1c8100ac8d6f75b6169c;hb=09e01879979643949f1f2c7216023f1f35d5ada2;hp=ca1e2692bea41dae2480effdfbd4cc720c7d996e;hpb=cff99d6de19ea170ab8e8928ac9f3de9337ecb90;p=lyx.git diff --git a/src/buffer.h b/src/buffer.h index ca1e2692be..75f6e0530f 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -1,240 +1,215 @@ // -*- C++ -*- -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * Copyright 1995 Matthias Ettrich +/** + * \file buffer.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * This file is Copyleft 1996 - * Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * - * ====================================================== */ - -// Change Log: -// =========== -// 23/03/98 Heinrich Bauer (heinrich.bauer@t-mobil.de) -// Spots marked "changed Heinrich Bauer, 23/03/98" modified due to the -// following bug: dvi file export did not work after printing (or previewing) -// and vice versa as long as the same file was concerned. This happened -// every time the LyX-file was left unchanged between the two actions mentioned -// above. + * 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 "BufferView.h" #include "lyxvc.h" #include "bufferparams.h" #include "texrow.h" +#include "ParagraphList.h" +#include "author.h" +#include "iterators.h" +#include "errorlist.h" +#include +#include +#include class LyXRC; class TeXErrors; class LaTeXFeatures; -class auto_mem_buffer; +class LatexRunParams; class Language; +class ParIterator; +class ParConstIterator; +class Messages; -/// -struct DEPCLEAN { - /// - bool clean; - /// - string master; - /// - DEPCLEAN * next; -}; /** The buffer object. - The is is the buffer object. It contains all the informations about + This is the buffer object. It contains all the informations about a document loaded into LyX. I am not sure if the class is complete or minimal, probably not. + \author Lars Gullik Bjønnes */ class Buffer { public: - /// - explicit Buffer(string const & file, bool b = false); - - /// - ~Buffer(); + /// What type of log will \c getLogName() return? + enum LogType { + latexlog, ///< LaTeX log + buildlog ///< Literate build log + }; - /** save the buffer's parameters as user default - This function saves a file #user_lyxdir/templates/defaults.lyx# - which parameters are those of the current buffer. This file - is used as a default template when creating a new - file. Returns #true# on success. + /** Constructor + \param file + \param b optional \c false by default */ - bool saveParamsAsDefaults(); + explicit Buffer(string const & file, bool b = false); + + /// Destructor + ~Buffer(); /** High-level interface to buffer functionality. This function parses a command string and executes it */ - bool Dispatch(string const & command); + bool dispatch(string const & command, bool * result = 0); /// Maybe we know the function already by number... - bool Dispatch(int ac, string const & argument); + bool dispatch(int ac, string const & argument, bool * result = 0); - /// and have an xtl buffer to work with. - bool Dispatch(int, auto_mem_buffer &); + /// Load the autosaved file. + void loadAutoSaveFile(); - /// should be changed to work for a list. - void resize(); - /// - void resizeInsets(BufferView *); + /** Inserts a file into a document + \param par if != 0 insert the file. + \return \c false if method fails. + */ + bool readFile(LyXLex &, string const &, ParagraphList::iterator pit); - /// Update window titles of all users - void updateTitles() const; + // FIXME: it's very silly to pass a lex in here + /// load a new file + bool readFile(string const &); - /// Reset autosave timers for all users - void resetAutosaveTimers() const; + /// read the header, returns number of unknown tokens + int readHeader(LyXLex & lex); - /** Adds the BufferView to the users list. - Later this func will insert the #BufferView# into a real list, - not just setting a pointer. + /** Reads a file without header. + \param par if != 0 insert the file. + \return \c false if file is not completely read. */ - void addUser(BufferView * u) { users = u; } + bool readBody(LyXLex &, ParagraphList::iterator pit); - /** Removes the #BufferView# from the users list. - Since we only can have one at the moment, we just reset it. - */ - void delUser(BufferView *) { users = 0; } - - /// - void redraw() { - users->redraw(); - users->fitCursor(users->text); - //users->updateScrollbar(); - } + /// This parses a single token + int readParagraph(LyXLex &, string const & token, + ParagraphList & pars, ParagraphList::iterator & pit, + Paragraph::depth_type & depth); /// - void loadAutoSaveFile(); - - /** Reads a file. - @param par if != 0 insert the file. - @return #false# if method fails. - */ - bool readFile(LyXLex &, LyXParagraph * par = 0); - - /** Reads a file without header. - @param par if != 0 insert the file. - @return false if file is not completely read. - */ - bool readLyXformat2(LyXLex &, LyXParagraph * par = 0); - - /// This parses a single LyXformat-Token. - bool parseSingleLyXformat2Token(LyXLex &, LyXParagraph *& par, - LyXParagraph *& return_par, - string const & token, int & pos, - char & depth, LyXFont & -#ifndef NEW_INSETS - ,LyXParagraph::footnote_flag &, - LyXParagraph::footnote_kind & -#endif - ); -private: - /// Parse a single inset. - void readInset(LyXLex &, LyXParagraph *& par, int & pos, LyXFont &); + void insertStringAsLines(ParagraphList::iterator &, lyx::pos_type &, + LyXFont const &, string const &); + /// + ParIterator getParFromID(int id) const; + /// do we have a paragraph with this id? + bool hasParWithID(int id) const; + public: - /** Save file + /// 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 #true# if the save is successful, #false# otherwise. + Returns \c true if the save is successful, \c false otherwise. */ bool save() const; - - /// Write file. Returns #false# if unsuccesful. - bool writeFile(string const &, bool) const; - + + /// Write file. Returns \c false if unsuccesful. + bool writeFile(string const &) const; + /// void writeFileAscii(string const & , int); /// void writeFileAscii(std::ostream &, int); /// - string const asciiParagraph(LyXParagraph const *, - unsigned int linelen) const; - /// + 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 endpar if == 0 then to the end - */ - void latexParagraphs(std::ostream & os, LyXParagraph * par, - LyXParagraph * endpar, TexRow & texrow) const; - + LatexRunParams const &, + bool output_preamble = true, + bool output_body = true); /// - int runChktex(); - + void makeLaTeXFile(std::ostream & os, + string const & original_path, + LatexRunParams const &, + bool output_preamble = true, + bool output_body = true); + /// + void simpleDocBookOnePar(std::ostream &, + ParagraphList::iterator par, int & desc_on, + Paragraph::depth_type depth) const; + /// + 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); - /// returns the main language for the buffer (document) - Language const * GetLanguage() const { - return params.language; - } - + Language const * getLanguage() const; + /// get l10n translated to the buffers language + string const B_(string const & l10n) const; + /// - bool isLyxClean() const { return lyx_clean; } - + int runChktex(); + /// return true if the main lyx file does not need saving + bool isClean() const; /// - bool isBakClean() const { return bak_clean; } - + bool isBakClean() const; /// bool isDepClean(string const & name) const; - - /// - void 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; - } + + /// mark the main lyx file as not needing saving + void markClean() const; /// - void markBakClean() { bak_clean = true; } - + void markBakClean(); + /// void markDepClean(string const & name); - - /// - void setUnnamed(bool flag=true) { unnamed = flag; } /// - bool isUnnamed() { return unnamed; } + void setUnnamed(bool flag = true); /// - void markDirty() { - if (lyx_clean) { - lyx_clean = false; - updateTitles(); - } - bak_clean = false; - DEPCLEAN * tmp = dep_clean; - while (tmp) { - tmp->clean = false; - tmp = tmp->next; - } - } + bool isUnnamed(); - /// - string const & fileName() const { return filename; } + /// Mark this buffer as dirty. + void markDirty(); + + /// Returns the buffer's filename. It is always an absolute path. + string const & fileName() const; + + /// Returns the the path where the buffer lives. + /// It is always an absolute path. + string const & filePath() const; - /** A transformed version of the file name, adequate for LaTeX - The path is stripped if no_path is true (default) + /** A transformed version of the file name, adequate for LaTeX. + \param no_path optional if \c true then the path is stripped. */ string const getLatexName(bool no_path = true) const; + /// Get the name and type of the log. + std::pair const getLogName() const; + /// Change name of buffer. Updates "read-only" flag. void setFileName(string const & newfile); @@ -242,25 +217,22 @@ public: void setParentName(string const &); /// Is buffer read-only? - bool isReadonly() const { return read_only; } + bool isReadonly() const; /// Set buffer read-only flag void setReadonly(bool flag = true); - /// returns #true# if the buffer contains a LaTeX document + /// returns \c true if the buffer contains a LaTeX document bool isLatex() const; - /// returns #true# if the buffer contains a LinuxDoc document + /// returns \c true if the buffer contains a LinuxDoc document bool isLinuxDoc() const; - /// returns #true# if the buffer contains a DocBook document + /// returns \c true if the buffer contains a DocBook document bool isDocBook() const; - /** returns #true# if the buffer contains either a LinuxDoc + /** returns \c true if the buffer contains either a LinuxDoc or DocBook document */ bool isSGML() const; - /// returns #true# if the buffer contains a Wed document - bool isLiterate() const; - - /// - void setPaperStuff(); + /// returns \c true if the buffer contains a Wed document + bool isLiterate() const; /** Validate a buffer for LaTeX. This validates the buffer, and returns a struct for use by @@ -273,254 +245,154 @@ 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(); - /// - struct TocItem { - /// - LyXParagraph * par; - /// - int depth; - /// - string str; - }; - /// - enum TocType { - /// - TOC_TOC = 0, - /// - TOC_LOF, - /// - TOC_LOT, - /// - TOC_LOA - }; - /// - std::vector > const getTocList(); - /// - std::vector const getLabelList(); + void getLabelList(std::vector &) const; - /** This will clearly have to change later. Later we can have more - than one user per buffer. */ - BufferView * getUser() const { return users; } + /// + void changeLanguage(Language const * from, Language const * to); /// - void ChangeLanguage(Language const * from, Language const * to); + void updateDocLang(Language const * nlang); + /// bool isMultiLingual(); /// Does this mean that this is buffer local? - UndoStack undostack; - - /// Does this mean that this is buffer local? - UndoStack redostack; - + limited_stack undostack; + + /// Does this mean that this is buffer local? + limited_stack redostack; + /// BufferParams params; - - /** is a list of paragraphs. + + /** The list of paragraphs. + This is a linked list of paragraph, this list holds the + whole contents of the document. */ - LyXParagraph * paragraph; + ParagraphList paragraphs; - /// RCS object + /// LyX version control object. LyXVC lyxvc; - /// where the temporaries go if we want them + /// Where to put temporary files. string tmppath; - /// - string filepath; - - /** While writing as LaTeX, tells whether we are + /** If we are writing a nice LaTeX file or not. + While writing as LaTeX, tells whether we are doing a 'nice' LaTeX file */ bool niceFile; /// Used when typesetting to place errorboxes. TexRow texrow; + + /// the author list for the document + AuthorList & authors(); + private: -#ifndef NEW_INSETS - /// - void linuxDocHandleFootnote(std::ostream & os, - LyXParagraph * & par, int depth); -#endif - /// - void DocBookHandleCaption(std::ostream & os, string & inner_tag, - int depth, int desc_on, - LyXParagraph * & par); -#ifndef NEW_INSETS - /// - void DocBookHandleFootnote(std::ostream & os, - LyXParagraph * & par, int depth); -#endif - /// - void sgmlOpenTag(std::ostream & os, int depth, - string const & latexname) const; - /// - void sgmlCloseTag(std::ostream & os, int depth, - string const & latexname) const; - /// - void LinuxDocError(LyXParagraph * par, int pos, - string const & message); - /// - void SimpleLinuxDocOnePar(std::ostream & os, LyXParagraph * par, - int desc_on, int depth); - /// - void SimpleDocBookOnePar(std::ostream &, string & extra, - LyXParagraph * par, int & desc_on, - int depth); - - /// LinuxDoc. - void push_tag(std::ostream & os, string const & tag, - int & pos, char stack[5][3]); - - /// LinuxDoc. - void pop_tag(std::ostream & os, string const & tag, - int & pos, char stack[5][3]); + 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; - + /// is autosave needed mutable bool bak_clean; - + /// is this a unnamed file (New...) bool unnamed; - /// is regenerating #.tex# necessary - DEPCLEAN * dep_clean; - /// buffer is r/o bool read_only; /// name of the file the buffer is associated with. - string filename; - - /// Format number of buffer - float format; - - /** A list of views using this buffer. - Why not keep a list of the BufferViews that use this buffer? + string filename_; - 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; + /// The path to the document file. + string filepath_; + /// + 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(LyXParagraph * paragraph) : par(paragraph) { - SetParagraph(); - } + inset_iterator(); /// - inset_iterator(LyXParagraph * paragraph, - LyXParagraph::size_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->(); + /// - LyXParagraph * getPar() { return par; } + ParagraphList::iterator getPar() const; /// - LyXParagraph::size_type getPos() const { return it.getPos(); } + lyx::pos_type getPos() const; /// friend bool operator==(inset_iterator const & iter1, inset_iterator const & iter2); - // - //friend - //bool operator!=(inset_iterator const & iter1, - // inset_iterator const & iter2); private: /// - void SetParagraph(); + void setParagraph(); + /// + ParagraphList::iterator pit; /// - LyXParagraph * par; + ParagraphList::iterator pend; /// - LyXParagraph::inset_iterator it; + InsetList::iterator it; }; - /// - inset_iterator inset_iterator_begin() { - return inset_iterator(paragraph); - } - /// - inset_iterator inset_iterator_end() { - 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(); -inline -void Buffer::setParentName(string const & name) -{ - params.parentname = name; -} + /// return a const iterator to all *top-level* insets in the buffer + inset_iterator inset_const_iterator_begin() const; -/// -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. -} + /// 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; -/// -inline -bool operator!=(Buffer::TocItem const & a, Buffer::TocItem const & b) { - return !(a == b); - // No need to compare depth. -} + /// + InsetOld * getInsetFromID(int id_arg) const; +}; -/// -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 -