]> git.lyx.org Git - lyx.git/blob - src/Buffer.h
Remove embedding stuff from InsetBibtex.
[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 BufferParams;
28 class EmbeddedFileList;
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         /// Return the cache with all bibfiles in use (including bibfiles
310         /// of loaded child documents).
311         support::FileNameList const & getBibfilesCache() const;
312         ///
313         void getLabelList(std::vector<docstring> &) const;
314
315         ///
316         void changeLanguage(Language const * from, Language const * to);
317
318         ///
319         bool isMultiLingual() const;
320
321         ///
322         BufferParams & params();
323         BufferParams const & params() const;
324
325         /** The list of paragraphs.
326             This is a linked list of paragraph, this list holds the
327             whole contents of the document.
328          */
329         ParagraphList & paragraphs();
330         ParagraphList const & paragraphs() const;
331
332         /// LyX version control object.
333         LyXVC & lyxvc();
334         LyXVC const & lyxvc() const;
335
336         /// Where to put temporary files.
337         std::string const temppath() const;
338
339         /// Used when typesetting to place errorboxes.
340         TexRow const & texrow() const;
341
342         ///
343         ParIterator par_iterator_begin();
344         ///
345         ParConstIterator par_iterator_begin() const;
346         ///
347         ParIterator par_iterator_end();
348         ///
349         ParConstIterator par_iterator_end() const;
350
351         /** \returns true only when the file is fully loaded.
352          *  Used to prevent the premature generation of previews
353          *  and by the citation inset.
354          */
355         bool isFullyLoaded() const;
356         /// Set by buffer_funcs' newFile.
357         void setFullyLoaded(bool);
358
359         /// Our main text (inside the top InsetText)
360         Text & text() const;
361
362         /// Our top InsetText
363         Inset & inset() const;
364
365         //
366         // Macro handling
367         //
368         /// Collect macro definitions in paragraphs
369         void updateMacros() const;
370         /// Iterate through the whole buffer and try to resolve macros
371         void updateMacroInstances() const;
372
373         /// List macro names of this buffer, the parent and the children
374         void listMacroNames(MacroNameSet & macros) const;
375         /// Collect macros of the parent and its children in front of this buffer.
376         void listParentMacros(MacroSet & macros, LaTeXFeatures & features) const;
377
378         /// Return macro defined before pos (or in the master buffer)
379         MacroData const * getMacro(docstring const & name, DocIterator const & pos, bool global = true) const;
380         /// Return macro defined anywhere in the buffer (or in the master buffer)
381         MacroData const * getMacro(docstring const & name, bool global = true) const;
382         /// Return macro defined before the inclusion of the child
383         MacroData const * getMacro(docstring const & name, Buffer const & child, bool global = true) const;
384
385         /// Replace the inset contents for insets which InsetCode is equal
386         /// to the passed \p inset_code.
387         void changeRefsIfUnique(docstring const & from, docstring const & to,
388                 InsetCode code);
389
390         /// get source code (latex/docbook) for some paragraphs, or all paragraphs
391         /// including preamble
392         void getSourceCode(odocstream & os, pit_type par_begin, pit_type par_end,
393                 bool full_source);
394
395         /// Access to error list.
396         /// This method is used only for GUI visualisation of Buffer related
397         /// errors (like parsing or LateX compilation). This method is const
398         /// because modifying the returned ErrorList does not touch the document
399         /// contents.
400         ErrorList & errorList(std::string const & type) const;
401
402         /// The Toc backend.
403         /// This is useful only for screen visualisation of the Buffer. This
404         /// method is const because modifying this backend does not touch
405         /// the document contents.
406         TocBackend & tocBackend() const;
407         
408         //@{
409         EmbeddedFileList & embeddedFiles();
410         EmbeddedFileList const & embeddedFiles() const;
411         bool embedded() const;
412         //@}
413
414         Undo & undo();
415        
416         /// This function is called when the buffer is changed.
417         void changed() const;
418         /// This function is called when the buffer structure is changed.
419         void structureChanged() const;
420         /// This function is called when some parsing error shows up.
421         void errors(std::string const & err) const;
422         /// This function is called when the buffer busy status change.
423         void setBusy(bool on) const;
424         /// This function is called when the buffer readonly status change.
425         void setReadOnly(bool on) const;
426         /// Update window titles of all users.
427         void updateTitles() const;
428         /// Reset autosave timers for all users.
429         void resetAutosaveTimers() const;
430         ///
431         void message(docstring const & msg) const;
432
433         void setGuiDelegate(frontend::GuiBufferDelegate * gui);
434
435         ///
436         void autoSave() const;
437
438         /// return the format of the buffer on a string
439         std::string bufferFormat() const;
440
441         ///
442         bool doExport(std::string const & format, bool put_in_tempdir,
443                 std::string & result_file) const;
444         ///
445         bool doExport(std::string const & format, bool put_in_tempdir) const;
446         ///
447         bool preview(std::string const & format) const;
448         ///
449         bool isExportable(std::string const & format) const;
450         ///
451         std::vector<Format const *> exportableFormats(bool only_viewable) const;
452
453         ///
454         typedef std::vector<std::pair<InsetRef *, ParIterator> > References;
455         References & references(docstring const & label);
456         References const & references(docstring const & label) const;
457         void clearReferenceCache() const;
458         void setInsetLabel(docstring const & label, InsetLabel const * il);
459         InsetLabel const * insetLabel(docstring const & label) const;
460
461 private:
462         /// search for macro in local (buffer) table or in children
463         MacroData const * getBufferMacro(docstring const & name,
464                                          DocIterator const & pos) const;
465         /** Update macro table starting with position of it
466             \param it in some text inset
467         */
468         void updateMacros(DocIterator & it,
469                                      DocIterator & scope) const;
470
471         /// 
472         bool readFileHelper(support::FileName const & s);
473         ///
474         std::vector<std::string> backends() const;
475         /** Inserts a file into a document
476             \return \c false if method fails.
477         */
478         ReadStatus readFile(Lexer &, support::FileName const & filename,
479                             bool fromString = false);
480
481         /// Use the Pimpl idiom to hide the internals.
482         class Impl;
483         /// The pointer never changes although *pimpl_'s contents may.
484         Impl * const d;
485
486         frontend::GuiBufferDelegate * gui_;
487
488         /// This function is called when the buffer structure is changed.
489         Signal structureChanged_;
490         /// This function is called when some parsing error shows up.
491         //Signal errors(std::string const &) = 0;
492         /// This function is called when some message shows up.
493         //Signal message(docstring const &) = 0;
494         /// This function is called when the buffer busy status change.
495         //Signal setBusy(bool) = 0;
496         /// Reset autosave timers for all users.
497         Signal resetAutosaveTimers_;
498 };
499
500
501 } // namespace lyx
502
503 #endif