2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich
8 * This file is Copyleft 1996
11 * ====================================================== */
15 // 23/03/98 Heinrich Bauer (heinrich.bauer@t-mobil.de)
16 // Spots marked "changed Heinrich Bauer, 23/03/98" modified due to the
17 // following bug: dvi file export did not work after printing (or previewing)
18 // and vice versa as long as the same file was concerned. This happened
19 // every time the LyX-file was left unchanged between the two actions mentioned
31 #include "BufferView.h"
33 #include "bufferparams.h"
52 /** The buffer object.
53 The is 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
60 /// What type of log will \c getLogName() return?
62 latexlog, ///< LaTeX log
63 buildlog ///< Literate build log
68 \param b optional \c false by default
70 explicit Buffer(string const & file, bool b = false);
75 /** Save the buffer's parameters as user default.
76 This function saves a file \c user_lyxdir/templates/defaults.lyx
77 which parameters are those of the current buffer. This file
78 is used as a default template when creating a new
79 file. Returns \c true on success.
81 bool saveParamsAsDefaults();
83 /** High-level interface to buffer functionality.
84 This function parses a command string and executes it
86 bool Dispatch(string const & command);
88 /// Maybe we know the function already by number...
89 bool Dispatch(int ac, string const & argument);
91 /// Should be changed to work for a list.
94 void resizeInsets(BufferView *);
96 /// Update window titles of all users.
97 void updateTitles() const;
99 /// Reset autosave timers for all users.
100 void resetAutosaveTimers() const;
102 /** Adds the BufferView to the users list.
103 Later this func will insert the \c BufferView into a real list,
104 not just setting a pointer.
106 void addUser(BufferView * u);
108 /** Removes the #BufferView# from the users list.
109 Since we only can have one at the moment, we just reset it.
111 void delUser(BufferView *);
116 /// Load the autosaved file.
117 void loadAutoSaveFile();
120 \param par if != 0 insert the file.
121 \return \c false if method fails.
123 bool readFile(LyXLex &, LyXParagraph * par = 0);
125 /** Reads a file without header.
126 \param par if != 0 insert the file.
127 \return \c false if file is not completely read.
129 bool readLyXformat2(LyXLex &, LyXParagraph * par = 0);
131 /// This parses a single LyXformat-Token.
132 bool parseSingleLyXformat2Token(LyXLex &, LyXParagraph *& par,
133 LyXParagraph *& return_par,
134 string const & token, int & pos,
135 char & depth, LyXFont &
137 ,LyXParagraph::footnote_flag &,
138 LyXParagraph::footnote_kind &
142 /// Parse a single inset.
143 void readInset(LyXLex &, LyXParagraph *& par, int & pos, LyXFont &);
146 Takes care of auto-save files and backup file if requested.
147 Returns \c true if the save is successful, \c false otherwise.
151 /// Write file. Returns \c false if unsuccesful.
152 bool writeFile(string const &, bool) const;
155 void writeFileAscii(string const & , int);
157 void writeFileAscii(std::ostream &, int);
159 string const asciiParagraph(LyXParagraph const *,
160 unsigned int linelen) const;
162 void makeLaTeXFile(string const & filename,
163 string const & original_path,
164 bool nice, bool only_body = false);
165 /** LaTeX all paragraphs from par to endpar.
166 \param \a endpar if == 0 then to the end
168 void latexParagraphs(std::ostream & os, LyXParagraph * par,
169 LyXParagraph * endpar, TexRow & texrow) const;
172 void SimpleDocBookOnePar(std::ostream &, string & extra,
173 LyXParagraph * par, int & desc_on,
180 void makeLinuxDocFile(string const & filename,
181 bool nice, bool only_body = false);
183 void makeDocBookFile(string const & filename,
184 bool nice, bool only_body = false);
186 /// returns the main language for the buffer (document)
187 Language const * GetLanguage() const;
189 bool isLyxClean() const;
191 bool isBakClean() const;
193 bool isDepClean(string const & name) const;
196 void markLyxClean() const;
202 void markDepClean(string const & name);
205 void setUnnamed(bool flag=true);
210 /// Mark this buffer as dirty.
213 /// Returns the buffers filename.
214 string const & fileName() const;
216 /** A transformed version of the file name, adequate for LaTeX.
217 \param no_path optional if \c true then the path is stripped.
219 string const getLatexName(bool no_path = true) const;
221 /// Get the name and type of the log.
222 std::pair<LogType, string> const getLogName() const;
224 /// Change name of buffer. Updates "read-only" flag.
225 void setFileName(string const & newfile);
227 /// Name of the document's parent
228 void setParentName(string const &);
230 /// Is buffer read-only?
231 bool isReadonly() const;
233 /// Set buffer read-only flag
234 void setReadonly(bool flag = true);
236 /// returns \c true if the buffer contains a LaTeX document
237 bool isLatex() const;
238 /// returns \c true if the buffer contains a LinuxDoc document
239 bool isLinuxDoc() const;
240 /// returns \c true if the buffer contains a DocBook document
241 bool isDocBook() const;
242 /** returns \c true if the buffer contains either a LinuxDoc
243 or DocBook document */
245 /// returns \c true if the buffer contains a Wed document
246 bool isLiterate() const;
249 void setPaperStuff();
251 /** Validate a buffer for LaTeX.
252 This validates the buffer, and returns a struct for use by
253 #makeLaTeX# and others. Its main use is to figure out what
254 commands and packages need to be included in the LaTeX file.
255 It (should) also check that the needed constructs are there
256 (i.e. that the \refs points to coresponding \labels). It
257 should perhaps inset "error" insets to help the user correct
260 void validate(LaTeXFeatures &) const;
263 string const getIncludeonlyList(char delim = ',');
265 std::vector<std::pair<string, string> > const getBibkeyList();
276 std::map<string, std::vector<TocItem> > const getTocList() const;
278 std::vector<string> const getLabelList();
280 /** This will clearly have to change later. Later we can have more
281 than one user per buffer. */
282 BufferView * getUser() const;
285 void ChangeLanguage(Language const * from, Language const * to);
287 bool isMultiLingual();
289 /// Does this mean that this is buffer local?
292 /// Does this mean that this is buffer local?
298 /** The list of paragraphs.
299 This is a linked list of paragraph, this list holds the
300 whole contents of the document.
302 LyXParagraph * paragraph;
304 /// LyX version control object.
307 /// Where to put temporary files.
310 /// The path to the document file.
313 /** If we are writing a nice LaTeX file or not.
314 While writing as LaTeX, tells whether we are
315 doing a 'nice' LaTeX file */
318 /// Used when typesetting to place errorboxes.
323 void linuxDocHandleFootnote(std::ostream & os,
324 LyXParagraph * & par, int depth);
327 void DocBookHandleCaption(std::ostream & os, string & inner_tag,
328 int depth, int desc_on,
329 LyXParagraph * & par);
332 void DocBookHandleFootnote(std::ostream & os,
333 LyXParagraph * & par, int depth);
336 void sgmlOpenTag(std::ostream & os, int depth,
337 string const & latexname) const;
339 void sgmlCloseTag(std::ostream & os, int depth,
340 string const & latexname) const;
342 void LinuxDocError(LyXParagraph * par, int pos,
343 string const & message);
345 void SimpleLinuxDocOnePar(std::ostream & os, LyXParagraph * par,
346 int desc_on, int depth);
349 void push_tag(std::ostream & os, string const & tag,
350 int & pos, char stack[5][3]);
353 void pop_tag(std::ostream & os, string const & tag,
354 int & pos, char stack[5][3]);
357 mutable bool lyx_clean;
359 /// is autosave needed
360 mutable bool bak_clean;
362 /// is this a unnamed file (New...)
365 /// is regenerating #.tex# necessary
366 DEPCLEAN * dep_clean;
371 /// name of the file the buffer is associated with.
374 /// Format number of buffer
376 /** A list of views using this buffer.
377 Why not keep a list of the BufferViews that use this buffer?
379 At least then we don't have to do a lot of magic like:
380 #buffer->lyx_gui->bufferview->updateLayoutChoice#. Just ask each
381 of the buffers in the list of users to do a #updateLayoutChoice#.
387 class inset_iterator {
389 typedef std::input_iterator_tag iterator_category;
390 typedef Inset value_type;
391 typedef ptrdiff_t difference_type;
392 typedef Inset * pointer;
393 typedef Inset & reference;
397 inset_iterator() : par(0) /*, it(0)*/ {}
399 inset_iterator(LyXParagraph * paragraph) : par(paragraph) {
403 inset_iterator(LyXParagraph * paragraph,
404 LyXParagraph::size_type pos);
406 inset_iterator & operator++() { // prefix ++
409 if (it == par->inset_iterator_end()) {
421 inset_iterator operator++(int) { // postfix ++
422 inset_iterator tmp(par, it.getPos());
425 if (it == par->inset_iterator_end()) {
437 Inset * operator*() { return *it; }
440 LyXParagraph * getPar() { return par; }
442 LyXParagraph::size_type getPos() const { return it.getPos(); }
445 bool operator==(inset_iterator const & iter1,
446 inset_iterator const & iter2);
453 LyXParagraph::inset_iterator it;
457 inset_iterator inset_iterator_begin() {
458 return inset_iterator(paragraph);
461 inset_iterator inset_iterator_end() {
462 return inset_iterator();
468 void Buffer::addUser(BufferView * u)
475 void Buffer::delUser(BufferView *)
482 void Buffer::redraw()
485 users->fitCursor(users->text);
490 Language const * Buffer::GetLanguage() const
492 return params.language;
497 bool Buffer::isLyxClean() const
504 bool Buffer::isBakClean() const
511 void Buffer::markLyxClean() const
517 // if the .lyx file has been saved, we don't need an
524 void Buffer::markBakClean()
531 void Buffer::setUnnamed(bool flag)
538 bool Buffer::isUnnamed()
545 void Buffer::markDirty()
552 DEPCLEAN * tmp = dep_clean;
561 string const & Buffer::fileName() const
568 bool Buffer::isReadonly() const
575 BufferView * Buffer::getUser() const
582 void Buffer::setParentName(string const & name)
584 params.parentname = name;
590 bool operator==(Buffer::TocItem const & a, Buffer::TocItem const & b) {
591 return a.par == b.par && a.str == b.str;
592 // No need to compare depth.
598 bool operator!=(Buffer::TocItem const & a, Buffer::TocItem const & b) {
600 // No need to compare depth.
605 bool operator==(Buffer::inset_iterator const & iter1,
606 Buffer::inset_iterator const & iter2) {
607 return iter1.par == iter2.par
608 && (iter1.par == 0 || iter1.it == iter2.it);
613 bool operator!=(Buffer::inset_iterator const & iter1,
614 Buffer::inset_iterator const & iter2) {
615 return !(iter1 == iter2);