]> git.lyx.org Git - lyx.git/blob - src/buffer.h
add missing writeNormal() methods to some insets
[lyx.git] / src / buffer.h
1 // -*- C++ -*-
2 /* This file is part of
3  * ====================================================== 
4  * 
5  *           LyX, The Document Processor         
6  *           Copyright 1995 Matthias Ettrich
7  *
8  *           This file is Copyleft 1996
9  *           Lars Gullik Bjønnes
10  *
11  * ====================================================== */
12  
13 #ifndef BUFFER_H
14 #define BUFFER_H
15
16 #ifdef __GNUG__
17 #pragma interface
18 #endif
19
20 #include "LString.h"
21 #include "undo.h"
22 #include "undostack.h"
23 #include "lyxvc.h"
24 #include "bufferparams.h"
25 #include "texrow.h"
26 #include "paragraph.h"
27
28 class BufferView;
29 class LyXRC;
30 class TeXErrors;
31 class LaTeXFeatures;
32 class Language;
33 class ParIterator;
34
35 // When lyx 1.3.x starts we should enable this
36 // btw. we should also test this with 1.2 so that we
37 // do not get any surprises. (Lgb)
38 //#define NO_COMPABILITY 1
39
40 ///
41 struct DEPCLEAN {
42         ///
43         bool clean;
44         ///
45         string master;
46         ///
47         DEPCLEAN * next;
48 };
49
50 /** The buffer object.
51   This is the buffer object. It contains all the informations about
52   a document loaded into LyX. I am not sure if the class is complete or
53   minimal, probably not.
54   \author Lars Gullik Bjønnes
55   */
56 class Buffer {
57 public:
58         /// What type of log will \c getLogName() return?
59         enum LogType {
60                 latexlog, ///< LaTeX log
61                 buildlog  ///< Literate build log
62         };
63
64         /** Constructor
65             \param file
66             \param b  optional \c false by default
67         */
68         explicit Buffer(string const & file, bool b = false);
69         
70         /// Destructor
71         ~Buffer();
72
73         /** Save the buffer's parameters as user default.
74             This function saves a file \c user_lyxdir/templates/defaults.lyx
75             which parameters are those of the current buffer. This file
76             is used as a default template when creating a new
77             file. Returns \c true on success.
78         */
79         bool saveParamsAsDefaults();
80
81         /** High-level interface to buffer functionality.
82             This function parses a command string and executes it
83         */
84         bool dispatch(string const & command);
85
86         /// Maybe we know the function already by number...
87         bool dispatch(int ac, string const & argument);
88
89         /// 
90         void resizeInsets(BufferView *);
91
92         /// Update window titles of all users.
93         void updateTitles() const;
94
95         /// Reset autosave timers for all users.
96         void resetAutosaveTimers() const;
97
98         /** Adds the BufferView to the users list.
99             Later this func will insert the \c BufferView into a real list,
100             not just setting a pointer.
101         */
102         void addUser(BufferView * u);
103
104         /** Removes the #BufferView# from the users list.
105             Since we only can have one at the moment, we just reset it.
106         */
107         void delUser(BufferView *);
108         
109         ///
110         void redraw();
111
112         /// Load the autosaved file.
113         void loadAutoSaveFile();
114         
115         /** Reads a file. 
116             \param par if != 0 insert the file.
117             \return \c false if method fails.
118         */
119         bool readFile(LyXLex &, Paragraph * par = 0);
120         
121         /** Reads a file without header.
122             \param par if != 0 insert the file.
123             \return \c false if file is not completely read.
124         */
125         bool readLyXformat2(LyXLex &, Paragraph * par = 0);
126
127         /// This parses a single LyXformat-Token.
128         bool parseSingleLyXformat2Token(LyXLex &, Paragraph *& par,
129                                         Paragraph *& return_par,
130                                         string const & token, int & pos,
131                                         Paragraph::depth_type & depth, 
132                                         LyXFont &);
133         ///
134         void insertStringAsLines(Paragraph *&, Paragraph::size_type &,
135                                  LyXFont const &, string const &) const;
136 #ifndef NO_COMPABILITY
137         ///
138         void insertErtContents(Paragraph * par, int & pos,
139                                LyXFont const & font,
140                                bool set_inactive = true);
141 #endif
142         ///
143         Paragraph * getParFromID(int id) const;
144 private:
145         /// Parse a single inset.
146         void readInset(LyXLex &, Paragraph *& par, int & pos, LyXFont &);
147 public:
148         /** Save file.
149             Takes care of auto-save files and backup file if requested.
150             Returns \c true if the save is successful, \c false otherwise.
151         */
152         bool save() const;
153         
154         /// Write file. Returns \c false if unsuccesful.
155         bool writeFile(string const &, bool) const;
156         
157         ///
158         void writeFileAscii(string const & , int);
159         ///
160         void writeFileAscii(std::ostream &, int);
161         ///
162         string const asciiParagraph(Paragraph const *,
163                                     unsigned int linelen) const;
164         ///
165         void makeLaTeXFile(string const & filename,
166                            string const & original_path,
167                            bool nice, bool only_body = false);
168         /** LaTeX all paragraphs from par to endpar.
169             \param \a endpar if == 0 then to the end
170         */
171         void latexParagraphs(std::ostream & os, Paragraph * par,
172                              Paragraph * endpar, TexRow & texrow) const;
173
174         ///
175         void simpleDocBookOnePar(std::ostream &, string & extra,
176                                  Paragraph * par, int & desc_on,
177                                  Paragraph::depth_type depth) const ;
178
179         ///
180         int runChktex();
181
182         ///
183         void makeLinuxDocFile(string const & filename,
184                               bool nice, bool only_body = false);
185         ///
186         void makeDocBookFile(string const & filename,
187                              bool nice, bool only_body = false);
188
189         /// returns the main language for the buffer (document)
190         Language const * getLanguage() const;
191         ///
192         bool isLyxClean() const;
193         ///
194         bool isBakClean() const;
195         ///
196         bool isDepClean(string const & name) const;
197         
198         ///
199         void markLyxClean() const;
200
201         ///
202         void markBakClean();
203         
204         ///
205         void markDepClean(string const & name);
206         
207         ///
208         void setUnnamed(bool flag = true);
209
210         ///
211         bool isUnnamed();
212
213         /// Mark this buffer as dirty.
214         void markDirty();
215
216         /// Returns the buffers filename.
217         string const & fileName() const;
218
219         /** A transformed version of the file name, adequate for LaTeX.
220             \param no_path optional if \c true then the path is stripped.
221         */
222         string const getLatexName(bool no_path = true) const;
223
224         /// Get the name and type of the log.
225         std::pair<LogType, string> const getLogName() const;
226  
227         /// Change name of buffer. Updates "read-only" flag.
228         void setFileName(string const & newfile);
229
230         /// Name of the document's parent
231         void setParentName(string const &);
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 LinuxDoc document
242         bool isLinuxDoc() const;
243         /// returns \c true if the buffer contains a DocBook document
244         bool isDocBook() const;
245         /** returns \c true if the buffer contains either a LinuxDoc
246             or DocBook document */
247         bool isSGML() const;
248         /// returns \c true if the buffer contains a Wed document
249         bool isLiterate() const;
250
251         ///
252         void setPaperStuff();
253
254         /** Validate a buffer for LaTeX.
255             This validates the buffer, and returns a struct for use by
256             #makeLaTeX# and others. Its main use is to figure out what
257             commands and packages need to be included in the LaTeX file.
258             It (should) also check that the needed constructs are there
259             (i.e. that the \refs points to coresponding \labels). It
260             should perhaps inset "error" insets to help the user correct
261             obvious mistakes.
262         */
263         void validate(LaTeXFeatures &) const;
264
265         ///
266         string const getIncludeonlyList(char delim = ',');
267         ///
268         std::vector<std::pair<string, string> > const getBibkeyList();
269         ///
270         struct TocItem {
271                 TocItem(Paragraph * p, int d, string const & s)
272                         : par(p), depth(d), str(s) {}
273                 ///
274                 Paragraph * par;
275                 ///
276                 int depth;
277                 ///
278                 string str;
279         };
280         ///
281         typedef std::vector<TocItem> SingleList;
282         ///
283         typedef std::map<string, SingleList> Lists;
284         ///
285         Lists const getLists() const;
286         ///
287         std::vector<string> const getLabelList();
288
289         /** This will clearly have to change later. Later we can have more
290             than one user per buffer. */
291         BufferView * getUser() const;
292
293         ///
294         void changeLanguage(Language const * from, Language const * to);
295         ///
296         bool isMultiLingual();
297
298         /// Does this mean that this is buffer local?
299         UndoStack undostack;
300         
301         /// Does this mean that this is buffer local? 
302         UndoStack redostack;
303         
304         ///
305         BufferParams params;
306         
307         /** The list of paragraphs.
308             This is a linked list of paragraph, this list holds the
309             whole contents of the document.
310          */
311         Paragraph * paragraph;
312
313         /// LyX version control object.
314         LyXVC lyxvc;
315
316         /// Where to put temporary files.
317         string tmppath;
318
319         /// The path to the document file.
320         string filepath;
321
322         /** If we are writing a nice LaTeX file or not.
323             While writing as LaTeX, tells whether we are
324             doing a 'nice' LaTeX file */
325         bool niceFile;
326
327         /// Used when typesetting to place errorboxes.
328         TexRow texrow;
329 private:
330         /// Open SGML/XML tag.
331         void sgmlOpenTag(std::ostream & os, Paragraph::depth_type depth,
332                          string const & latexname) const;
333         /// Closes SGML/XML tag.
334         void sgmlCloseTag(std::ostream & os, Paragraph::depth_type depth,
335                           string const & latexname) const;
336         ///
337         void linuxDocError(Paragraph * par, int pos,
338                            string const & message);
339         ///
340         void simpleLinuxDocOnePar(std::ostream & os, Paragraph * par, 
341                                   Paragraph::depth_type depth);
342
343         /// is save needed
344         mutable bool lyx_clean;
345         
346         /// is autosave needed
347         mutable bool bak_clean;
348         
349         /// is this a unnamed file (New...)
350         bool unnamed;
351
352         /// is regenerating #.tex# necessary
353         DEPCLEAN * dep_clean;
354
355         /// buffer is r/o
356         bool read_only;
357
358         /// name of the file the buffer is associated with.
359         string filename;
360
361         /// Format number of buffer
362         int file_format;
363         /** A list of views using this buffer.
364             Why not keep a list of the BufferViews that use this buffer?
365
366             At least then we don't have to do a lot of magic like:
367             #buffer->lyx_gui->bufferview->updateLayoutChoice#. Just ask each
368             of the buffers in the list of users to do a #updateLayoutChoice#.
369         */
370         BufferView * users;
371
372 public:
373         ///
374         class inset_iterator {
375         public:
376                 typedef std::input_iterator_tag iterator_category;
377                 typedef Inset value_type;
378                 typedef ptrdiff_t difference_type;
379                 typedef Inset * pointer;
380                 typedef Inset & reference;
381                 
382                 
383                 ///
384                 inset_iterator() : par(0) /*, it(0)*/ {}
385                 //
386                 inset_iterator(Paragraph * paragraph) : par(paragraph) {
387                         setParagraph();
388                 }
389                 ///
390                 inset_iterator(Paragraph * paragraph,
391                                Paragraph::size_type pos);
392                 ///
393                 inset_iterator & operator++() { // prefix ++
394                         if (par) {
395                                 ++it;
396                                 if (it == par->inset_iterator_end()) {
397                                         par = par->next();
398                                         setParagraph();
399                                 }
400                         }
401                         return *this;
402                 }
403                 ///
404                 inset_iterator operator++(int) { // postfix ++
405                         inset_iterator tmp(par, it.getPos());
406                         if (par) {
407                                 ++it;
408                                 if (it == par->inset_iterator_end()) {
409                                         par = par->next();
410                                         setParagraph();
411                                 }
412                         }
413                         return tmp;
414                 }
415                 ///
416                 Inset * operator*() { return *it; }
417                 
418                 ///
419                 Paragraph * getPar() { return par; }
420                 ///
421                 Paragraph::size_type getPos() const { return it.getPos(); }
422                 ///
423                 friend
424                 bool operator==(inset_iterator const & iter1,
425                                 inset_iterator const & iter2);
426         private:
427                 ///
428                 void setParagraph();
429                 ///
430                 Paragraph * par;
431                 ///
432                 Paragraph::inset_iterator it;
433         };
434
435         ///
436         inset_iterator inset_iterator_begin() {
437                 return inset_iterator(paragraph);
438         }
439         ///
440         inset_iterator inset_iterator_end() {
441                 return inset_iterator();
442         }
443         ///
444         inset_iterator inset_const_iterator_begin() const {
445                 return inset_iterator(paragraph);
446         }
447         ///
448         inset_iterator inset_const_iterator_end() const {
449                 return inset_iterator();
450         }
451
452         ///
453         ParIterator par_iterator_begin();
454         ///
455         ParIterator par_iterator_end();
456
457         ///
458         Inset * getInsetFromID(int id_arg) const;
459 };
460
461
462 inline
463 void Buffer::addUser(BufferView * u)
464 {
465         users = u;
466 }
467
468
469 inline
470 void Buffer::delUser(BufferView *)
471 {
472         users = 0;
473 }
474         
475
476 inline
477 Language const * Buffer::getLanguage() const
478 {
479         return params.language;
480 }
481         
482
483 inline
484 bool Buffer::isLyxClean() const
485 {
486         return lyx_clean;
487 }
488         
489
490 inline
491 bool Buffer::isBakClean() const
492 {
493         return bak_clean;
494 }
495
496
497 inline
498 void Buffer::markLyxClean() const
499
500         if (!lyx_clean) {
501                 lyx_clean = true; 
502                 updateTitles();
503         }
504         // if the .lyx file has been saved, we don't need an
505         // autosave 
506         bak_clean = true;
507 }
508
509
510 inline
511 void Buffer::markBakClean()
512 {
513         bak_clean = true;
514 }
515
516
517 inline
518 void Buffer::setUnnamed(bool flag)
519 {
520         unnamed = flag;
521 }
522
523
524 inline
525 bool Buffer::isUnnamed()
526 {
527         return unnamed;
528 }
529
530
531 inline
532 void Buffer::markDirty()
533 {
534         if (lyx_clean) {
535                 lyx_clean = false;
536                 updateTitles();
537         }
538         bak_clean = false;
539         DEPCLEAN * tmp = dep_clean;
540         while (tmp) {
541                 tmp->clean = false;
542                 tmp = tmp->next;
543         }
544 }
545
546
547 inline
548 string const & Buffer::fileName() const
549 {
550         return filename;
551 }
552
553
554 inline
555 bool Buffer::isReadonly() const
556 {
557         return read_only;
558 }
559
560
561 inline
562 BufferView * Buffer::getUser() const
563 {
564         return users;
565 }
566
567
568 inline  
569 void Buffer::setParentName(string const & name)
570 {
571         params.parentname = name;    
572 }
573
574
575 ///
576 inline
577 bool operator==(Buffer::TocItem const & a, Buffer::TocItem const & b) {
578         return a.par == b.par && a.str == b.str;
579         // No need to compare depth.
580 }
581
582
583 ///
584 inline
585 bool operator!=(Buffer::TocItem const & a, Buffer::TocItem const & b) {
586         return !(a == b);
587         // No need to compare depth.
588 }
589
590
591 ///
592 inline
593 bool operator==(Buffer::inset_iterator const & iter1,
594                 Buffer::inset_iterator const & iter2) {
595         return iter1.par == iter2.par
596                 && (iter1.par == 0 || iter1.it == iter2.it);
597 }
598
599
600 ///
601 inline
602 bool operator!=(Buffer::inset_iterator const & iter1,
603                 Buffer::inset_iterator const & iter2) {
604         return !(iter1 == iter2);
605 }
606
607 #endif