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"
40 class auto_mem_buffer;
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.
60 explicit Buffer(string const & file, bool b = false);
65 /** save the buffer's parameters as user default
66 This function saves a file #user_lyxdir/templates/defaults.lyx#
67 which parameters are those of the current buffer. This file
68 is used as a default template when creating a new
69 file. Returns #true# on success.
71 bool saveParamsAsDefaults();
73 /** High-level interface to buffer functionality.
74 This function parses a command string and executes it
76 bool Dispatch(string const & command);
78 /// Maybe we know the function already by number...
79 bool Dispatch(int ac, string const & argument);
81 /// and have an xtl buffer to work with.
82 bool Dispatch(int, auto_mem_buffer &);
84 /// should be changed to work for a list.
87 void resizeInsets(BufferView *);
89 /// Update window titles of all users
90 void updateTitles() const;
92 /// Reset autosave timers for all users
93 void resetAutosaveTimers() const;
95 /** Adds the BufferView to the users list.
96 Later this func will insert the #BufferView# into a real list,
97 not just setting a pointer.
99 void addUser(BufferView * u) { users = u; }
101 /** Removes the #BufferView# from the users list.
102 Since we only can have one at the moment, we just reset it.
104 void delUser(BufferView *) { users = 0; }
110 //users->updateScrollbar();
114 void loadAutoSaveFile();
117 @param par if != 0 insert the file.
118 @return #false# if method fails.
120 bool readFile(LyXLex &, LyXParagraph * par = 0);
122 /** Reads a file without header.
123 @param par if != 0 insert the file.
124 @return false if file is not completely read.
126 bool readLyXformat2(LyXLex &, LyXParagraph * par = 0);
128 /// This parses a single LyXformat-Token.
129 bool parseSingleLyXformat2Token(LyXLex &, LyXParagraph *& par,
130 LyXParagraph *& return_par,
131 string const & token, int & pos,
132 char & depth, LyXFont &
134 ,LyXParagraph::footnote_flag &,
135 LyXParagraph::footnote_kind &
139 /// Parse a single inset.
140 void readInset(LyXLex &, LyXParagraph *& par, int & pos, LyXFont &);
143 Takes care of auto-save files and backup file if requested.
144 Returns #true# if the save is successful, #false# otherwise.
148 /// Write file. Returns #false# if unsuccesful.
149 bool writeFile(string const &, bool) const;
152 void writeFileAscii(string const & , int);
153 void writeFileAscii(std::ostream &, int);
154 string const asciiParagraph(LyXParagraph const *, int linelen) const;
156 void makeLaTeXFile(string const & filename,
157 string const & original_path,
158 bool nice, bool only_body = false);
159 /** LaTeX all paragraphs from par to endpar.
160 @param endpar if == 0 then to the end
162 void latexParagraphs(std::ostream & os, LyXParagraph * par,
163 LyXParagraph * endpar, TexRow & texrow) const;
175 void makeLinuxDocFile(string const & filename,
176 bool nice, bool only_body = false);
178 void makeDocBookFile(string const & filename,
179 bool nice, bool only_body = false);
181 /// returns the main language for the buffer (document)
182 string const GetLanguage() const {
183 return params.language;
187 bool isLyxClean() const { return lyx_clean; }
190 bool isNwClean() const { return nw_clean; }
193 bool isBakClean() const { return bak_clean; }
196 bool isDepClean(string const & name) const;
199 void markLyxClean() const {
204 // if the .lyx file has been saved, we don't need an
210 void markNwClean() { nw_clean = true; }
213 void markBakClean() { bak_clean = true; }
216 void markDepClean(string const & name);
219 void markNwDirty() { nw_clean = false; }
222 void setUnnamed(bool flag=true) { unnamed = flag; }
225 bool isUnnamed() { return unnamed; }
235 DEPCLEAN * tmp = dep_clean;
243 string const & fileName() const { return filename; }
245 /** A transformed version of the file name, adequate for LaTeX
246 The path is stripped if no_path is true (default)
248 string const getLatexName(bool no_path = true) const;
250 /// Change name of buffer. Updates "read-only" flag.
251 void fileName(string const & newfile);
253 /// Name of the document's parent
254 void setParentName(string const &);
256 /// Is buffer read-only?
257 bool isReadonly() const { return read_only; }
259 /// Set buffer read-only flag
260 void setReadonly(bool flag = true);
262 /// returns #true# if the buffer contains a LaTeX document
263 bool isLatex() const;
264 /// returns #true# if the buffer contains a LinuxDoc document
265 bool isLinuxDoc() const;
266 /// returns #true# if the buffer contains a DocBook document
267 bool isDocBook() const;
268 /** returns #true# if the buffer contains either a LinuxDoc
269 or DocBook document */
271 /// returns #true# if the buffer contains a Wed document
272 bool isLiterate() const;
275 void setPaperStuff();
277 /** Validate a buffer for LaTeX.
278 This validates the buffer, and returns a struct for use by
279 #makeLaTeX# and others. Its main use is to figure out what
280 commands and packages need to be included in the LaTeX file.
281 It (should) also check that the needed constructs are there
282 (i.e. that the \refs points to coresponding \labels). It
283 should perhaps inset "error" insets to help the user correct
286 void validate(LaTeXFeatures &) const;
289 string const getIncludeonlyList(char delim = ',');
291 std::vector<std::pair<string,string> > const getBibkeyList();
313 std::vector<std::vector<TocItem> > const getTocList();
315 std::vector<string> const getLabelList();
317 /** This will clearly have to change later. Later we can have more
318 than one user per buffer. */
319 BufferView * getUser() const { return users; }
322 void ChangeLanguage(Language const * from, Language const * to);
324 bool isMultiLingual();
326 /// Does this mean that this is buffer local?
329 /// Does this mean that this is buffer local?
335 /** is a list of paragraphs.
337 LyXParagraph * paragraph;
342 /// where the temporaries go if we want them
348 /** While writing as LaTeX, tells whether we are
349 doing a 'nice' LaTeX file */
352 /// Used when typesetting to place errorboxes.
357 void linuxDocHandleFootnote(std::ostream & os,
358 LyXParagraph * & par, int const depth);
361 void DocBookHandleCaption(std::ostream & os, string & inner_tag,
362 int const depth, int desc_on,
363 LyXParagraph * & par);
366 void DocBookHandleFootnote(std::ostream & os,
367 LyXParagraph * & par, int const depth);
370 void sgmlOpenTag(std::ostream & os, int depth,
371 string const & latexname) const;
373 void sgmlCloseTag(std::ostream & os, int depth,
374 string const & latexname) const;
376 void LinuxDocError(LyXParagraph * par, int pos,
377 string const & message);
379 void SimpleLinuxDocOnePar(std::ostream & os, LyXParagraph * par,
380 int desc_on, int const depth);
382 void SimpleDocBookOnePar(std::ostream &, string & extra,
383 LyXParagraph * par, int & desc_on,
387 void push_tag(std::ostream & os, string const & tag,
388 int & pos, char stack[5][3]);
391 void pop_tag(std::ostream & os, string const & tag,
392 int & pos, char stack[5][3]);
395 mutable bool lyx_clean;
397 /// is autosave needed
398 mutable bool bak_clean;
400 /// do we need to run weave/tangle
403 /// is this a unnamed file (New...)
406 /// is regenerating #.tex# necessary
407 DEPCLEAN * dep_clean;
412 /// name of the file the buffer is associated with.
415 /// Format number of buffer
418 /** A list of views using this buffer.
419 Why not keep a list of the BufferViews that use this buffer?
421 At least then we don't have to do a lot of magic like:
422 #buffer->lyx_gui->bufferview->updateLayoutChoice#. Just ask each
423 of the buffers in the list of users to do a #updateLayoutChoice#.
429 class inset_iterator {
432 inset_iterator() : par(0) /*, it(0)*/ {}
434 inset_iterator(LyXParagraph * paragraph) : par(paragraph) {
438 inset_iterator(LyXParagraph * paragraph,
439 LyXParagraph::size_type pos);
441 inset_iterator & operator++() {
444 if (it == par->inset_iterator_end()) {
452 Inset * operator*() {return *it; }
454 LyXParagraph * getPar() { return par; }
456 LyXParagraph::size_type getPos() {return it.getPos(); }
459 bool operator==(inset_iterator const & iter1,
460 inset_iterator const & iter2);
463 //bool operator!=(inset_iterator const & iter1,
464 // inset_iterator const & iter2);
471 LyXParagraph::inset_iterator it;
475 inset_iterator inset_iterator_begin() {
476 return inset_iterator(paragraph);
479 inset_iterator inset_iterator_end() {
480 return inset_iterator();
486 void Buffer::setParentName(string const & name)
488 params.parentname = name;
493 bool operator==(Buffer::TocItem const & a, Buffer::TocItem const & b) {
494 return a.par == b.par && a.str == b.str;
495 // No need to compare depth.
501 bool operator!=(Buffer::TocItem const & a, Buffer::TocItem const & b) {
503 // No need to compare depth.
508 bool operator==(Buffer::inset_iterator const & iter1,
509 Buffer::inset_iterator const & iter2) {
510 return iter1.par == iter2.par
511 && (iter1.par == 0 || iter1.it == iter2.it);
516 bool operator!=(Buffer::inset_iterator const & iter1,
517 Buffer::inset_iterator const & iter2) {
518 return !(iter1 == iter2);