2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
6 * Copyright (C) 1995 Matthias Ettrich
8 * This file is Copyleft (C) 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
30 #include "BufferView.h"
32 #include "bufferparams.h"
35 #include "support/filetools.h"
41 extern void updateAllVisibleBufferRelatedPopups();
42 extern void WarnReadonly();
54 /** The buffer object.
55 The is is the buffer object. It contains all the informations about
56 a document loaded into LyX. I am not sure if the class is complete or
57 minimal, probably not.
61 /**@name Constructors and destructor */
64 Buffer(string const & file, LyXRC * lyxrc = 0, bool b = false);
73 /** save the buffer's parameters as user default
74 This function saves a file 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 true on success.
79 bool saveParamsAsDefaults();
81 /// should be changed to work for a list.
92 /// Update window titles of all users
95 /// Reset autosave timers for all users
96 void resetAutosaveTimers();
98 /** Adds the BufferView to the users list.
99 Later this func will insert the BufferView into a real list,
100 not just setting a pointer.
102 void addUser(BufferView * u) { users = u; }
104 /** Removes the BufferView from the users list.
105 Since we only can have one at the moment, we just reset it.
107 void delUser(BufferView *){ users = 0; }
110 void update(signed char f);
116 users->updateScrollbar();
119 /// Open and lock an updatable inset
120 void open_new_inset(UpdatableInset *);
123 void loadAutoSaveFile();
126 Returns false if it fails.
127 If par is given, the file is inserted. */
128 bool readFile(LyXLex &, LyXParagraph * par = 0);
130 /** Reads a file without header.
131 Returns false, if file is not completely read.
132 If par is given, the file is inserted. */
133 bool readLyXformat2(LyXLex &, LyXParagraph * par = 0);
135 /// Inserts a lyx file at cursor position. Returns false if it fails.
136 bool insertLyXFile(string const & filename);
138 /// Write file. Returns false if unsuccesful.
139 bool writeFile(string const &, bool);
142 void writeFileAscii(string const & , int);
145 void makeLaTeXFile(string const & filename,
146 string const & original_path,
147 bool nice, bool only_body = false);
162 void makeLinuxDocFile(string const & filename, int column);
164 void makeDocBookFile(string const & filename, int column);
166 /// returns the main language for the buffer (document)
167 string GetLanguage() const {
168 return params.language;
172 bool isLyxClean() const { return lyx_clean; }
174 /// changed Heinrich Bauer, 23/03/98
178 bool isNwClean() const { return nw_clean; }
181 bool isBakClean() const { return bak_clean; }
184 bool isDepClean(string const & name) const;
187 void markLyxClean() {
192 // if the .lyx file has been saved, we don't need an
197 /// changed Heinrich Bauer, 23/03/98
201 void markNwClean() { nw_clean = true; }
204 void markBakClean() { bak_clean = true; }
207 void markDepClean(string const & name);
213 void markNwDirty() { nw_clean = false; }
221 dvi_clean_tmpd = false;
222 dvi_clean_orgd = false;
225 DEPCLEAN* tmp = dep_clean;
233 string getFileName() const { return filename; }
235 /// A transformed version of the file name, adequate for LaTeX
236 string getLatexName() const {
237 return ChangeExtension(MakeLatexName(filename), ".tex", true);
240 /// Change name of buffer. Updates "read-only" flag.
241 void setFileName(string const & newfile);
243 /// Name of the document's parent
244 void setParentName(string const &);
246 /// Is buffer read-only?
247 bool isReadonly() { return read_only; }
249 /// Set buffer read-only flag
250 void setReadonly(bool flag = true)
252 if (read_only != flag) {
255 updateAllVisibleBufferRelatedPopups();
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 or DocBook document
270 /// returns true if the buffer contains a Wed document
271 bool isLiterate() const;
274 void setPaperStuff();
278 void setOldPaperStuff();
281 /** Validate a buffer for LaTeX.
282 This validates the buffer, and returns a struct for use by
283 makeLaTeX and others. Its main use is to figure out what commands
284 and packages need to be included in the LaTeX file. It (should)
285 also check that the needed constructs are there (i.e. that the \refs
286 points to coresponding \labels). It should perhaps inset "error"
287 insets to help the user correct obvious mistakes.
289 void validate(LaTeXFeatures &); //the correct parameters to be
292 /** Insert an inset into the buffer
293 Insert inset into buffer, placing it in a layout of lout,
294 if no_table make sure that it doesn't end up in a table. */
295 void insertInset(Inset *, string const & lout = string(),
296 bool no_table = false);
299 void setCursorFromRow (int);
302 string getIncludeonlyList(char delim = ',');
304 string getReferenceList(char delim = '|');
306 string getBibkeyList(char delim = '|');
308 bool gotoLabel(string const &);
310 /// removes all autodeletable insets
311 bool removeAutoInsets();
313 /** This will clearly have to change later. Later we can have more
314 than one user per buffer. */
315 BufferView * getUser() const { return users; }
319 /// Does this mean that this is buffer local?
322 /// Does this mean that this is buffer local?
328 /** is a list of paragraphs.
330 LyXParagraph * paragraph;
332 /** This holds the mapping between buffer paragraphs and screen rows.
333 Should be moved to BufferView. (Asger)
338 UpdatableInset * the_locking_inset;
343 /// where the temporaries go if we want them
349 /** While writing as LaTeX, tells whether we are
350 doing a 'nice' LaTeX file */
357 inline void InsetSleep();
360 inline void InsetWakeup();
371 void insertErrors(TeXErrors &);
374 void linuxDocHandleFootnote(FILE * file,
375 LyXParagraph * & par, int const depth);
377 void DocBookHandleCaption(FILE * file, string & inner_tag,
378 int const depth, int desc_on,
379 LyXParagraph * &par);
381 void DocBookHandleFootnote(FILE * file,
382 LyXParagraph * & par, int const depth);
384 void sgmlOpenTag(FILE * file, int depth,
385 string const & latexname) const;
387 void sgmlCloseTag(FILE * file, int depth,
388 string const & latexname) const;
390 void LinuxDocError(LyXParagraph * par, int pos, char const * message);
392 void SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
393 int desc_on, int const depth);
395 void SimpleDocBookOnePar(string & file, string & extra,
396 LyXParagraph * par, int & desc_on,
400 void push_tag(FILE * file, char const * tag,
401 int & pos, char stack[5][3]);
404 void pop_tag(FILE * file, char const * tag,
405 int & pos, char stack[5][3]);
408 void RoffAsciiTable(FILE * file, LyXParagraph * par);
413 /// is autosave needed
416 /** do we need to run LaTeX, changed 23/03/98, Heinrich Bauer
417 We have to distinguish between TeX-runs executed in the original
418 directory (in which the original LyX-file resides) and TeX-runs
419 executed in a temporary directory. The first situation is valid
420 for a dvi-export, the latter one for printing or previewing. */
424 /// do we need to run weave/tangle
427 /// is regenerating .tex necessary
428 DEPCLEAN * dep_clean;
433 /// name of the file the buffer is associated with.
436 /// Format number of buffer
439 /** A list of views using this buffer.
440 Why not keep a list of the BufferViews that use this buffer?
442 At least then we don't have to do a lot of magic like:
443 buffer->lyx_gui->bufferview->updateLayoutChoice. Just ask each
444 of the buffers in the list of users to do a updateLayoutChoice.
449 friend class BufferList;
451 friend class BufferView;
453 /// Used when typesetting to place errorboxes.
459 void Buffer::InsetSleep()
461 if (the_locking_inset && !inset_slept) {
462 the_locking_inset->GetCursorPos(slx, sly);
463 the_locking_inset->InsetUnlock();
470 void Buffer::InsetWakeup()
472 if (the_locking_inset && inset_slept) {
473 the_locking_inset->Edit(slx, sly);
480 void Buffer::setParentName(string const & name)
482 params.parentname = name;