]> git.lyx.org Git - lyx.git/blob - src/buffer.h
remove unneeded includes
[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 "errorlist.h"
16 #include "InsetList.h"
17
18 #include "dociterator.h"
19 #include "ParagraphList_fwd.h"
20
21 #include "support/filename.h"
22 #include "support/limited_stack.h"
23 #include "support/types.h"
24 #include "support/docstring.h"
25 #include "support/docstream.h"
26
27 #include <boost/scoped_ptr.hpp>
28 #include <boost/signal.hpp>
29
30 #include <iosfwd>
31 #include <string>
32 #include <map>
33 #include <utility>
34 #include <vector>
35
36
37 namespace lyx {
38
39 class BufferParams;
40 class ErrorItem;
41 class FuncRequest;
42 class InsetBase;
43 class InsetText;
44 class LyXFont;
45 class LyXLex;
46 class LyXRC;
47 class LyXText;
48 class LyXVC;
49 class LaTeXFeatures;
50 class Language;
51 class MacroData;
52 class OutputParams;
53 class ParConstIterator;
54 class ParIterator;
55 class TeXErrors;
56 class TexRow;
57 class TocBackend;
58 class Undo;
59 class StableDocIterator;
60
61
62 /** The buffer object.
63  * This is the buffer object. It contains all the informations about
64  * a document loaded into LyX.
65  * The buffer object owns the LyXText (wrapped in an InsetText), which
66  * contains the individual paragraphs of the document.
67  *
68  *
69  * I am not sure if the class is complete or
70  * minimal, probably not.
71  * \author Lars Gullik Bjønnes
72   */
73 class Buffer {
74 public:
75         /// What type of log will \c getLogName() return?
76         enum LogType {
77                 latexlog, ///< LaTeX log
78                 buildlog  ///< Literate build log
79         };
80
81         /** Constructor
82             \param file
83             \param b  optional \c false by default
84         */
85         explicit Buffer(std::string const & file, bool b = false);
86
87         /// Destructor
88         ~Buffer();
89
90         /** High-level interface to buffer functionality.
91             This function parses a command string and executes it
92         */
93         bool dispatch(std::string const & command, bool * result = 0);
94
95         /// Maybe we know the function already by number...
96         bool dispatch(FuncRequest const & func, bool * result = 0);
97
98         /// Load the autosaved file.
99         void loadAutoSaveFile();
100
101         /// load a new file
102         bool readFile(std::string const & filename);
103
104         /// read the header, returns number of unknown tokens
105         int readHeader(LyXLex & lex);
106
107         /** Reads a file without header.
108             \param par if != 0 insert the file.
109             \return \c false if file is not completely read.
110         */
111         bool readDocument(LyXLex &);
112
113         ///
114         void insertStringAsLines(ParagraphList & plist,
115                 pit_type &, pos_type &,
116                 LyXFont const &, docstring const &, bool);
117         ///
118         ParIterator getParFromID(int id) const;
119         /// do we have a paragraph with this id?
120         bool hasParWithID(int id) const;
121
122         /// This signal is emitted when the buffer is changed.
123         boost::signal<void()> changed;
124         /// This signal is emitted when some parsing error shows up.
125         boost::signal<void(std::string)> errors;
126         /// This signal is emitted when some message shows up.
127         boost::signal<void(docstring)> message;
128         /// This signal is emitted when the buffer busy status change.
129         boost::signal<void(bool)> busy;
130         /// This signal is emitted when the buffer readonly status change.
131         boost::signal<void(bool)> readonly;
132         /// Update window titles of all users.
133         boost::signal<void()> updateTitles;
134         /// Reset autosave timers for all users.
135         boost::signal<void()> resetAutosaveTimers;
136         /// This signal is emitting if the buffer is being closed.
137         boost::signal<void()> closing;
138
139
140         /** Save file.
141             Takes care of auto-save files and backup file if requested.
142             Returns \c true if the save is successful, \c false otherwise.
143         */
144         bool save() const;
145
146         /// Write file. Returns \c false if unsuccesful.
147         bool writeFile(support::FileName const &) const;
148
149         /// Just a wrapper for the method below, first creating the ofstream.
150         bool makeLaTeXFile(support::FileName const & filename,
151                            std::string const & original_path,
152                            OutputParams const &,
153                            bool output_preamble = true,
154                            bool output_body = true);
155         ///
156         void writeLaTeXSource(odocstream & os,
157                            std::string const & original_path,
158                            OutputParams const &,
159                            bool output_preamble = true,
160                            bool output_body = true);
161         ///
162         void makeDocBookFile(support::FileName const & filename,
163                              OutputParams const & runparams_in,
164                              bool only_body = false);
165         ///
166         void writeDocBookSource(odocstream & os, std::string const & filename,
167                              OutputParams const & runparams_in,
168                              bool only_body = false);
169         /// returns the main language for the buffer (document)
170         Language const * getLanguage() const;
171         /// get l10n translated to the buffers language
172         docstring const B_(std::string const & l10n) const;
173         /// translate \p label to the buffer language if possible
174         docstring const translateLabel(docstring const & label) const;
175
176         ///
177         int runChktex();
178         /// return true if the main lyx file does not need saving
179         bool isClean() const;
180         ///
181         bool isBakClean() const;
182         ///
183         bool isDepClean(std::string const & name) const;
184
185         /// mark the main lyx file as not needing saving
186         void markClean() const;
187
188         ///
189         void markBakClean();
190
191         ///
192         void markDepClean(std::string const & name);
193
194         ///
195         void setUnnamed(bool flag = true);
196
197         ///
198         bool isUnnamed() const;
199
200         /// Mark this buffer as dirty.
201         void markDirty();
202
203         /// Returns the buffer's filename. It is always an absolute path.
204         std::string const fileName() const;
205
206         /// Returns the the path where the buffer lives.
207         /// It is always an absolute path.
208         std::string const & filePath() const;
209
210         /** A transformed version of the file name, adequate for LaTeX.
211             \param no_path optional if \c true then the path is stripped.
212         */
213         std::string const getLatexName(bool no_path = true) const;
214
215         /// Get thee name and type of the log.
216         std::pair<LogType, std::string> const getLogName() const;
217
218         /// Change name of buffer. Updates "read-only" flag.
219         void setFileName(std::string const & newfile);
220
221         /// Name of the document's parent
222         void setParentName(std::string const &);
223
224         /** Get the document's master (or \c this if this is not a
225             child document)
226          */
227         Buffer const * getMasterBuffer() const;
228         /** Get the document's master (or \c this if this is not a
229             child document)
230          */
231         Buffer * getMasterBuffer();
232
233         /// Is buffer read-only?
234         bool isReadonly() const;
235
236         /// Set buffer read-only flag
237         void setReadonly(bool flag = true);
238
239         /// returns \c true if the buffer contains a LaTeX document
240         bool isLatex() const;
241         /// returns \c true if the buffer contains a DocBook document
242         bool isDocBook() const;
243         /// returns \c true if the buffer contains a Wed document
244         bool isLiterate() const;
245
246         /** Validate a buffer for LaTeX.
247             This validates the buffer, and returns a struct for use by
248             #makeLaTeX# and others. Its main use is to figure out what
249             commands and packages need to be included in the LaTeX file.
250             It (should) also check that the needed constructs are there
251             (i.e. that the \refs points to coresponding \labels). It
252             should perhaps inset "error" insets to help the user correct
253             obvious mistakes.
254         */
255         void validate(LaTeXFeatures &) const;
256
257         /// return all bibkeys from buffer and its childs
258         void fillWithBibKeys(std::vector<std::pair<std::string, std::string> > & keys) const;
259         /// Update the cache with all bibfiles in use (including bibfiles
260         /// of loaded child documents).
261         void updateBibfilesCache();
262         /// Return the cache with all bibfiles in use (including bibfiles
263         /// of loaded child documents).
264         std::vector<support::FileName> const & getBibfilesCache() const;
265         ///
266         void getLabelList(std::vector<docstring> &) const;
267
268         ///
269         void changeLanguage(Language const * from, Language const * to);
270
271         ///
272         void updateDocLang(Language const * nlang);
273
274         ///
275         bool isMultiLingual() const;
276
277         /// Does this mean that this is buffer local?
278         limited_stack<Undo> & undostack();
279         limited_stack<Undo> const & undostack() const;
280
281         /// Does this mean that this is buffer local?
282         limited_stack<Undo> & redostack();
283         limited_stack<Undo> const & redostack() const;
284
285         ///
286         BufferParams & params();
287         BufferParams const & params() const;
288
289         /** The list of paragraphs.
290             This is a linked list of paragraph, this list holds the
291             whole contents of the document.
292          */
293         ParagraphList & paragraphs();
294         ParagraphList const & paragraphs() const;
295
296         /// LyX version control object.
297         LyXVC & lyxvc();
298         LyXVC const & lyxvc() const;
299
300         /// Where to put temporary files.
301         std::string const & temppath() const;
302
303         /// Used when typesetting to place errorboxes.
304         TexRow & texrow();
305         TexRow const & texrow() const;
306
307         ///
308         ParIterator par_iterator_begin();
309         ///
310         ParConstIterator par_iterator_begin() const;
311         ///
312         ParIterator par_iterator_end();
313         ///
314         ParConstIterator par_iterator_end() const;
315
316         /** \returns true only when the file is fully loaded.
317          *  Used to prevent the premature generation of previews
318          *  and by the citation inset.
319          */
320         bool fully_loaded() const;
321         /// Set by buffer_funcs' newFile.
322         void fully_loaded(bool);
323
324         /// Our main text (inside the top InsetText)
325         LyXText & text() const;
326
327         /// Our top InsetText!
328         InsetBase & inset() const;
329
330         //
331         // Macro handling
332         //
333         ///
334         void buildMacros();
335         ///
336         bool hasMacro(docstring const & name) const;
337         ///
338         MacroData const & getMacro(docstring const & name) const;
339         ///
340         void insertMacro(docstring const & name, MacroData const & data);
341
342         ///
343         void saveCursor(StableDocIterator cursor, StableDocIterator anchor);
344         ///
345         StableDocIterator getCursor() const { return cursor_; }
346         ///
347         StableDocIterator getAnchor() const { return anchor_; }
348         ///
349         void changeRefsIfUnique(docstring const & from, docstring const & to,
350                 InsetBase::Code code);
351 /// get source code (latex/docbook) for some paragraphs, or all paragraphs
352 /// including preamble
353         void getSourceCode(odocstream & os, pit_type par_begin, pit_type par_end, bool full_source);
354
355         /// errorLists_ accessors.
356         //@{
357         ErrorList const & errorList(std::string const & type) const;
358         ErrorList & errorList(std::string const & type);
359         //@}
360
361         //@{
362         TocBackend & tocBackend();
363         TocBackend const & tocBackend() const;
364         //@}
365
366 private:
367         /** Inserts a file into a document
368             \return \c false if method fails.
369         */
370         bool readFile(LyXLex &, std::string const & filename);
371
372         bool do_writeFile(std::ostream & ofs) const;
373
374         /// Use the Pimpl idiom to hide the internals.
375         class Impl;
376         /// The pointer never changes although *pimpl_'s contents may.
377         boost::scoped_ptr<Impl> const pimpl_;
378
379         /// Save the cursor Position on Buffer switch
380         /// this would not be needed if every Buffer would have
381         /// it's BufferView, this should be FIXED in future.
382         StableDocIterator cursor_;
383         StableDocIterator anchor_;
384         /// A cache for the bibfiles (including bibfiles of loaded child
385         /// documents), needed for appropriate update of natbib labels.
386         std::vector<support::FileName> bibfilesCache_;
387
388         /// Container for all sort of Buffer dependant errors.
389         std::map<std::string, ErrorList> errorLists_;
390 };
391
392
393 } // namespace lyx
394
395 #endif