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 typedef std::vector<TocItem> SingleList;
278 typedef std::map<string, SingleList> Lists;
280 Lists const getLists() const;
282 std::vector<string> const getLabelList();
284 /** This will clearly have to change later. Later we can have more
285 than one user per buffer. */
286 BufferView * getUser() const;
289 void ChangeLanguage(Language const * from, Language const * to);
291 bool isMultiLingual();
293 /// Does this mean that this is buffer local?
296 /// Does this mean that this is buffer local?
302 /** The list of paragraphs.
303 This is a linked list of paragraph, this list holds the
304 whole contents of the document.
306 LyXParagraph * paragraph;
308 /// LyX version control object.
311 /// Where to put temporary files.
314 /// The path to the document file.
317 /** If we are writing a nice LaTeX file or not.
318 While writing as LaTeX, tells whether we are
319 doing a 'nice' LaTeX file */
322 /// Used when typesetting to place errorboxes.
327 void linuxDocHandleFootnote(std::ostream & os,
328 LyXParagraph * & par, int depth);
331 void DocBookHandleCaption(std::ostream & os, string & inner_tag,
332 int depth, int desc_on,
333 LyXParagraph * & par);
336 void DocBookHandleFootnote(std::ostream & os,
337 LyXParagraph * & par, int depth);
340 void sgmlOpenTag(std::ostream & os, int depth,
341 string const & latexname) const;
343 void sgmlCloseTag(std::ostream & os, int depth,
344 string const & latexname) const;
346 void LinuxDocError(LyXParagraph * par, int pos,
347 string const & message);
349 void SimpleLinuxDocOnePar(std::ostream & os, LyXParagraph * par,
350 int desc_on, int depth);
353 void push_tag(std::ostream & os, string const & tag,
354 int & pos, char stack[5][3]);
357 void pop_tag(std::ostream & os, string const & tag,
358 int & pos, char stack[5][3]);
361 mutable bool lyx_clean;
363 /// is autosave needed
364 mutable bool bak_clean;
366 /// is this a unnamed file (New...)
369 /// is regenerating #.tex# necessary
370 DEPCLEAN * dep_clean;
375 /// name of the file the buffer is associated with.
378 /// Format number of buffer
380 /** A list of views using this buffer.
381 Why not keep a list of the BufferViews that use this buffer?
383 At least then we don't have to do a lot of magic like:
384 #buffer->lyx_gui->bufferview->updateLayoutChoice#. Just ask each
385 of the buffers in the list of users to do a #updateLayoutChoice#.
391 class inset_iterator {
393 typedef std::input_iterator_tag iterator_category;
394 typedef Inset value_type;
395 typedef ptrdiff_t difference_type;
396 typedef Inset * pointer;
397 typedef Inset & reference;
401 inset_iterator() : par(0) /*, it(0)*/ {}
403 inset_iterator(LyXParagraph * paragraph) : par(paragraph) {
407 inset_iterator(LyXParagraph * paragraph,
408 LyXParagraph::size_type pos);
410 inset_iterator & operator++() { // prefix ++
413 if (it == par->inset_iterator_end()) {
425 inset_iterator operator++(int) { // postfix ++
426 inset_iterator tmp(par, it.getPos());
429 if (it == par->inset_iterator_end()) {
441 Inset * operator*() { return *it; }
444 LyXParagraph * getPar() { return par; }
446 LyXParagraph::size_type getPos() const { return it.getPos(); }
449 bool operator==(inset_iterator const & iter1,
450 inset_iterator const & iter2);
457 LyXParagraph::inset_iterator it;
461 inset_iterator inset_iterator_begin() {
462 return inset_iterator(paragraph);
465 inset_iterator inset_iterator_end() {
466 return inset_iterator();
472 void Buffer::addUser(BufferView * u)
479 void Buffer::delUser(BufferView *)
486 void Buffer::redraw()
489 users->fitCursor(users->text);
494 Language const * Buffer::GetLanguage() const
496 return params.language;
501 bool Buffer::isLyxClean() const
508 bool Buffer::isBakClean() const
515 void Buffer::markLyxClean() const
521 // if the .lyx file has been saved, we don't need an
528 void Buffer::markBakClean()
535 void Buffer::setUnnamed(bool flag)
542 bool Buffer::isUnnamed()
549 void Buffer::markDirty()
556 DEPCLEAN * tmp = dep_clean;
565 string const & Buffer::fileName() const
572 bool Buffer::isReadonly() const
579 BufferView * Buffer::getUser() const
586 void Buffer::setParentName(string const & name)
588 params.parentname = name;
594 bool operator==(Buffer::TocItem const & a, Buffer::TocItem const & b) {
595 return a.par == b.par && a.str == b.str;
596 // No need to compare depth.
602 bool operator!=(Buffer::TocItem const & a, Buffer::TocItem const & b) {
604 // No need to compare depth.
609 bool operator==(Buffer::inset_iterator const & iter1,
610 Buffer::inset_iterator const & iter2) {
611 return iter1.par == iter2.par
612 && (iter1.par == 0 || iter1.it == iter2.it);
617 bool operator!=(Buffer::inset_iterator const & iter1,
618 Buffer::inset_iterator const & iter2) {
619 return !(iter1 == iter2);