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