]> git.lyx.org Git - lyx.git/blob - src/Buffer.h
Fix some of the BibTeX cache issues. We need to be able to invalidate the cache when
[lyx.git] / src / Buffer.h
1 // -*- C++ -*-
2 /**
3  * \file Buffer.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Lars Gullik Bjønnes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #ifndef BUFFER_H
13 #define BUFFER_H
14
15 #include "insets/InsetCode.h"
16
17 #include "support/strfwd.h"
18 #include "support/types.h"
19 #include "support/SignalSlot.h"
20
21 #include <string>
22 #include <vector>
23
24
25 namespace lyx {
26
27 class BiblioInfo;
28 class BufferParams;
29 class DocIterator;
30 class ErrorItem;
31 class ErrorList;
32 class FuncRequest;
33 class Inset;
34 class InsetRef;
35 class InsetLabel;
36 class Font;
37 class Format;
38 class Lexer;
39 class LyXRC;
40 class Text;
41 class LyXVC;
42 class LaTeXFeatures;
43 class Language;
44 class MacroData;
45 class MacroNameSet;
46 class MacroSet;
47 class OutputParams;
48 class Paragraph;
49 class ParConstIterator;
50 class ParIterator;
51 class ParagraphList;
52 class TeXErrors;
53 class TexRow;
54 class TocBackend;
55 class Undo;
56
57 namespace frontend {
58 class GuiBufferDelegate;
59 class WorkAreaManager;
60 }
61
62 namespace support {
63 class FileName;
64 class FileNameList;
65 }
66
67 /** The buffer object.
68  * This is the buffer object. It contains all the informations about
69  * a document loaded into LyX.
70  * The buffer object owns the Text (wrapped in an InsetText), which
71  * contains the individual paragraphs of the document.
72  *
73  *
74  * I am not sure if the class is complete or
75  * minimal, probably not.
76  * \author Lars Gullik Bjønnes
77  */
78 class Buffer {
79 public:
80         /// What type of log will \c getLogName() return?
81         enum LogType {
82                 latexlog, ///< LaTeX log
83                 buildlog  ///< Literate build log
84         };
85
86         /// Result of \c readFile()
87         enum ReadStatus {
88                 failure, ///< The file could not be read
89                 success, ///< The file could not be read
90                 wrongversion ///< The version of the file does not match ours
91         };
92
93
94         /// Method to check if a file is externally modified, used by 
95         /// isExternallyModified()
96         /**
97          * timestamp is fast but inaccurate. For example, the granularity
98          * of timestamp on a FAT filesystem is 2 second. Also, various operations
99          * may touch the timestamp of a file even when its content is unchanged.
100          *
101          * checksum is accurate but slow, which can be a problem when it is 
102          * frequently used, or used for a large file on a slow (network) file
103          * system.
104          *
105          * FIXME: replace this method with support/FileMonitor.
106          */
107         enum CheckMethod {
108                 checksum_method,  ///< Use file checksum
109                 timestamp_method, ///< Use timestamp, and checksum if timestamp has changed
110         };
111         
112         /** Constructor
113             \param file
114             \param b  optional \c false by default
115         */
116         explicit Buffer(std::string const & file, bool b = false);
117
118         /// Destructor
119         ~Buffer();
120
121         /** High-level interface to buffer functionality.
122             This function parses a command string and executes it
123         */
124         bool dispatch(std::string const & command, bool * result = 0);
125
126         /// Maybe we know the function already by number...
127         bool dispatch(FuncRequest const & func, bool * result = 0);
128
129         /// Load the autosaved file.
130         void loadAutoSaveFile();
131
132         /// read a new document from a string
133         bool readString(std::string const &);
134         /// load a new file
135         bool readFile(support::FileName const & filename);
136
137         /// read the header, returns number of unknown tokens
138         int readHeader(Lexer & lex);
139
140         /** Reads a file without header.
141             \param par if != 0 insert the file.
142             \return \c false if file is not completely read.
143         */
144         bool readDocument(Lexer &);
145
146         ///
147         void insertStringAsLines(ParagraphList & plist,
148                 pit_type &, pos_type &,
149                 Font const &, docstring const &, bool);
150         ///
151         DocIterator getParFromID(int id) const;
152         /// do we have a paragraph with this id?
153         bool hasParWithID(int id) const;
154
155         ///
156         frontend::WorkAreaManager & workAreaManager() const;
157
158         /** Save file.
159             Takes care of auto-save files and backup file if requested.
160             Returns \c true if the save is successful, \c false otherwise.
161         */
162         bool save() const;
163
164         /// Write document to stream. Returns \c false if unsuccesful.
165         bool write(std::ostream &) const;
166         /// Write file. Returns \c false if unsuccesful.
167         bool writeFile(support::FileName const &) const;
168
169   /// Loads LyX file \c filename into buffer, *  and \return success 
170         bool loadLyXFile(support::FileName const & s);
171
172         /// Fill in the ErrorList with the TeXErrors
173         void bufferErrors(TeXErrors const &, ErrorList &) const;
174
175         /// Just a wrapper for writeLaTeXSource, first creating the ofstream.
176         bool makeLaTeXFile(support::FileName const & filename,
177                            std::string const & original_path,
178                            OutputParams const &,
179                            bool output_preamble = true,
180                            bool output_body = true) const;
181         /** Export the buffer to LaTeX.
182             If \p os is a file stream, and params().inputenc is "auto" or
183             "default", and the buffer contains text in different languages
184             with more than one encoding, then this method will change the
185             encoding associated to \p os. Therefore you must not call this
186             method with a string stream if the output is supposed to go to a
187             file. \code
188             odocfstream ofs;
189             ofs.open("test.tex");
190             writeLaTeXSource(ofs, ...);
191             ofs.close();
192             \endcode is NOT equivalent to \code
193             odocstringstream oss;
194             writeLaTeXSource(oss, ...);
195             odocfstream ofs;
196             ofs.open("test.tex");
197             ofs << oss.str();
198             ofs.close();
199             \endcode
200          */
201         void writeLaTeXSource(odocstream & os,
202                            std::string const & original_path,
203                            OutputParams const &,
204                            bool output_preamble = true,
205                            bool output_body = true) const;
206         ///
207         void makeDocBookFile(support::FileName const & filename,
208                              OutputParams const & runparams_in,
209                              bool only_body = false) const;
210         ///
211         void writeDocBookSource(odocstream & os, std::string const & filename,
212                              OutputParams const & runparams_in,
213                              bool only_body = false) const;
214         /// returns the main language for the buffer (document)
215         Language const * language() const;
216         /// get l10n translated to the buffers language
217         docstring const B_(std::string const & l10n) const;
218
219         ///
220         int runChktex();
221         /// return true if the main lyx file does not need saving
222         bool isClean() const;
223         ///
224         bool isBakClean() const;
225         ///
226         bool isDepClean(std::string const & name) const;
227
228         /// whether or not disk file has been externally modified
229         bool isExternallyModified(CheckMethod method) const;
230
231         /// save timestamp and checksum of the given file.
232         void saveCheckSum(support::FileName const & file) const;
233
234         /// mark the main lyx file as not needing saving
235         void markClean() const;
236
237         ///
238         void markBakClean() const;
239
240         ///
241         void markDepClean(std::string const & name);
242
243         ///
244         void setUnnamed(bool flag = true);
245
246         ///
247         bool isUnnamed() const;
248
249         /// Mark this buffer as dirty.
250         void markDirty();
251
252         /// Returns the buffer's filename. It is always an absolute path.
253         support::FileName fileName() const;
254
255         /// Returns the buffer's filename. It is always an absolute path.
256         std::string absFileName() const;
257
258         /// Returns the the path where the buffer lives.
259         /// It is always an absolute path.
260         std::string filePath() const;
261
262         /** A transformed version of the file name, adequate for LaTeX.
263             \param no_path optional if \c true then the path is stripped.
264         */
265         std::string latexName(bool no_path = true) const;
266
267         /// Get thee name and type of the log.
268         std::string logName(LogType * type = 0) const;
269
270         /// Change name of buffer. Updates "read-only" flag.
271         void setFileName(std::string const & newfile);
272
273         /// Set document's parent Buffer.
274         void setParent(Buffer const *);
275         Buffer const * parent();
276
277         /** Get the document's master (or \c this if this is not a
278             child document)
279          */
280         Buffer const * masterBuffer() const;
281
282         /// Is buffer read-only?
283         bool isReadonly() const;
284
285         /// Set buffer read-only flag
286         void setReadonly(bool flag = true);
287
288         /// returns \c true if the buffer contains a LaTeX document
289         bool isLatex() const;
290         /// returns \c true if the buffer contains a DocBook document
291         bool isDocBook() const;
292         /// returns \c true if the buffer contains a Wed document
293         bool isLiterate() const;
294
295         /** Validate a buffer for LaTeX.
296             This validates the buffer, and returns a struct for use by
297             #makeLaTeX# and others. Its main use is to figure out what
298             commands and packages need to be included in the LaTeX file.
299             It (should) also check that the needed constructs are there
300             (i.e. that the \refs points to coresponding \labels). It
301             should perhaps inset "error" insets to help the user correct
302             obvious mistakes.
303         */
304         void validate(LaTeXFeatures &) const;
305
306         /// Update the cache with all bibfiles in use (including bibfiles
307         /// of loaded child documents).
308         void updateBibfilesCache() const;
309         ///
310         void invalidateBibfilesCache();
311         /// Return the cache with all bibfiles in use (including bibfiles
312         /// of loaded child documents).
313         support::FileNameList const & getBibfilesCache() const;
314         /// \return the bibliography information for this buffer's master,
315         /// or just for it, if it isn't a child.
316         BiblioInfo const & masterBibInfo() const;
317         /// \return the bibliography information for this buffer ONLY.
318         BiblioInfo const & localBibInfo() const;
319         ///
320         void getLabelList(std::vector<docstring> &) const;
321
322         ///
323         void changeLanguage(Language const * from, Language const * to);
324
325         ///
326         bool isMultiLingual() const;
327
328         ///
329         BufferParams & params();
330         BufferParams const & params() const;
331
332         /** The list of paragraphs.
333             This is a linked list of paragraph, this list holds the
334             whole contents of the document.
335          */
336         ParagraphList & paragraphs();
337         ParagraphList const & paragraphs() const;
338
339         /// LyX version control object.
340         LyXVC & lyxvc();
341         LyXVC const & lyxvc() const;
342
343         /// Where to put temporary files.
344         std::string const temppath() const;
345
346         /// Used when typesetting to place errorboxes.
347         TexRow const & texrow() const;
348
349         ///
350         ParIterator par_iterator_begin();
351         ///
352         ParConstIterator par_iterator_begin() const;
353         ///
354         ParIterator par_iterator_end();
355         ///
356         ParConstIterator par_iterator_end() const;
357
358         /** \returns true only when the file is fully loaded.
359          *  Used to prevent the premature generation of previews
360          *  and by the citation inset.
361          */
362         bool isFullyLoaded() const;
363         /// Set by buffer_funcs' newFile.
364         void setFullyLoaded(bool);
365
366         /// Our main text (inside the top InsetText)
367         Text & text() const;
368
369         /// Our top InsetText
370         Inset & inset() const;
371
372         //
373         // Macro handling
374         //
375         /// Collect macro definitions in paragraphs
376         void updateMacros() const;
377         /// Iterate through the whole buffer and try to resolve macros
378         void updateMacroInstances() const;
379
380         /// List macro names of this buffer, the parent and the children
381         void listMacroNames(MacroNameSet & macros) const;
382         /// Collect macros of the parent and its children in front of this buffer.
383         void listParentMacros(MacroSet & macros, LaTeXFeatures & features) const;
384
385         /// Return macro defined before pos (or in the master buffer)
386         MacroData const * getMacro(docstring const & name, DocIterator const & pos, bool global = true) const;
387         /// Return macro defined anywhere in the buffer (or in the master buffer)
388         MacroData const * getMacro(docstring const & name, bool global = true) const;
389         /// Return macro defined before the inclusion of the child
390         MacroData const * getMacro(docstring const & name, Buffer const & child, bool global = true) const;
391
392         /// Replace the inset contents for insets which InsetCode is equal
393         /// to the passed \p inset_code.
394         void changeRefsIfUnique(docstring const & from, docstring const & to,
395                 InsetCode code);
396
397         /// get source code (latex/docbook) for some paragraphs, or all paragraphs
398         /// including preamble
399         void getSourceCode(odocstream & os, pit_type par_begin, pit_type par_end,
400                 bool full_source);
401
402         /// Access to error list.
403         /// This method is used only for GUI visualisation of Buffer related
404         /// errors (like parsing or LateX compilation). This method is const
405         /// because modifying the returned ErrorList does not touch the document
406         /// contents.
407         ErrorList & errorList(std::string const & type) const;
408
409         /// The Toc backend.
410         /// This is useful only for screen visualisation of the Buffer. This
411         /// method is const because modifying this backend does not touch
412         /// the document contents.
413         TocBackend & tocBackend() const;
414
415         ///
416         Undo & undo();
417
418         /// This function is called when the buffer is changed.
419         void changed() const;
420         /// This function is called when the buffer structure is changed.
421         void structureChanged() const;
422         /// This function is called when some parsing error shows up.
423         void errors(std::string const & err) const;
424         /// This function is called when the buffer busy status change.
425         void setBusy(bool on) const;
426         /// This function is called when the buffer readonly status change.
427         void setReadOnly(bool on) const;
428         /// Update window titles of all users.
429         void updateTitles() const;
430         /// Reset autosave timers for all users.
431         void resetAutosaveTimers() const;
432         ///
433         void message(docstring const & msg) const;
434
435         void setGuiDelegate(frontend::GuiBufferDelegate * gui);
436
437         ///
438         void autoSave() const;
439
440         /// return the format of the buffer on a string
441         std::string bufferFormat() const;
442
443         ///
444         bool doExport(std::string const & format, bool put_in_tempdir,
445                 std::string & result_file) const;
446         ///
447         bool doExport(std::string const & format, bool put_in_tempdir) const;
448         ///
449         bool preview(std::string const & format) const;
450         ///
451         bool isExportable(std::string const & format) const;
452         ///
453         std::vector<Format const *> exportableFormats(bool only_viewable) const;
454
455         ///
456         typedef std::vector<std::pair<InsetRef *, ParIterator> > References;
457         References & references(docstring const & label);
458         References const & references(docstring const & label) const;
459         void clearReferenceCache() const;
460         void setInsetLabel(docstring const & label, InsetLabel const * il);
461         InsetLabel const * insetLabel(docstring const & label) const;
462
463 private:
464         /// search for macro in local (buffer) table or in children
465         MacroData const * getBufferMacro(docstring const & name,
466                                          DocIterator const & pos) const;
467         /** Update macro table starting with position of it
468             \param it in some text inset
469         */
470         void updateMacros(DocIterator & it,
471                                      DocIterator & scope) const;
472
473         /// 
474         bool readFileHelper(support::FileName const & s);
475         ///
476         std::vector<std::string> backends() const;
477         /** Inserts a file into a document
478             \return \c false if method fails.
479         */
480         ReadStatus readFile(Lexer &, support::FileName const & filename,
481                             bool fromString = false);
482
483         /// Use the Pimpl idiom to hide the internals.
484         class Impl;
485         /// The pointer never changes although *pimpl_'s contents may.
486         Impl * const d;
487
488         frontend::GuiBufferDelegate * gui_;
489
490         /// This function is called when the buffer structure is changed.
491         Signal structureChanged_;
492         /// This function is called when some parsing error shows up.
493         //Signal errors(std::string const &) = 0;
494         /// This function is called when some message shows up.
495         //Signal message(docstring const &) = 0;
496         /// This function is called when the buffer busy status change.
497         //Signal setBusy(bool) = 0;
498         /// Reset autosave timers for all users.
499         Signal resetAutosaveTimers_;
500 };
501
502
503 } // namespace lyx
504
505 #endif