1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich,
7 * Copyright 1995-2000 The LyX Team.
9 * ====================================================== */
18 #include FORMS_H_LOCATION
20 #include "layout_forms.h"
21 #include "bullet_forms.h"
25 #include "insets/insetref.h"
26 #include "insets/insetlabel.h"
27 #include "insets/figinset.h"
29 #include "minibuffer.h"
31 #include "bufferlist.h"
33 #include "lyx_gui_misc.h"
35 #include "BufferView.h"
36 #include "lastfiles.h"
37 #include "bufferview_funcs.h"
38 #include "support/FileInfo.h"
39 #include "support/syscall.h"
40 #include "support/filetools.h"
41 #include "support/path.h"
42 #include "lyxserver.h"
43 #include "FontLoader.h"
46 #include "CutAndPaste.h"
47 #include "TextCache.h"
51 using std::back_inserter;
55 using std::istream_iterator;
61 extern Combox * combo_language;
62 extern Combox * combo_language2;
63 extern BufferList bufferlist;
64 extern void show_symbols_form();
65 extern FD_form_title * fd_form_title;
66 extern FD_form_paragraph * fd_form_paragraph;
67 extern FD_form_character * fd_form_character;
68 extern FD_form_document * fd_form_document;
69 extern FD_form_quotes * fd_form_quotes;
70 extern FD_form_preamble * fd_form_preamble;
71 extern FD_form_table * fd_form_table;
72 extern FD_form_figure * fd_form_figure;
73 extern FD_form_screen * fd_form_screen;
74 extern FD_form_toc * fd_form_toc;
75 extern FD_form_ref * fd_form_ref;
76 extern FD_form_bullet * fd_form_bullet;
78 extern BufferView * current_view; // called too many times in this file...
80 extern void DeleteSimpleCutBuffer(); /* for the cleanup when exiting */
82 extern bool send_fax(string const & fname, string const & sendcmd);
83 extern void MenuSendto();
85 extern LyXServer * lyxserver;
87 // this should be static, but I need it in buffer.C
88 bool quitting; // flag, that we are quitting the program
89 extern bool finished; // all cleanup done just let it run through now.
91 char ascii_type; /* for selection notify callbacks */
93 bool scrolling = false;
95 // This is used to make the dreaded font toggle problem hopefully go
96 // away. Definitely not the best solution, but I think it sorta works.
97 bool toggleall = true;
100 This is the inset locking stuff needed for mathed --------------------
102 an inset can simple call LockInset in it's edit call and *ONLY* in it's
104 Inset::Edit() can only be called by the main lyx module.
106 Then the inset may modify the menu's and/or iconbars.
108 Unlocking is either done by LyX or the inset itself with a UnlockInset-call
110 During the lock, all button and keyboard events will be modified
111 and send to the inset through the following inset-features. Note that
112 Inset::InsetUnlock will be called from inside UnlockInset. It is meant
113 to contain the code for restoring the menus and things like this.
116 virtual void InsetButtonPress(int x, int y, int button);
117 virtual void InsetButtonRelease(int x, int y, int button);
118 virtual void InsetKeyPress(XKeyEvent *ev);
119 virtual void InsetMotionNotify(int x, int y, int state);
120 virtual void InsetUnlock();
122 If a inset wishes any redraw and/or update it just has to call
124 It's is completly irrelevant, where the inset is. UpdateInset will
125 find it in any paragraph in any buffer.
126 Of course the_locking_inset and the insets in the current paragraph/buffer
127 are checked first, so no performance problem should occur.
129 Hope that's ok for the beginning, Alejandro,
130 sorry that I needed so much time,
135 //void UpdateInset(BufferView * bv, Inset * inset, bool mark_dirty = true);
137 /* these functions return 1 if an error occured,
139 // Now they work only for updatable insets. [Alejandro 080596]
140 //int LockInset(UpdatableInset * inset);
141 void ToggleLockedInsetCursor(long x, long y, int asc, int desc);
142 //void FitLockedInsetCursor(long x, long y, int asc, int desc);
143 //int UnlockInset(UpdatableInset * inset);
144 //void LockedInsetStoreUndo(Undo::undo_kind kind);
146 /* this is for asyncron updating. UpdateInsetUpdateList will be called
147 automatically from LyX. Just insert the Inset into the Updatelist */
148 //void UpdateInsetUpdateList();
149 //void PutInsetIntoInsetUpdateList(Inset * inset);
151 //InsetUpdateStruct * InsetUpdateList = 0;
155 -----------------------------------------------------------------------
158 /* some function prototypes */
160 int RunLinuxDoc(BufferView *, int, string const &);
161 int RunDocBook(int, string const &);
162 void MenuWrite(Buffer * buf);
163 void MenuWriteAs(Buffer * buffer);
164 void MenuReload(Buffer * buf);
165 void MenuLayoutSave();
168 void ShowMessage(Buffer * buf,
170 string const & msg2 = string(),
171 string const & msg3 = string(), int delay = 6)
174 buf->getUser()->owner()->getMiniBuffer()->Set(msg1, msg2,
177 // can somebody think of something more clever? cerr?
178 cout << msg1 << msg2 << msg3 << endl;
191 // should be moved to lyxfunc.C
192 void MenuWrite(Buffer * buffer)
195 if (!buffer->save()) {
196 string fname = buffer->fileName();
197 string s = MakeAbsPath(fname);
198 if (AskQuestion(_("Save failed. Rename and try again?"),
199 MakeDisplayPath(s, 50),
200 _("(If not, document is not saved.)"))) {
204 lastfiles->newFile(buffer->fileName());
209 // should be moved to BufferView.C
210 // Half of this func should be in LyXView, the rest in BufferView.
211 void MenuWriteAs(Buffer * buffer)
213 // Why do we require BufferView::text to be able to write a
214 // document? I see no point in that. (Lgb)
215 //if (!bv->text) return;
217 string fname = buffer->fileName();
218 string oldname = fname;
221 ProhibitInput(current_view);
222 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
223 fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
225 if (!IsLyXFilename(fname))
228 fname = fileDlg.Select(_("Enter Filename to Save Document as"),
231 OnlyFilename(fname));
232 AllowInput(current_view);
237 // Make sure the absolute filename ends with appropriate suffix
238 string s = MakeAbsPath(fname);
239 if (!IsLyXFilename(s))
242 // Same name as we have already?
244 if (!AskQuestion(_("Same name as document already has:"),
245 MakeDisplayPath(s, 50),
248 // Falls through to name change and save
250 // No, but do we have another file with this name open?
251 else if (bufferlist.exists(s)) {
252 if (AskQuestion(_("Another document with same name open!"),
253 MakeDisplayPath(s, 50),
254 _("Replace with current document?")))
256 bufferlist.close(bufferlist.getBuffer(s));
258 // Ok, change the name of the buffer, but don't save!
262 ShowMessage(buffer, _("Document renamed to '"),
263 MakeDisplayPath(s), _("', but not saved..."));
266 } // Check whether the file exists
269 if (myfile.isOK() && !AskQuestion(_("Document already exists:"),
270 MakeDisplayPath(s, 50),
275 // Ok, change the name of the buffer
279 // Small bug: If the save fails, we have irreversible changed the name
285 int MenuRunLaTeX(Buffer * buffer)
289 if (buffer->isLinuxDoc())
290 ret = RunLinuxDoc(buffer->getUser(), 1, buffer->fileName());
291 else if (buffer->isLiterate())
292 ret = buffer->runLiterate();
293 else if (buffer->isDocBook())
294 ret = RunDocBook(1, buffer->fileName());
296 ret = buffer->runLaTeX();
302 s = _("One error detected");
303 t = _("You should try to fix it.");
306 s += _(" errors detected.");
307 t = _("You should try to fix them.");
309 WriteAlert(_("There were errors during the LaTeX run."), s, t);
315 int MenuBuildProg(Buffer * buffer)
319 if (buffer->isLiterate())
320 ret = buffer->buildProgram();
322 string s = _("Wrong type of document");
323 string t = _("The Build operation is not allowed in this document");
324 WriteAlert(_("There were errors during the Build process."), s, t);
332 s = _("One error detected");
333 t = _("You should try to fix it.");
336 s += _(" errors detected.");
337 t = _("You should try to fix them.");
339 WriteAlert(_("There were errors during the Build process."), s, t);
345 int MenuRunChktex(Buffer * buffer)
349 if (buffer->isSGML()) {
350 WriteAlert(_("Chktex does not work with SGML derived documents."));
353 ret = buffer->runChktex();
359 s = _("No warnings found.");
360 } else if (ret == 1) {
361 s = _("One warning found.");
362 t = _("Use 'Edit->Go to Error' to find it.");
365 s += _(" warnings found.");
366 t = _("Use 'Edit->Go to Error' to find them.");
368 WriteAlert(_("Chktex run successfully"), s, t);
370 WriteAlert(_("Error!"), _("It seems chktex does not work."));
376 int MakeLaTeXOutput(Buffer * buffer)
382 string path = OnlyPath(buffer->fileName());
383 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
384 path = buffer->tmppath;
388 ret = MenuRunLaTeX(buffer);
394 /* wait == false means don't wait for termination */
395 /* wait == true means wait for termination */
396 // The bool should be placed last on the argument line. (Lgb)
397 // Returns false if we fail.
398 bool RunScript(Buffer * buffer, bool wait,
399 string const & command,
400 string const & orgname = string(),
401 bool need_shell = true)
405 string name = orgname;
408 if (MakeLaTeXOutput(buffer) > 0)
410 /* get DVI-Filename */
412 name = ChangeExtension(buffer->getLatexName(), ".dvi");
414 path = OnlyPath(name);
415 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
416 path = buffer->tmppath;
419 // At this point we check whether the command contains the
420 // filename parameter $$FName and if that's the case we
421 // substitute the real file name otherwise the filename is
422 // simply appended. rokrau 1/12/00
425 if ( (i=command.find("$$FName")) != string::npos)
427 cmd.replace(i,7,QuoteName(name));
430 cmd = command + ' ' + QuoteName(name);
439 // OS/2 cmd.exe has another use for '&'
441 // This is not NLS safe, but it's OK, I think.
442 string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
444 // COMSPEC is set, unless user unsets
445 sh = OnlyFilename(GetEnvPath("COMSPEC"));
450 if (contains(sh, "cmd.exe")
451 || contains(sh, "4os2.exe"))
452 cmd = "start /min/n " + cmd;
457 // It seems that, if wait is false, we never get back
458 // the return code of the command. This means that all
459 // the code I added in PrintApplyCB is currently
461 // CHECK What should we do here?
462 ShowMessage(buffer, _("Executing command:"), cmd);
463 result = one.startscript(Systemcalls::System, cmd);
465 ShowMessage(buffer, _("Executing command:"), cmd);
466 result = one.startscript(wait ? Systemcalls::Wait
467 : Systemcalls::DontWait, cmd);
473 // Returns false if we fail
474 bool CreatePostscript(Buffer * buffer, bool wait = false)
480 ProhibitInput(current_view);
483 if (MakeLaTeXOutput(buffer) > 0) {
484 AllowInput(current_view);
487 // Generate postscript file
488 string psname = OnlyFilename(ChangeExtension (buffer->fileName(),
494 char real_papersize = buffer->params.papersize;
495 if (real_papersize == BufferParams::PAPER_DEFAULT)
496 real_papersize = lyxrc.default_papersize;
498 switch (real_papersize) {
499 case BufferParams::PAPER_USLETTER:
502 case BufferParams::PAPER_A3PAPER:
505 case BufferParams::PAPER_A4PAPER:
508 case BufferParams::PAPER_A5PAPER:
511 case BufferParams::PAPER_B5PAPER:
514 case BufferParams::PAPER_EXECUTIVEPAPER:
517 case BufferParams::PAPER_LEGALPAPER:
520 default: /* If nothing else fits, keep an empty value... */
524 // Make postscript file.
525 string command = lyxrc.dvi_to_ps_command + ' ' + lyxrc.print_to_file + ' ';
526 command += QuoteName(psname);
527 if (buffer->params.use_geometry
528 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
529 && !lyxrc.print_paper_dimension_flag.empty()
530 && !buffer->params.paperwidth.empty()
531 && !buffer->params.paperheight.empty()) {
532 // using a custom papersize
534 command += lyxrc.print_paper_dimension_flag + ' ';
535 command += buffer->params.paperwidth + ',';
536 command += buffer->params.paperheight;
537 } else if (!paper.empty()
538 && (real_papersize != BufferParams::PAPER_USLETTER ||
539 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
540 // dvips won't accept -t letter -t landscape. In all other
541 // cases, include the paper size explicitly.
543 command += lyxrc.print_paper_flag + ' ' + paper;
545 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE) {
547 command += lyxrc.print_landscape_flag;
549 // push directorypath, if necessary
550 string path = OnlyPath(buffer->fileName());
551 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
552 path = buffer->tmppath;
555 bool ret = RunScript(buffer, wait, command);
556 AllowInput(current_view);
561 // Returns false if we fail
562 //bool MenuPreviewPS(Buffer * buffer)
563 bool PreviewPostscript(Buffer * buffer)
569 // Generate postscript file
570 if (!CreatePostscript(buffer, true)) {
574 // Start postscript viewer
575 ProhibitInput(current_view);
576 string ps = OnlyFilename(ChangeExtension (buffer->fileName(),
578 // push directorypath, if necessary
579 string path = OnlyPath(buffer->fileName());
580 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
581 path = buffer->tmppath;
584 bool ret = RunScript(buffer, false, lyxrc.view_ps_command, ps);
585 AllowInput(current_view);
590 void MenuFax(Buffer * buffer)
596 // Generate postscript file
597 if (!CreatePostscript(buffer, true)) {
602 string ps = OnlyFilename(ChangeExtension (buffer->fileName(),
604 string path = OnlyPath (buffer->fileName());
605 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
606 path = buffer->tmppath;
609 if (!lyxrc.fax_program.empty()) {
610 string help2 = subst(lyxrc.fax_program, "$$FName", ps);
612 Systemcalls one(Systemcalls::System, help2);
614 send_fax(ps, lyxrc.fax_command);
618 // Returns false if we fail
619 bool PreviewDVI(Buffer * buffer)
625 string paper = lyxrc.view_dvi_paper_option;
626 if (!paper.empty()) {
628 char real_papersize = buffer->params.papersize;
629 if (real_papersize == BufferParams::PAPER_DEFAULT)
630 real_papersize = lyxrc.default_papersize;
632 switch (real_papersize) {
633 case BufferParams::PAPER_USLETTER:
636 case BufferParams::PAPER_A3PAPER:
639 case BufferParams::PAPER_A4PAPER:
642 case BufferParams::PAPER_A5PAPER:
645 case BufferParams::PAPER_B5PAPER:
648 case BufferParams::PAPER_EXECUTIVEPAPER:
649 paper += " foolscap";
651 case BufferParams::PAPER_LEGALPAPER:
654 default: /* If nothing else fits, keep the empty value */
657 if (real_papersize==' ') {
658 // if (paper.empty()) {
659 if (buffer->params.orientation
660 == BufferParams::ORIENTATION_LANDSCAPE)
661 // we HAVE to give a size when the page is in
662 // landscape, so use USletter.
663 paper = " -paper usr";
665 // paper = " -paper " + paper;
666 if (buffer->params.orientation
667 == BufferParams::ORIENTATION_LANDSCAPE)
671 // push directorypath, if necessary
672 string path = OnlyPath(buffer->fileName());
673 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
674 path = buffer->tmppath;
678 string command = lyxrc.view_dvi_command + " " + paper;
679 bool ret = RunScript(buffer, false, command);
684 bool AskOverwrite(Buffer * buffer, string const & s)
687 // be friendly if there is a gui
690 !AskQuestion(_("File already exists:"),
691 MakeDisplayPath(s, 50),
692 _("Do you want to overwrite the file?"))) {
693 ShowMessage(buffer, _("Canceled"));
701 void MenuMakeLaTeX(Buffer * buffer)
703 // Why care about this?
707 // Get LaTeX-Filename
708 string s = buffer->getLatexName(false);
710 if (!AskOverwrite(buffer, s))
713 if (buffer->isDocBook())
714 ShowMessage(buffer, _("DocBook does not have a latex backend"));
716 if (buffer->isLinuxDoc())
717 RunLinuxDoc(buffer->getUser(), 0, buffer->fileName());
719 buffer->makeLaTeXFile(s, string(), true);
720 ShowMessage(buffer, _("Nice LaTeX file saved as"),
726 void MenuMakeLinuxDoc(Buffer * buffer)
729 //if (!bv->text) return;
731 if (!buffer->isLinuxDoc()) {
732 WriteAlert(_("Error!"), _("Document class must be linuxdoc."));
736 // Get LinuxDoc-Filename
737 string s = ChangeExtension(buffer->fileName(), ".sgml");
739 if (!AskOverwrite(buffer, s))
742 ShowMessage(buffer, _("Building LinuxDoc SGML file `"),
743 MakeDisplayPath(s),"'...");
745 buffer->makeLinuxDocFile(s, true);
747 ShowMessage(buffer, _("LinuxDoc SGML file save as"),
752 void MenuMakeDocBook(Buffer * buffer)
755 //if (!bv->text) return;
757 if (!buffer->isDocBook()) {
758 WriteAlert(_("Error!"),
759 _("Document class must be docbook."));
763 // Get DocBook-Filename
764 string s = ChangeExtension(buffer->fileName(), ".sgml");
766 if (!AskOverwrite(buffer, s))
769 ShowMessage(buffer, _("Building DocBook SGML file `"),
770 MakeDisplayPath(s), "'...");
772 buffer->makeDocBookFile(s, true);
774 ShowMessage(buffer, _("DocBook SGML file save as"),
779 void MenuMakeAscii(Buffer * buffer)
782 //if (!bv->text) return;
784 /* get LaTeX-Filename */
785 string s = ChangeExtension (buffer->fileName(), ".txt");
788 if (!AskOverwrite(buffer, s))
791 buffer->writeFileAscii(s, lyxrc.ascii_linelen);
793 ShowMessage(buffer, _("Ascii file saved as"), MakeDisplayPath(s));
797 void MenuMakeHTML(Buffer * buffer)
799 // First, create LaTeX file
800 MenuMakeLaTeX(buffer);
802 // And now, run the converter
803 string file = buffer->fileName();
804 Path path(OnlyPath(file));
805 // the tex file name has to be correct for
806 // latex, but the html file name can be
808 string result = ChangeExtension(file, ".html");
809 string infile = buffer->getLatexName(false);
810 string tmp = lyxrc.html_command;
811 tmp = subst(tmp, "$$FName", infile);
812 tmp = subst(tmp, "$$OutName", result);
814 int res = one.startscript(Systemcalls::System, tmp);
816 ShowMessage(buffer, _("Document exported as HTML to file `")
817 + MakeDisplayPath(result) +'\'');
819 ShowMessage(buffer, _("Unable to convert to HTML the file `")
820 + MakeDisplayPath(infile)
827 void MenuMakeHTML_LinuxDoc(Buffer * buffer)
829 // First, create LinuxDoc file
830 MenuMakeLinuxDoc(buffer);
832 // And now, run the converter
833 string file = buffer->fileName();
835 string result = ChangeExtension(file, ".html");
836 string infile = ChangeExtension(file, ".sgml");
837 string tmp = lyxrc.linuxdoc_to_html_command;
838 tmp = subst(tmp, "$$FName", infile);
839 tmp = subst(tmp, "$$OutName", result);
841 int res = one.startscript(Systemcalls::System, tmp);
843 ShowMessage(buffer,_("Document exported as HTML to file `")
844 + MakeDisplayPath(result) +'\'');
846 ShowMessage(buffer,_("Unable to convert to HTML the file `")
847 + MakeDisplayPath(infile)
853 void MenuMakeHTML_DocBook(Buffer * buffer)
855 // First, create LaTeX file
856 MenuMakeDocBook(buffer);
858 // And now, run the converter
859 string file = buffer->fileName();
860 string result = ChangeExtension(file, ".html");
861 string infile = ChangeExtension(file, ".sgml");
862 string tmp = lyxrc.docbook_to_html_command;
863 tmp = subst(tmp, "$$FName", infile);
864 tmp = subst(tmp, "$$OutName", result);
866 int res = one.startscript(Systemcalls::System, tmp);
868 ShowMessage(buffer,_("Document exported as HTML to file `")
869 + MakeDisplayPath(result) +'\'');
871 ShowMessage(buffer,_("Unable to convert to HTML the file `")
872 + MakeDisplayPath(infile)
879 void MenuExport(Buffer * buffer, string const & extyp)
882 if (extyp == "latex") {
883 // make sure that this buffer is not linuxdoc
884 MenuMakeLaTeX(buffer);
887 else if (extyp == "linuxdoc") {
888 // make sure that this buffer is not latex
889 MenuMakeLinuxDoc(buffer);
892 else if (extyp == "docbook") {
893 // make sure that this buffer is not latex or linuxdoc
894 MenuMakeDocBook(buffer);
897 else if (extyp == "dvi") {
898 // Run LaTeX as "Update dvi..." Bernhard.
899 // We want the dvi in the current directory. This
900 // is achieved by temporarily disabling use of
901 // temp directory. As a side-effect, we get
902 // *.log and *.aux files also. (Asger)
903 bool flag = lyxrc.use_tempdir;
904 lyxrc.use_tempdir = false;
905 MenuRunLaTeX(buffer);
906 lyxrc.use_tempdir = flag;
909 else if (extyp == "postscript") {
910 // Start Print-dialog. Not as good as dvi... Bernhard.
911 //should start lyxview->getDialogs()->showPrint();
912 // to get same as before
913 // MenuPrint(buffer);
914 // Since the MenuPrint is a pop-up, we can't use
915 // the same trick as above. (Asger)
916 // MISSING: Move of ps-file :-(
917 // And MenuPrint should not be used for this at all...
920 else if (extyp == "ascii") {
921 MenuMakeAscii(buffer);
923 else if (extyp == "custom") {
927 else if (extyp == "html") {
928 MenuMakeHTML(buffer);
930 // HTML from linuxdoc
931 else if (extyp == "html-linuxdoc") {
932 MenuMakeHTML_LinuxDoc(buffer);
935 else if (extyp == "html-docbook") {
936 MenuMakeHTML_DocBook(buffer);
939 ShowMessage(buffer, _("Unknown export type: ") + extyp);
946 lyxerr.debug() << "Running QuitLyX." << endl;
948 if (!bufferlist.QwriteAll())
951 lastfiles->writeFile(lyxrc.lastfiles);
953 // Set a flag that we do quitting from the program,
954 // so no refreshes are necessary.
957 // close buffers first
958 bufferlist.closeAll();
960 // do any other cleanup procedures now
961 lyxerr.debug() << "Deleting tmp dir " << system_tempdir << endl;
963 DestroyLyXTmpDir(system_tempdir);
970 void AutoSave(BufferView * bv)
971 // should probably be moved into BufferList (Lgb)
972 // Perfect target for a thread...
974 if (!bv->available())
977 if (bv->buffer()->isBakClean()
978 || bv->buffer()->isReadonly()) {
979 // We don't save now, but we'll try again later
980 bv->owner()->resetAutosaveTimer();
984 bv->owner()->getMiniBuffer()->Set(_("Autosaving current document..."));
986 // create autosave filename
987 string fname = OnlyPath(bv->buffer()->fileName());
989 fname += OnlyFilename(bv->buffer()->fileName());
992 // tmp_ret will be located (usually) in /tmp
993 // will that be a problem?
994 string tmp_ret = tmpnam(0);
996 pid_t pid = fork(); // If you want to debug the autosave
997 // you should set pid to -1, and comment out the
999 if (pid == 0 || pid == -1) {
1000 // pid = -1 signifies that lyx was unable
1001 // to fork. But we will do the save
1003 bool failed = false;
1004 if (!tmp_ret.empty()) {
1005 bv->buffer()->writeFile(tmp_ret, 1);
1006 // assume successful write of tmp_ret
1007 if (rename(tmp_ret.c_str(), fname.c_str()) == -1) {
1009 // most likely couldn't move between filesystems
1010 // unless write of tmp_ret failed
1011 // so remove tmp file (if it exists)
1012 remove(tmp_ret.c_str());
1019 // failed to write/rename tmp_ret so try writing direct
1020 if (!bv->buffer()->writeFile(fname, 1)) {
1021 // It is dangerous to do this in the child,
1022 // but safe in the parent, so...
1024 bv->owner()->getMiniBuffer()->Set(_("Autosave Failed!"));
1027 if (pid == 0) { // we are the child so...
1032 bv->buffer()->markBakClean();
1033 bv->owner()->resetAutosaveTimer();
1038 // Copyright CHT Software Service GmbH
1041 // create new file with template
1044 Buffer * NewLyxFile(string const & filename)
1046 // Split argument by :
1048 string tmpname = split(filename, name, ':');
1049 #ifdef __EMX__ // Fix me! lyx_cb.C may not be low level enough to allow this.
1050 if (name.length() == 1
1051 && isalpha(static_cast<unsigned char>(name[0]))
1052 && (prefixIs(tmpname, "/") || prefixIs(tmpname, "\\"))) {
1054 name += token(tmpname, ':', 0);
1055 tmpname = split(tmpname, ':');
1058 lyxerr.debug() << "Arg is " << filename
1059 << "\nName is " << name
1060 << "\nTemplate is " << tmpname << endl;
1062 // find a free buffer
1063 Buffer * tmpbuf = bufferlist.newFile(name, tmpname);
1065 lastfiles->newFile(tmpbuf->fileName());
1070 // Insert ascii file (if filename is empty, prompt for one)
1071 void InsertAsciiFile(BufferView * bv, string const & f, bool asParagraph)
1076 if (!bv->available()) return;
1078 if (fname.empty()) {
1080 fname = fileDlg.Select(_("File to Insert"),
1081 bv->owner()->buffer()->filepath,
1084 if (fname.empty()) return;
1089 if (!fi.readable()) {
1090 WriteFSAlert(_("Error! Specified file is unreadable: "),
1091 MakeDisplayPath(fname, 50));
1095 ifstream ifs(fname.c_str());
1097 WriteFSAlert(_("Error! Cannot open specified file: "),
1098 MakeDisplayPath(fname, 50));
1102 ifs.unsetf(ios::skipws);
1103 istream_iterator<char> ii(ifs);
1104 istream_iterator<char> end;
1105 #if !defined(USE_INCLUDED_STRING) && !defined(STD_STRING_IS_GOOD)
1106 // We use this until the compilers get better...
1108 copy(ii, end, back_inserter(tmp));
1109 string tmpstr(tmp.begin(), tmp.end());
1111 // This is what we want to use and what we will use once the
1112 // compilers get good enough.
1113 //string tmpstr(ii, end); // yet a reason for using std::string
1114 // alternate approach to get the file into a string:
1116 copy(ii, end, back_inserter(tmpstr));
1118 // insert the string
1119 current_view->hideCursor();
1121 // clear the selection
1124 bv->text->InsertStringA(bv, tmpstr);
1126 bv->text->InsertStringB(bv, tmpstr);
1127 bv->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
1131 void MenuShowTableOfContents()
1133 static int ow = -1, oh;
1136 if (fd_form_toc->form_toc->visible) {
1137 fl_raise_form(fd_form_toc->form_toc);
1139 fl_show_form(fd_form_toc->form_toc,
1140 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1141 _("Table Of Contents"));
1143 ow = fd_form_toc->form_toc->w;
1144 oh = fd_form_toc->form_toc->h;
1146 fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
1151 void MenuInsertLabel(char const * arg)
1154 ProhibitInput(current_view);
1155 if (label.empty()) {
1157 result = askForText(_("Enter new label to insert:"));
1159 label = frontStrip(strip(result.second));
1162 if (!label.empty()) {
1163 InsetLabel * new_inset = new InsetLabel;
1164 new_inset->setContents(label);
1165 current_view->insertInset(new_inset);
1167 AllowInput(current_view);
1171 void MenuInsertRef()
1173 static int ow = -1, oh;
1176 if (fd_form_ref->form_ref->visible) {
1177 fl_raise_form(fd_form_ref->form_ref);
1179 fl_show_form(fd_form_ref->form_ref,
1180 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1181 _("Insert Reference"));
1183 ow = fd_form_ref->form_ref->w;
1184 oh = fd_form_ref->form_ref->h;
1186 fl_set_form_minsize(fd_form_ref->form_ref, ow, oh);
1191 // candidate for move to LyXView
1192 // This is only used in toolbar.C
1193 void LayoutsCB(int sel, void *)
1195 string tmp = tostr(sel);
1196 current_view->owner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1202 * SGML Linuxdoc support:
1203 * (flag == 0) make TeX output
1204 * (flag == 1) make dvi output
1206 int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
1213 /* generate a path-less extension name */
1214 string name = OnlyFilename(ChangeExtension (filename, ".sgml"));
1215 string path = OnlyPath (filename);
1216 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
1217 path = bv->buffer()->tmppath;
1221 if (!bv->available())
1223 bv->buffer()->makeLinuxDocFile(name, false);
1225 // CHECK remove this once we have a proper geometry class
1227 BufferParams::PAPER_SIZE ps =
1228 static_cast<BufferParams::PAPER_SIZE>(bv->buffer()->params.papersize);
1230 case BufferParams::PAPER_A4PAPER:
1231 add_flags = "-p a4";
1233 case BufferParams::PAPER_USLETTER:
1234 add_flags = "-p letter";
1236 default: /* nothing to be done yet ;-) */ break;
1243 case 0: /* TeX output asked */
1244 bv->owner()->getMiniBuffer()->Set(_("Converting LinuxDoc SGML to TeX file..."));
1245 s2 = lyxrc.linuxdoc_to_latex_command + ' ' + add_flags + " -o tex " + ' ' + name;
1246 if (one.startscript(Systemcalls::System, s2))
1249 case 1: /* dvi output asked */
1250 bv->owner()->getMiniBuffer()->Set(_("Converting LinuxDoc SGML to dvi file..."));
1251 s2 = lyxrc.linuxdoc_to_latex_command + ' ' + add_flags + " -o dvi " + ' ' + name;
1252 if (one.startscript(Systemcalls::System, s2)) {
1256 default: /* unknown output */
1262 bv->buffer()->redraw();
1268 * SGML DocBook support:
1269 * (flag == 1) make dvi output
1271 int RunDocBook(int flag, string const & filename)
1273 /* generate a path-less extension name */
1274 string name = OnlyFilename(ChangeExtension (filename, ".sgml"));
1275 string path = OnlyPath (filename);
1276 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
1277 path = current_view->buffer()->tmppath;
1281 if (!current_view->available())
1284 current_view->buffer()->makeDocBookFile(name, false);
1286 // Shall this code go or should it stay? (Lgb)
1287 // This code is a placeholder for future implementation. (Jose')
1288 // string add_flags;
1289 // LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->buffer()->params.papersize;
1291 // case BufferParams::PAPER_A4PAPER: add_flags = "-p a4"; break;
1292 // case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
1293 // default: /* nothing to be done yet ;-) */ break;
1295 ProhibitInput(current_view);
1300 case 1: /* dvi output asked */
1302 current_view->owner()->getMiniBuffer()->Set(_("Converting DocBook SGML to dvi file..."));
1303 string s2 = lyxrc.docbook_to_dvi_command + ' ' + name;
1304 if (one.startscript(Systemcalls::System, s2)) {
1309 default: /* unknown output */
1313 AllowInput(current_view);
1315 current_view->buffer()->redraw();
1320 void MenuLayoutCharacter()
1322 static int ow = -1, oh;
1324 if (fd_form_character->form_character->visible) {
1325 fl_raise_form(fd_form_character->form_character);
1327 fl_show_form(fd_form_character->form_character,
1328 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1329 _("Character Style"));
1331 ow = fd_form_character->form_character->w;
1332 oh = fd_form_character->form_character->h;
1334 fl_set_form_minsize(fd_form_character->form_character, ow, oh);
1340 void DeactivateParagraphButtons ()
1342 fl_deactivate_object (fd_form_paragraph->button_ok);
1343 fl_deactivate_object (fd_form_paragraph->button_apply);
1344 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1345 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1350 void ActivateParagraphButtons ()
1352 fl_activate_object (fd_form_paragraph->button_ok);
1353 fl_activate_object (fd_form_paragraph->button_apply);
1354 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1355 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1360 void DisableParagraphLayout ()
1362 DeactivateParagraphButtons();
1363 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1364 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1365 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1366 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1367 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1368 fl_deactivate_object (fd_form_paragraph->check_noindent);
1369 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1370 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1371 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1372 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1373 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1374 fl_deactivate_object (fd_form_paragraph->input_space_above);
1375 fl_deactivate_object (fd_form_paragraph->input_space_below);
1376 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1377 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1378 fl_deactivate_object (fd_form_paragraph->check_space_above);
1379 fl_deactivate_object (fd_form_paragraph->check_space_below);
1384 void EnableParagraphLayout ()
1386 ActivateParagraphButtons();
1387 fl_activate_object (fd_form_paragraph->input_labelwidth);
1388 fl_activate_object (fd_form_paragraph->check_lines_top);
1389 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1390 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1391 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1392 fl_activate_object (fd_form_paragraph->check_noindent);
1393 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1394 fl_activate_object (fd_form_paragraph->radio_align_right);
1395 fl_activate_object (fd_form_paragraph->radio_align_left);
1396 fl_activate_object (fd_form_paragraph->radio_align_block);
1397 fl_activate_object (fd_form_paragraph->radio_align_center);
1398 fl_activate_object (fd_form_paragraph->input_space_above);
1399 fl_activate_object (fd_form_paragraph->input_space_below);
1400 fl_activate_object (fd_form_paragraph->choice_space_above);
1401 fl_activate_object (fd_form_paragraph->choice_space_below);
1402 fl_activate_object (fd_form_paragraph->check_space_above);
1403 fl_activate_object (fd_form_paragraph->check_space_below);
1407 bool UpdateLayoutParagraph()
1409 if (!current_view->available()) {
1410 if (fd_form_paragraph->form_paragraph->visible)
1411 fl_hide_form(fd_form_paragraph->form_paragraph);
1415 Buffer * buf = current_view->buffer();
1417 if (current_view->the_locking_inset)
1418 text = current_view->the_locking_inset->getLyXText(current_view);
1420 text = current_view->text;
1422 fl_set_input(fd_form_paragraph->input_labelwidth,
1423 text->cursor.par()->GetLabelWidthString().c_str());
1424 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1425 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1426 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1427 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1429 int align = text->cursor.par()->GetAlign();
1430 if (align == LYX_ALIGN_LAYOUT)
1431 align = textclasslist.Style(buf->params.textclass,
1432 text->cursor.par()->GetLayout()).align;
1435 case LYX_ALIGN_RIGHT:
1436 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1438 case LYX_ALIGN_LEFT:
1439 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1441 case LYX_ALIGN_CENTER:
1442 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1445 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1450 fl_set_button(fd_form_paragraph->check_lines_top,
1451 text->cursor.par()->FirstPhysicalPar()->line_top);
1453 fl_set_button(fd_form_paragraph->check_lines_bottom,
1454 text->cursor.par()->FirstPhysicalPar()->line_bottom);
1456 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1457 text->cursor.par()->FirstPhysicalPar()->pagebreak_top);
1459 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1460 text->cursor.par()->FirstPhysicalPar()->pagebreak_bottom);
1461 fl_set_button(fd_form_paragraph->check_noindent,
1462 text->cursor.par()->FirstPhysicalPar()->noindent);
1464 fl_set_button(fd_form_paragraph->check_lines_top,
1465 text->cursor.par()->line_top);
1466 fl_set_button(fd_form_paragraph->check_lines_bottom,
1467 text->cursor.par()->line_bottom);
1468 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1469 text->cursor.par()->pagebreak_top);
1470 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1471 text->cursor.par()->pagebreak_bottom);
1472 fl_set_button(fd_form_paragraph->check_noindent,
1473 text->cursor.par()->noindent);
1475 fl_set_input (fd_form_paragraph->input_space_above, "");
1478 switch (text->cursor.par()->FirstPhysicalPar()->added_space_top.kind()) {
1480 switch (text->cursor.par()->added_space_top.kind()) {
1484 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
1486 case VSpace::DEFSKIP:
1487 fl_set_choice (fd_form_paragraph->choice_space_above, 2);
1489 case VSpace::SMALLSKIP:
1490 fl_set_choice (fd_form_paragraph->choice_space_above, 3);
1492 case VSpace::MEDSKIP:
1493 fl_set_choice (fd_form_paragraph->choice_space_above, 4);
1495 case VSpace::BIGSKIP:
1496 fl_set_choice (fd_form_paragraph->choice_space_above, 5);
1499 fl_set_choice (fd_form_paragraph->choice_space_above, 6);
1501 case VSpace::LENGTH:
1502 fl_set_choice (fd_form_paragraph->choice_space_above, 7);
1504 fl_set_input (fd_form_paragraph->input_space_above,
1505 text->cursor.par()->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1507 fl_set_input (fd_form_paragraph->input_space_above,
1508 text->cursor.par()->added_space_top.length().asString().c_str());
1513 fl_set_button (fd_form_paragraph->check_space_above,
1514 text->cursor.par()->FirstPhysicalPar()->added_space_top.keep());
1515 fl_set_input (fd_form_paragraph->input_space_below, "");
1516 switch (text->cursor.par()->FirstPhysicalPar()->added_space_bottom.kind()) {
1518 fl_set_button (fd_form_paragraph->check_space_above,
1519 text->cursor.par()->added_space_top.keep());
1520 fl_set_input (fd_form_paragraph->input_space_below, "");
1521 switch (text->cursor.par()->added_space_bottom.kind()) {
1524 fl_set_choice (fd_form_paragraph->choice_space_below,
1527 case VSpace::DEFSKIP:
1528 fl_set_choice (fd_form_paragraph->choice_space_below,
1531 case VSpace::SMALLSKIP:
1532 fl_set_choice (fd_form_paragraph->choice_space_below,
1535 case VSpace::MEDSKIP:
1536 fl_set_choice (fd_form_paragraph->choice_space_below,
1539 case VSpace::BIGSKIP:
1540 fl_set_choice (fd_form_paragraph->choice_space_below,
1544 fl_set_choice (fd_form_paragraph->choice_space_below,
1547 case VSpace::LENGTH:
1548 fl_set_choice (fd_form_paragraph->choice_space_below,
1551 fl_set_input (fd_form_paragraph->input_space_below,
1552 text->cursor.par()->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1555 fl_set_button (fd_form_paragraph->check_space_below,
1556 text->cursor.par()->FirstPhysicalPar()->added_space_bottom.keep());
1558 fl_set_button(fd_form_paragraph->check_noindent,
1559 text->cursor.par()->FirstPhysicalPar()->noindent);
1561 fl_set_input (fd_form_paragraph->input_space_below,
1562 text->cursor.par()->added_space_bottom.length().asString().c_str());
1565 fl_set_button (fd_form_paragraph->check_space_below,
1566 text->cursor.par()->added_space_bottom.keep());
1568 fl_set_button(fd_form_paragraph->check_noindent,
1569 text->cursor.par()->noindent);
1571 if (current_view->buffer()->isReadonly()) {
1572 DisableParagraphLayout();
1574 EnableParagraphLayout();
1580 void MenuLayoutParagraph()
1582 if (UpdateLayoutParagraph()) {
1583 if (fd_form_paragraph->form_paragraph->visible) {
1584 fl_raise_form(fd_form_paragraph->form_paragraph);
1586 fl_show_form(fd_form_paragraph->form_paragraph,
1587 FL_PLACE_MOUSE, FL_FULLBORDER,
1588 _("Paragraph Environment"));
1595 void DeactivateDocumentButtons ()
1597 fl_deactivate_object (fd_form_document->button_ok);
1598 fl_deactivate_object (fd_form_document->button_apply);
1599 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1600 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1605 void ActivateDocumentButtons ()
1607 fl_activate_object (fd_form_document->button_ok);
1608 fl_activate_object (fd_form_document->button_apply);
1609 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1610 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1615 void DisableDocumentLayout ()
1617 DeactivateDocumentButtons ();
1618 fl_deactivate_object (fd_form_document->group_radio_separation);
1619 fl_deactivate_object (fd_form_document->radio_indent);
1620 fl_deactivate_object (fd_form_document->radio_skip);
1621 fl_deactivate_object (fd_form_document->choice_class);
1622 fl_deactivate_object (fd_form_document->choice_pagestyle);
1623 fl_deactivate_object (fd_form_document->choice_fonts);
1624 fl_deactivate_object (fd_form_document->choice_fontsize);
1625 fl_deactivate_object (fd_form_document->input_float_placement);
1626 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1627 fl_deactivate_object (fd_form_document->choice_inputenc);
1628 fl_deactivate_object (fd_form_document->group_radio_sides);
1629 fl_deactivate_object (fd_form_document->radio_sides_one);
1630 fl_deactivate_object (fd_form_document->radio_sides_two);
1631 fl_deactivate_object (fd_form_document->group_radio_columns);
1632 fl_deactivate_object (fd_form_document->radio_columns_one);
1633 fl_deactivate_object (fd_form_document->radio_columns_two);
1634 fl_deactivate_object (fd_form_document->input_extra);
1635 fl_deactivate_object (fd_form_document->choice_language);
1636 combo_language->deactivate();
1637 fl_deactivate_object (fd_form_document->input_default_skip);
1638 fl_deactivate_object (fd_form_document->choice_default_skip);
1639 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1640 fl_deactivate_object (fd_form_document->slider_tocdepth);
1641 fl_deactivate_object (fd_form_document->choice_spacing);
1642 fl_deactivate_object (fd_form_document->input_spacing);
1643 fl_deactivate_object (fd_form_document->check_use_amsmath);
1648 void EnableDocumentLayout ()
1650 ActivateDocumentButtons ();
1651 fl_activate_object (fd_form_document->group_radio_separation);
1652 fl_activate_object (fd_form_document->radio_indent);
1653 fl_activate_object (fd_form_document->radio_skip);
1654 fl_activate_object (fd_form_document->choice_class);
1655 fl_activate_object (fd_form_document->choice_pagestyle);
1656 fl_activate_object (fd_form_document->choice_fonts);
1657 fl_activate_object (fd_form_document->choice_fontsize);
1658 fl_activate_object (fd_form_document->input_float_placement);
1659 fl_activate_object (fd_form_document->choice_postscript_driver);
1660 fl_activate_object (fd_form_document->choice_inputenc);
1661 fl_activate_object (fd_form_document->group_radio_sides);
1662 fl_activate_object (fd_form_document->radio_sides_one);
1663 fl_activate_object (fd_form_document->radio_sides_two);
1664 fl_activate_object (fd_form_document->group_radio_columns);
1665 fl_activate_object (fd_form_document->radio_columns_one);
1666 fl_activate_object (fd_form_document->radio_columns_two);
1667 fl_activate_object (fd_form_document->input_extra);
1668 fl_activate_object (fd_form_document->choice_language);
1669 combo_language->activate();
1670 fl_activate_object (fd_form_document->input_default_skip);
1671 fl_activate_object (fd_form_document->choice_default_skip);
1672 fl_activate_object (fd_form_document->slider_secnumdepth);
1673 fl_activate_object (fd_form_document->slider_tocdepth);
1674 fl_activate_object (fd_form_document->choice_spacing);
1675 fl_activate_object (fd_form_document->input_spacing);
1676 fl_activate_object (fd_form_document->check_use_amsmath);
1680 bool UpdateLayoutDocument(BufferParams * params)
1682 if (!current_view->available()) {
1683 if (fd_form_document->form_document->visible)
1684 fl_hide_form(fd_form_document->form_document);
1689 params = ¤t_view->buffer()->params;
1690 LyXTextClass const & tclass = textclasslist.TextClass(params->textclass);
1692 fl_set_choice_text(fd_form_document->choice_class,
1693 textclasslist.DescOfClass(params->textclass).c_str());
1694 combo_language->select_text(params->language.c_str());
1696 fl_set_choice_text(fd_form_document->choice_fonts,
1697 params->fonts.c_str());
1698 fl_set_choice_text(fd_form_document->choice_inputenc,
1699 params->inputenc.c_str());
1700 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1701 params->graphicsDriver.c_str());
1703 // ale970405+lasgoutt970513
1704 fl_clear_choice(fd_form_document->choice_fontsize);
1705 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1706 fl_addto_choice(fd_form_document->choice_fontsize,
1707 tclass.opt_fontsize().c_str());
1708 fl_set_choice(fd_form_document->choice_fontsize,
1709 tokenPos(tclass.opt_fontsize(), '|', params->fontsize) + 2);
1711 // ale970405+lasgoutt970513
1712 fl_clear_choice(fd_form_document->choice_pagestyle);
1713 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1714 fl_addto_choice(fd_form_document->choice_pagestyle,
1715 tclass.opt_pagestyle().c_str());
1717 fl_set_choice(fd_form_document->choice_pagestyle,
1718 tokenPos(tclass.opt_pagestyle(), '|', params->pagestyle) + 2);
1720 fl_set_button(fd_form_document->radio_indent, 0);
1721 fl_set_button(fd_form_document->radio_skip, 0);
1724 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1726 if (params->paragraph_separation == BufferParams::PARSEP_INDENT)
1727 fl_set_button(fd_form_document->radio_indent, 1);
1729 fl_set_button(fd_form_document->radio_skip, 1);
1731 switch (params->getDefSkip().kind()) {
1732 case VSpace::SMALLSKIP:
1733 fl_set_choice (fd_form_document->choice_default_skip, 1);
1735 case VSpace::MEDSKIP:
1736 fl_set_choice (fd_form_document->choice_default_skip, 2);
1738 case VSpace::BIGSKIP:
1739 fl_set_choice (fd_form_document->choice_default_skip, 3);
1741 case VSpace::LENGTH:
1742 fl_set_choice (fd_form_document->choice_default_skip, 4);
1743 fl_set_input (fd_form_document->input_default_skip,
1744 params->getDefSkip().asLyXCommand().c_str());
1747 fl_set_choice (fd_form_document->choice_default_skip, 2);
1751 fl_set_button(fd_form_document->radio_sides_one, 0);
1752 fl_set_button(fd_form_document->radio_sides_two, 0);
1754 switch (params->sides) {
1755 case LyXTextClass::OneSide:
1756 fl_set_button(fd_form_document->radio_sides_one, 1);
1758 case LyXTextClass::TwoSides:
1759 fl_set_button(fd_form_document->radio_sides_two, 1);
1763 fl_set_button(fd_form_document->radio_columns_one, 0);
1764 fl_set_button(fd_form_document->radio_columns_two, 0);
1766 if (params->columns == 2)
1767 fl_set_button(fd_form_document->radio_columns_two, 1);
1769 fl_set_button(fd_form_document->radio_columns_one, 1);
1771 fl_set_input(fd_form_document->input_spacing, "");
1772 switch (params->spacing.getSpace()) {
1773 case Spacing::Default: // nothing bad should happen with this
1774 case Spacing::Single:
1777 fl_set_choice(fd_form_document->choice_spacing, 1);
1780 case Spacing::Onehalf:
1783 fl_set_choice(fd_form_document->choice_spacing, 2);
1786 case Spacing::Double:
1789 fl_set_choice(fd_form_document->choice_spacing, 3);
1792 case Spacing::Other:
1794 fl_set_choice(fd_form_document->choice_spacing, 4);
1796 //sprintf(sval, "%g", params->spacing.getValue());
1798 std::ostringstream sval;
1799 sval << params->spacing.getValue(); // setw?
1800 fl_set_input(fd_form_document->input_spacing,
1801 sval.str().c_str());
1804 ostrstream sval(tval, 20);
1805 sval << params->spacing.getValue() << '\0'; // setw?
1806 fl_set_input(fd_form_document->input_spacing, sval.str());
1813 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1814 params->secnumdepth);
1815 fl_set_counter_value(fd_form_document->slider_tocdepth,
1817 if (!params->float_placement.empty()) { // buffer local (Lgb)
1818 fl_set_input(fd_form_document->input_float_placement,
1819 params->float_placement.c_str());
1821 fl_set_input(fd_form_document->input_float_placement, "");
1823 if (!params->options.empty())
1824 fl_set_input(fd_form_document->input_extra,
1825 params->options.c_str());
1827 fl_set_input(fd_form_document->input_extra, "");
1829 if (current_view->buffer()->isSGML()) {
1830 // bullets not used in SGML derived documents
1831 fl_deactivate_object(fd_form_document->button_bullets);
1832 fl_set_object_lcol(fd_form_document->button_bullets,
1835 fl_activate_object(fd_form_document->button_bullets);
1836 fl_set_object_lcol(fd_form_document->button_bullets,
1840 if (current_view->buffer()->isReadonly()) {
1841 DisableDocumentLayout();
1843 EnableDocumentLayout();
1850 void MenuLayoutDocument()
1852 if (UpdateLayoutDocument()) {
1853 if (fd_form_document->form_document->visible) {
1854 fl_raise_form(fd_form_document->form_document);
1856 fl_show_form(fd_form_document->form_document,
1857 FL_PLACE_MOUSE, FL_FULLBORDER,
1858 _("Document Layout"));
1864 bool UpdateLayoutQuotes()
1867 if (!current_view->available()
1868 || current_view->buffer()->isReadonly())
1872 fl_set_choice(fd_form_quotes->choice_quotes_language,
1873 current_view->buffer()->params.quotes_language + 1);
1874 fl_set_button(fd_form_quotes->radio_single, 0);
1875 fl_set_button(fd_form_quotes->radio_double, 0);
1877 if (current_view->buffer()->params.quotes_times == InsetQuotes::SingleQ)
1878 fl_set_button(fd_form_quotes->radio_single, 1);
1880 fl_set_button(fd_form_quotes->radio_double, 1);
1881 } else if (fd_form_quotes->form_quotes->visible) {
1882 fl_hide_form(fd_form_quotes->form_quotes);
1888 void MenuLayoutQuotes()
1890 if (UpdateLayoutQuotes()) {
1891 if (fd_form_quotes->form_quotes->visible) {
1892 fl_raise_form(fd_form_quotes->form_quotes);
1894 fl_show_form(fd_form_quotes->form_quotes,
1895 FL_PLACE_MOUSE, FL_FULLBORDER,
1902 bool UpdateLayoutPreamble()
1905 if (!current_view->available())
1909 fl_set_input(fd_form_preamble->input_preamble,
1910 current_view->buffer()->params.preamble.c_str());
1912 if (current_view->buffer()->isReadonly()) {
1913 fl_deactivate_object(fd_form_preamble->input_preamble);
1914 fl_deactivate_object(fd_form_preamble->button_ok);
1915 fl_deactivate_object(fd_form_preamble->button_apply);
1916 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
1917 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
1920 fl_activate_object(fd_form_preamble->input_preamble);
1921 fl_activate_object(fd_form_preamble->button_ok);
1922 fl_activate_object(fd_form_preamble->button_apply);
1923 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
1924 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
1926 } else if (fd_form_preamble->form_preamble->visible) {
1927 fl_hide_form(fd_form_preamble->form_preamble);
1933 void MenuLayoutPreamble()
1935 static int ow = -1, oh;
1937 if (UpdateLayoutPreamble()) {
1938 if (fd_form_preamble->form_preamble->visible) {
1939 fl_raise_form(fd_form_preamble->form_preamble);
1941 fl_show_form(fd_form_preamble->form_preamble,
1942 FL_PLACE_MOUSE | FL_FREE_SIZE,
1944 _("LaTeX Preamble"));
1946 ow = fd_form_preamble->form_preamble->w;
1947 oh = fd_form_preamble->form_preamble->h;
1949 fl_set_form_minsize(fd_form_preamble->form_preamble,
1956 void MenuLayoutSave()
1958 if (!current_view->available())
1961 if (AskQuestion(_("Do you want to save the current settings"),
1962 _("for Character, Document, Paper and Quotes"),
1963 _("as default for new documents?")))
1964 current_view->buffer()->saveParamsAsDefaults();
1968 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
1969 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
1970 LyXFont UserFreeFont(BufferParams const & params)
1972 LyXFont font(LyXFont::ALL_IGNORE);
1974 int pos = fl_get_choice(fd_form_character->choice_family);
1976 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
1977 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
1978 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
1979 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
1980 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
1983 pos = fl_get_choice(fd_form_character->choice_series);
1985 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
1986 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
1987 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
1988 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
1991 pos = fl_get_choice(fd_form_character->choice_shape);
1993 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
1994 case 2: font.setShape(LyXFont::UP_SHAPE); break;
1995 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
1996 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
1997 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
1998 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2001 pos = fl_get_choice(fd_form_character->choice_size);
2003 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2004 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2005 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2006 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2007 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2008 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2009 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2010 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2011 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2012 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2013 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2014 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2015 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2016 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2019 pos = fl_get_choice(fd_form_character->choice_bar);
2021 case 1: font.setEmph(LyXFont::IGNORE);
2022 font.setUnderbar(LyXFont::IGNORE);
2023 font.setNoun(LyXFont::IGNORE);
2024 font.setLatex(LyXFont::IGNORE);
2026 case 2: font.setEmph(LyXFont::TOGGLE); break;
2027 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2028 case 4: font.setNoun(LyXFont::TOGGLE); break;
2029 case 5: font.setLatex(LyXFont::TOGGLE); break;
2030 case 6: font.setEmph(LyXFont::INHERIT);
2031 font.setUnderbar(LyXFont::INHERIT);
2032 font.setNoun(LyXFont::INHERIT);
2033 font.setLatex(LyXFont::INHERIT);
2037 pos = fl_get_choice(fd_form_character->choice_color);
2039 case 1: font.setColor(LColor::ignore); break;
2040 case 2: font.setColor(LColor::none); break;
2041 case 3: font.setColor(LColor::black); break;
2042 case 4: font.setColor(LColor::white); break;
2043 case 5: font.setColor(LColor::red); break;
2044 case 6: font.setColor(LColor::green); break;
2045 case 7: font.setColor(LColor::blue); break;
2046 case 8: font.setColor(LColor::cyan); break;
2047 case 9: font.setColor(LColor::magenta); break;
2048 case 10: font.setColor(LColor::yellow); break;
2049 case 11: font.setColor(LColor::inherit); break;
2052 int choice = combo_language2->get();
2054 font.setLanguage(ignore_language);
2055 else if (choice == 2)
2056 font.setLanguage(params.language_info);
2058 font.setLanguage(&languages[combo_language2->getline()]);
2064 /* callbacks for form form_title */
2065 extern "C" void TimerCB(FL_OBJECT *, long)
2067 // only if the form still exists
2068 if (lyxrc.show_banner && fd_form_title->form_title != 0) {
2069 if (fd_form_title->form_title->visible) {
2070 fl_hide_form(fd_form_title->form_title);
2072 fl_free_form(fd_form_title->form_title);
2073 fd_form_title->form_title = 0;
2078 /* callbacks for form form_paragraph */
2080 extern "C" void ParagraphVSpaceCB(FL_OBJECT * obj, long )
2082 // "Synchronize" the choices and input fields, making it
2083 // impossible to commit senseless data.
2085 FD_form_paragraph const * fp = fd_form_paragraph;
2087 if (obj == fp->choice_space_above) {
2088 if (fl_get_choice (fp->choice_space_above) != 7) {
2089 fl_set_input (fp->input_space_above, "");
2090 ActivateParagraphButtons();
2092 } else if (obj == fp->choice_space_below) {
2093 if (fl_get_choice (fp->choice_space_below) != 7) {
2094 fl_set_input (fp->input_space_below, "");
2095 ActivateParagraphButtons();
2097 } else if (obj == fp->input_space_above) {
2098 string input = fl_get_input (fp->input_space_above);
2100 if (input.empty()) {
2101 fl_set_choice (fp->choice_space_above, 1);
2102 ActivateParagraphButtons();
2104 else if (isValidGlueLength (input)) {
2105 fl_set_choice (fp->choice_space_above, 7);
2106 ActivateParagraphButtons();
2109 fl_set_choice (fp->choice_space_above, 7);
2110 DeactivateParagraphButtons();
2112 } else if (obj == fp->input_space_below) {
2113 string input = fl_get_input (fp->input_space_below);
2115 if (input.empty()) {
2116 fl_set_choice (fp->choice_space_below, 1);
2117 ActivateParagraphButtons();
2119 else if (isValidGlueLength (input)) {
2120 fl_set_choice (fp->choice_space_below, 7);
2121 ActivateParagraphButtons();
2124 fl_set_choice (fp->choice_space_below, 7);
2125 DeactivateParagraphButtons();
2131 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2133 if (!current_view->available())
2136 VSpace space_top, space_bottom;
2138 string labelwidthstring;
2141 // If a vspace kind is "Length" but there's no text in
2142 // the input field, reset the kind to "None".
2143 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2144 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2145 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2147 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2148 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2149 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2152 bool line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2153 bool line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2154 bool pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2155 bool pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2156 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2157 case 1: space_top = VSpace(VSpace::NONE); break;
2158 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2159 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2160 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2161 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2162 case 6: space_top = VSpace(VSpace::VFILL); break;
2163 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2165 if (fl_get_button (fd_form_paragraph->check_space_above))
2166 space_top.setKeep (true);
2167 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2168 case 1: space_bottom = VSpace(VSpace::NONE); break;
2169 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2170 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2171 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2172 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2173 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2174 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2176 if (fl_get_button (fd_form_paragraph->check_space_below))
2177 space_bottom.setKeep (true);
2179 if (fl_get_button(fd_form_paragraph->radio_align_left))
2180 align = LYX_ALIGN_LEFT;
2181 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2182 align = LYX_ALIGN_RIGHT;
2183 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2184 align = LYX_ALIGN_CENTER;
2186 align = LYX_ALIGN_BLOCK;
2188 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2189 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2192 if (current_view->the_locking_inset)
2193 text = current_view->the_locking_inset->getLyXText(current_view);
2195 text = current_view->text;
2196 text->SetParagraph(current_view,
2206 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2207 current_view->owner()->getMiniBuffer()->Set(_("Paragraph layout set"));
2211 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2213 fl_hide_form(fd_form_paragraph->form_paragraph);
2217 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2219 ParagraphApplyCB(ob, data);
2220 ParagraphCancelCB(ob, data);
2224 /* callbacks for form form_character */
2226 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2228 // we set toggleall locally here, since it should be true for
2229 // all other uses of ToggleAndShow() (JMarc)
2230 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2231 ToggleAndShow(current_view, UserFreeFont(current_view->buffer()->params));
2232 current_view->setState();
2237 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2239 fl_hide_form(fd_form_character->form_character);
2243 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2245 CharacterApplyCB(ob, data);
2246 CharacterCloseCB(ob, data);
2250 /* callbacks for form form_document */
2252 void UpdateDocumentButtons(BufferParams const & params)
2254 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2256 switch (params.sides) {
2257 case LyXTextClass::OneSide:
2258 fl_set_button(fd_form_document->radio_sides_one, 1);
2260 case LyXTextClass::TwoSides:
2261 fl_set_button(fd_form_document->radio_sides_two, 1);
2265 if (params.columns == 2)
2266 fl_set_button(fd_form_document->radio_columns_two, 1);
2268 fl_set_button(fd_form_document->radio_columns_one, 1);
2270 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2271 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2272 params.secnumdepth);
2273 fl_set_counter_value(fd_form_document->slider_tocdepth,
2278 extern "C" void ChoiceClassCB(FL_OBJECT * ob, long)
2280 ProhibitInput(current_view);
2281 if (textclasslist.Load(fl_get_choice(ob)-1)) {
2282 if (AskQuestion(_("Should I set some parameters to"),
2283 fl_get_choice_text(ob),
2284 _("the defaults of this document class?"))) {
2285 BufferParams params = BufferParams();
2286 params.textclass = fl_get_choice(ob)-1;
2287 params.useClassDefaults();
2288 UpdateLayoutDocument(¶ms);
2289 UpdateDocumentButtons(params);
2292 // unable to load new style
2293 WriteAlert(_("Conversion Errors!"),
2294 _("Unable to switch to new document class."),
2295 _("Reverting to original document class."));
2296 fl_set_choice(fd_form_document->choice_class,
2297 current_view->buffer()->params.textclass + 1);
2299 AllowInput(current_view);
2303 extern "C" void DocumentDefskipCB(FL_OBJECT * obj, long)
2305 // "Synchronize" the choice and the input field, so that it
2306 // is impossible to commit senseless data.
2307 FD_form_document const * fd = fd_form_document;
2309 if (obj == fd->choice_default_skip) {
2310 if (fl_get_choice (fd->choice_default_skip) != 4) {
2311 fl_set_input (fd->input_default_skip, "");
2312 ActivateDocumentButtons();
2314 } else if (obj == fd->input_default_skip) {
2316 char const * input = fl_get_input (fd->input_default_skip);
2319 fl_set_choice (fd->choice_default_skip, 2);
2320 ActivateDocumentButtons();
2321 } else if (isValidGlueLength (input)) {
2322 fl_set_choice (fd->choice_default_skip, 4);
2323 ActivateDocumentButtons();
2325 fl_set_choice (fd->choice_default_skip, 4);
2326 DeactivateDocumentButtons();
2332 extern "C" void DocumentSpacingCB(FL_OBJECT * obj, long)
2334 // "Synchronize" the choice and the input field, so that it
2335 // is impossible to commit senseless data.
2336 FD_form_document const * fd = fd_form_document;
2338 if (obj == fd->choice_spacing
2339 && fl_get_choice (fd->choice_spacing) != 4) {
2340 fl_set_input(fd->input_spacing, "");
2341 } else if (obj == fd->input_spacing) {
2343 const char* input = fl_get_input (fd->input_spacing);
2346 fl_set_choice (fd->choice_spacing, 1);
2348 fl_set_choice (fd->choice_spacing, 4);
2354 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2357 BufferParams * params = &(current_view->buffer()->params);
2359 Language const * old_language = params->language_info;
2360 params->language = combo_language->getline();
2361 Languages::iterator lit = languages.find(params->language);
2363 Language const * new_language;
2364 if (lit != languages.end())
2365 new_language = &(*lit).second;
2367 new_language = default_language;
2369 if (current_view->available()) {
2370 if (old_language != new_language
2371 && old_language->RightToLeft() == new_language->RightToLeft()
2372 && !current_view->buffer()->isMultiLingual())
2373 current_view->buffer()->ChangeLanguage(old_language,
2375 if (old_language != new_language) {
2376 //current_view->buffer()->redraw();
2380 params->language_info = new_language;
2382 // If default skip is a "Length" but there's no text in the
2383 // input field, reset the kind to "Medskip", which is the default.
2384 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2385 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2386 fl_set_choice (fd_form_document->choice_default_skip, 2);
2389 /* this shouldn't be done automatically IMO. For example I write german
2390 * documents with an american keyboard very often. Matthias */
2392 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2393 fl_get_choice(fd_form_document->choice_language)); */
2395 fl_get_choice_text(fd_form_document->choice_fonts);
2397 fl_get_choice_text(fd_form_document->choice_inputenc);
2399 fl_get_choice_text(fd_form_document->choice_fontsize);
2401 fl_get_choice_text(fd_form_document->choice_pagestyle);
2402 params->graphicsDriver =
2403 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2404 params->use_amsmath =
2405 fl_get_button(fd_form_document->check_use_amsmath);
2407 if (!current_view->available())
2410 current_view->text->SetCursor(current_view,
2411 current_view->text->cursor.par(),
2412 current_view->text->cursor.pos());
2413 current_view->setState();
2415 LyXTextClassList::ClassList::size_type new_class =
2416 fl_get_choice(fd_form_document->choice_class) - 1;
2418 if (params->textclass != new_class) {
2419 // try to load new_class
2420 if (textclasslist.Load(new_class)) {
2421 // successfully loaded
2423 current_view->owner()->getMiniBuffer()->
2424 Set(_("Converting document to new document class..."));
2426 int ret = cap.SwitchLayoutsBetweenClasses(
2427 current_view->buffer()->params.textclass,
2429 current_view->buffer()->paragraph);
2434 s = _("One paragraph couldn't be converted");
2437 s += _(" paragraphs couldn't be converted");
2439 WriteAlert(_("Conversion Errors!"), s,
2440 _("into chosen document class"));
2443 params->textclass = new_class;
2445 // problem changing class -- warn user and retain old style
2446 WriteAlert(_("Conversion Errors!"),
2447 _("Unable to switch to new document class."),
2448 _("Reverting to original document class."));
2449 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2453 char tmpsep = params->paragraph_separation;
2454 if (fl_get_button(fd_form_document->radio_indent))
2455 params->paragraph_separation = BufferParams::PARSEP_INDENT;
2457 params->paragraph_separation = BufferParams::PARSEP_SKIP;
2458 if (tmpsep != params->paragraph_separation)
2461 VSpace tmpdefskip = params->getDefSkip();
2462 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2463 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2464 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2465 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2466 case 4: params->setDefSkip(
2467 VSpace (LyXGlueLength (fl_get_input
2468 (fd_form_document->input_default_skip))));
2470 // DocumentDefskipCB assures that this never happens
2471 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2473 if (!(tmpdefskip == params->getDefSkip()))
2476 if (fl_get_button(fd_form_document->radio_columns_two))
2477 params->columns = 2;
2479 params->columns = 1;
2480 if (fl_get_button(fd_form_document->radio_sides_two))
2481 params->sides = LyXTextClass::TwoSides;
2483 params->sides = LyXTextClass::OneSide;
2485 Spacing tmpSpacing = params->spacing;
2486 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2488 lyxerr.debug() << "Spacing: SINGLE" << endl;
2489 params->spacing.set(Spacing::Single);
2492 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2493 params->spacing.set(Spacing::Onehalf);
2496 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2497 params->spacing.set(Spacing::Double);
2500 lyxerr.debug() << "Spacing: OTHER" << endl;
2501 params->spacing.set(Spacing::Other,
2502 fl_get_input(fd_form_document->input_spacing));
2505 if (tmpSpacing != params->spacing)
2508 signed char tmpchar =
2509 static_cast<signed char>(fl_get_counter_value(fd_form_document->slider_secnumdepth));
2510 if (params->secnumdepth != tmpchar)
2512 params->secnumdepth = tmpchar;
2515 static_cast<int>(fl_get_counter_value(fd_form_document->slider_tocdepth));
2517 params->float_placement =
2518 fl_get_input(fd_form_document->input_float_placement);
2520 // More checking should be done to ensure the string doesn't have
2521 // spaces or illegal placement characters in it. (thornley)
2524 current_view->redoCurrentBuffer();
2526 current_view->owner()->getMiniBuffer()->Set(_("Document layout set"));
2527 current_view->buffer()->markDirty();
2530 fl_get_input(fd_form_document->input_extra);
2534 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
2536 fl_hide_form(fd_form_document->form_document);
2540 extern "C" void DocumentOKCB(FL_OBJECT * ob, long data)
2542 DocumentCancelCB(ob, data);
2543 DocumentApplyCB(ob, data);
2547 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
2550 // bullet callbacks etc. in bullet_panel.C -- ARRae
2554 /* callbacks for form form_quotes */
2556 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
2558 if (!current_view->available())
2561 current_view->owner()->getMiniBuffer()->Set(_("Quotes type set"));
2562 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
2563 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
2565 lga = InsetQuotes::EnglishQ;
2568 lga = InsetQuotes::SwedishQ;
2571 lga = InsetQuotes::GermanQ;
2574 lga = InsetQuotes::PolishQ;
2577 lga = InsetQuotes::FrenchQ;
2580 lga = InsetQuotes::DanishQ;
2583 current_view->buffer()->params.quotes_language = lga;
2584 if (fl_get_button(fd_form_quotes->radio_single))
2585 current_view->buffer()->
2586 params.quotes_times = InsetQuotes::SingleQ;
2588 current_view->buffer()->
2589 params.quotes_times = InsetQuotes::DoubleQ;
2593 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
2595 fl_hide_form(fd_form_quotes->form_quotes);
2599 extern "C" void QuotesOKCB(FL_OBJECT * ob, long data)
2601 QuotesApplyCB(ob, data);
2602 QuotesCancelCB(ob, data);
2607 /* callbacks for form form_preamble */
2609 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
2611 fl_hide_form(fd_form_preamble->form_preamble);
2615 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
2617 if (!current_view->available())
2620 current_view->buffer()->params.preamble =
2621 fl_get_input(fd_form_preamble->input_preamble);
2622 current_view->buffer()->markDirty();
2623 current_view->owner()->getMiniBuffer()->Set(_("LaTeX preamble set"));
2627 extern "C" void PreambleOKCB(FL_OBJECT * ob, long data)
2629 PreambleApplyCB(ob, data);
2630 PreambleCancelCB(ob, data);
2634 /* callbacks for form form_table */
2637 void TableApplyCB(FL_OBJECT *, long)
2639 if (!current_view->available())
2643 // check for tables in tables
2644 if (current_view->text->cursor.par()->table){
2645 WriteAlert(_("Impossible Operation!"),
2646 _("Cannot insert table in table."),
2651 current_view->owner()->getMiniBuffer()->Set(_("Inserting table..."));
2653 int ysize = int(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
2654 int xsize = int(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
2657 current_view->hideCursor();
2658 current_view->beforeChange();
2659 current_view->update(BufferView::SELECT|BufferView::FITCUR);
2661 current_view->text->SetCursorParUndo(current_view->buffer());
2662 current_view->text->FreezeUndo();
2664 current_view->text->BreakParagraph(current_view);
2665 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2667 if (current_view->text->cursor.par()->Last()) {
2668 current_view->text->CursorLeft(current_view);
2670 current_view->text->BreakParagraph(current_view);
2671 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2674 current_view->text->current_font.setLatex(LyXFont::OFF);
2675 //if (!fl_get_button(fd_form_table->check_latex)){
2676 // insert the new wysiwy table
2677 current_view->text->SetLayout(current_view, 0); // standard layout
2679 if (current_view->text->cursor.par()->footnoteflag ==
2680 LyXParagraph::NO_FOOTNOTE) {
2683 ->SetParagraph(current_view, 0, 0,
2685 VSpace (0.3 * current_view->buffer()->
2686 params.spacing.getValue(),
2688 VSpace (0.3 * current_view->buffer()->
2689 params.spacing.getValue(),
2697 ->SetParagraph(current_view, 0, 0,
2699 VSpace(VSpace::NONE),
2700 VSpace(VSpace::NONE),
2707 current_view->text->cursor.par()->table =
2708 new LyXTable(xsize, ysize);
2710 Language const * lang =
2711 current_view->text->cursor.par()->getParLanguage(current_view->buffer()->params);
2712 LyXFont font(LyXFont::ALL_INHERIT, lang);
2713 for (int i = 0; i < xsize * ysize - 1; ++i) {
2714 current_view->text->cursor.par()
2715 ->InsertChar(0, LyXParagraph::META_NEWLINE, font);
2717 current_view->text->RedoParagraph(current_view);
2719 current_view->text->UnFreezeUndo();
2721 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2722 current_view->owner()->getMiniBuffer()->Set(_("Table inserted"));
2723 current_view->setState();
2728 void TableCancelCB(FL_OBJECT *, long)
2730 fl_hide_form(fd_form_table->form_table);
2735 void TableOKCB(FL_OBJECT * ob, long data)
2737 TableApplyCB(ob, data);
2738 TableCancelCB(ob, data);
2744 if (fd_form_figure->form_figure->visible) {
2745 fl_raise_form(fd_form_figure->form_figure);
2747 fl_show_form(fd_form_figure->form_figure,
2748 FL_PLACE_MOUSE, FL_FULLBORDER,
2749 _("Insert Figure"));
2756 if (fd_form_table->form_table->visible) {
2757 fl_raise_form(fd_form_table->form_table);
2759 fl_show_form(fd_form_table->form_table,
2760 FL_PLACE_MOUSE, FL_FULLBORDER,
2766 /* callbacks for form form_figure */
2768 void FigureApplyCB(FL_OBJECT *, long)
2770 if (!current_view->available())
2773 Buffer * buffer = current_view->buffer();
2774 if(buffer->isReadonly()) // paranoia
2777 current_view->owner()->getMiniBuffer()->Set(_("Inserting figure..."));
2778 if (fl_get_button(fd_form_figure->radio_inline)
2780 || current_view->text->cursor.par()->table
2783 InsetFig * new_inset = new InsetFig(100, 20, buffer);
2784 current_view->insertInset(new_inset);
2785 current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
2786 new_inset->Edit(current_view, 0, 0, 0);
2790 current_view->hideCursor();
2791 current_view->update(BufferView::SELECT|BufferView::FITCUR);
2792 current_view->beforeChange();
2794 current_view->text->SetCursorParUndo(current_view->buffer());
2795 current_view->text->FreezeUndo();
2797 current_view->text->BreakParagraph(current_view);
2798 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2800 if (current_view->text->cursor.par()->Last()) {
2801 current_view->text->CursorLeft(current_view);
2803 current_view->text->BreakParagraph(current_view);
2804 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2807 // The standard layout should always be numer 0;
2808 current_view->text->SetLayout(current_view, 0);
2811 if (current_view->text->cursor.par()->footnoteflag ==
2812 LyXParagraph::NO_FOOTNOTE) {
2814 current_view->text->
2815 SetParagraph(current_view, 0, 0,
2817 VSpace (0.3 * buffer->params.spacing.getValue(),
2820 buffer->params.spacing.getValue(),
2822 LYX_ALIGN_CENTER, string(), 0);
2825 current_view->text->SetParagraph(current_view, 0, 0,
2827 VSpace(VSpace::NONE),
2828 VSpace(VSpace::NONE),
2835 current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
2837 Inset * new_inset = new InsetFig(100, 100, buffer);
2838 current_view->insertInset(new_inset);
2839 new_inset->Edit(current_view, 0, 0, 0);
2840 current_view->update(BufferView::SELECT|BufferView::FITCUR);
2841 current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
2842 current_view->text->UnFreezeUndo();
2843 current_view->setState();
2847 extern "C" void FigureCancelCB(FL_OBJECT *, long)
2849 fl_hide_form(fd_form_figure->form_figure);
2853 extern "C" void FigureOKCB(FL_OBJECT * ob, long data)
2855 FigureApplyCB(ob, data);
2856 FigureCancelCB(ob, data);
2860 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
2862 lyxrc.roman_font_name = fl_get_input(fd_form_screen->input_roman);
2863 lyxrc.sans_font_name = fl_get_input(fd_form_screen->input_sans);
2864 lyxrc.typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
2865 lyxrc.font_norm = fl_get_input(fd_form_screen->input_font_norm);
2866 lyxrc.set_font_norm_type();
2867 lyxrc.zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
2868 fontloader.update();
2870 // Of course we should only to the resize and the textcahce.clear
2871 // if values really changed...but not very important right now. (Lgb)
2873 // All buffers will need resize
2874 bufferlist.resize();
2875 // We also need to empty the textcache so that
2876 // the buffer will be formatted correctly after
2880 current_view->owner()->getMiniBuffer()->Set(_("Screen options set"));
2884 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
2886 fl_hide_form(fd_form_screen->form_screen);
2890 extern "C" void ScreenOKCB(FL_OBJECT * ob, long data)
2892 ScreenCancelCB(ob, data);
2893 ScreenApplyCB(ob, data);
2897 // This function runs "configure" and then rereads lyx.defaults to
2898 // reconfigure the automatic settings.
2899 void Reconfigure(BufferView * bv)
2901 bv->owner()->getMiniBuffer()->Set(_("Running configure..."));
2903 // Run configure in user lyx directory
2904 Path p(user_lyxdir);
2905 Systemcalls one(Systemcalls::System,
2906 AddName(system_lyxdir, "configure"));
2908 bv->owner()->getMiniBuffer()->Set(_("Reloading configuration..."));
2909 lyxrc.read(LibFileSearch(string(), "lyxrc.defaults"));
2910 WriteAlert(_("The system has been reconfigured."),
2911 _("You need to restart LyX to make use of any"),
2912 _("updated document class specifications."));
2917 // Table of Contents
2920 static vector<Buffer::TocItem> toclist;
2923 extern "C" void TocSelectCB(FL_OBJECT * ob, long)
2925 if (!current_view->available())
2929 unsigned int choice = fl_get_browser(ob);
2930 if (0 < choice && choice - 1 < toclist.size()) {
2931 current_view->beforeChange();
2932 current_view->text->SetCursor(current_view, toclist[choice-1].par, 0);
2933 current_view->text->sel_cursor =
2934 current_view->text->cursor;
2935 current_view->update(BufferView::SELECT|BufferView::FITCUR);
2937 WriteAlert(_("Error"),
2938 _("Couldn't find this label"),
2939 _("in current document."));
2944 extern "C" void TocCancelCB(FL_OBJECT *, long)
2946 fl_hide_form(fd_form_toc->form_toc);
2951 void TocUpdateCB(FL_OBJECT *, long)
2953 if (!current_view->available()) {
2955 fl_clear_browser(fd_form_toc->browser_toc);
2956 fl_add_browser_line(fd_form_toc->browser_toc,
2957 _("*** No Document ***"));
2961 vector<vector<Buffer::TocItem> > tmp =
2962 current_view->buffer()->getTocList();
2963 int type = fl_get_choice(fd_form_toc->toctype)-1;
2964 //if (toclist == tmp[type])
2966 if (toclist.size() == tmp[type].size()) {
2967 // Check if all elements are the same.
2969 for (; i < toclist.size(); ++i) {
2970 if (toclist[i] != tmp[type][i])
2973 if (i >= toclist.size()) return;
2976 toclist = tmp[type];
2978 static Buffer * buffer = 0;
2981 if (buffer == current_view->buffer()) {
2982 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
2983 line = fl_get_browser(fd_form_toc->browser_toc);
2985 buffer = current_view->buffer();
2987 fl_clear_browser(fd_form_toc->browser_toc);
2988 fl_hide_object(fd_form_toc->browser_toc);
2990 for (vector<Buffer::TocItem>::const_iterator it = toclist.begin();
2991 it != toclist.end(); ++it)
2992 fl_add_browser_line(fd_form_toc->browser_toc,
2993 (string(4*(*it).depth,' ')+
2994 (*it).str).c_str());
2996 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
2997 fl_select_browser_line(fd_form_toc->browser_toc, line);
2998 fl_show_object(fd_form_toc->browser_toc);
3002 /* callbacks for form form_ref */
3003 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3005 if (!current_view->available())
3009 fl_get_browser_line(fd_form_ref->browser_ref,
3010 fl_get_browser(fd_form_ref->browser_ref));
3011 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3017 current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3018 if (!current_view->NoSavedPositions()) {
3019 fl_activate_object(fd_form_ref->back);
3020 fl_set_object_lcol(fd_form_ref->back, FL_BLACK);
3023 } else if (data >= 6) {
3024 current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFBACK);
3025 if (current_view->NoSavedPositions()) {
3026 fl_deactivate_object(fd_form_ref->back);
3027 fl_set_object_lcol(fd_form_ref->back, FL_INACTIVE);
3032 static string const commands[5]
3033 = { "\\ref", "\\pageref", "\\vref", "\\vpageref",
3035 string t = commands[data];
3037 if (current_view->buffer()->isSGML())
3038 t += "[" + u + "]" + "{" + s + "}";
3043 new InsetRef(t, current_view->buffer());
3044 current_view->insertInset(new_inset);
3048 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3050 if (!current_view->available()) {
3051 fl_clear_browser(fd_form_ref->browser_ref);
3055 FL_OBJECT * brow = fd_form_ref->browser_ref;
3057 // Get the current line, in order to restore it later
3058 char const * const btmp = fl_get_browser_line(brow,
3059 fl_get_browser(brow));
3060 string currentstr = btmp ? btmp : "";
3062 fl_clear_browser(brow);
3063 fl_hide_object(brow);
3065 vector<string> refs = current_view->buffer()->getLabelList();
3066 if (fl_get_button(fd_form_ref->sort))
3067 sort(refs.begin(),refs.end());
3068 for (vector<string>::const_iterator it = refs.begin();
3069 it != refs.end(); ++it)
3070 fl_add_browser_line(brow, (*it).c_str());
3073 int total_lines = fl_get_browser_maxline(brow);
3074 for (int i = 1; i <= total_lines ; ++i) {
3075 if (fl_get_browser_line(brow, i) == currentstr) {
3080 fl_set_browser_topline(brow, topline);
3082 bool empty = refs.empty();
3083 bool sgml = current_view->buffer()->isSGML();
3084 bool readonly = current_view->buffer()->isReadonly();
3086 if (current_view->NoSavedPositions()) {
3087 fl_deactivate_object(fd_form_ref->back);
3088 fl_set_object_lcol(fd_form_ref->back, FL_INACTIVE);
3090 fl_activate_object(fd_form_ref->back);
3091 fl_set_object_lcol(fd_form_ref->back, FL_BLACK);
3095 fl_add_browser_line(brow,
3096 _("*** No labels found in document ***"));
3097 fl_deactivate_object(brow);
3098 fl_deactivate_object(fd_form_ref->gotoref);
3099 fl_set_object_lcol(fd_form_ref->gotoref, FL_INACTIVE);
3101 fl_select_browser_line(brow, topline);
3102 fl_activate_object(brow);
3103 fl_activate_object(fd_form_ref->gotoref);
3104 fl_set_object_lcol(fd_form_ref->gotoref, FL_BLACK);
3107 if (empty || readonly) {
3108 fl_deactivate_object(fd_form_ref->ref);
3109 fl_set_object_lcol(fd_form_ref->ref, FL_INACTIVE);
3110 fl_deactivate_object(fd_form_ref->pageref);
3111 fl_set_object_lcol(fd_form_ref->pageref, FL_INACTIVE);
3113 fl_activate_object(fd_form_ref->ref);
3114 fl_set_object_lcol(fd_form_ref->ref, FL_BLACK);
3115 fl_activate_object(fd_form_ref->pageref);
3116 fl_set_object_lcol(fd_form_ref->pageref, FL_BLACK);
3119 if (empty || readonly || sgml) {
3120 fl_deactivate_object(fd_form_ref->vref);
3121 fl_set_object_lcol(fd_form_ref->vref, FL_INACTIVE);
3122 fl_deactivate_object(fd_form_ref->vpageref);
3123 fl_set_object_lcol(fd_form_ref->vpageref, FL_INACTIVE);
3124 fl_deactivate_object(fd_form_ref->prettyref);
3125 fl_set_object_lcol(fd_form_ref->prettyref, FL_INACTIVE);
3127 fl_activate_object(fd_form_ref->vref);
3128 fl_set_object_lcol(fd_form_ref->vref, FL_BLACK);
3129 fl_activate_object(fd_form_ref->vpageref);
3130 fl_set_object_lcol(fd_form_ref->vpageref, FL_BLACK);
3131 fl_activate_object(fd_form_ref->prettyref);
3132 fl_set_object_lcol(fd_form_ref->prettyref, FL_BLACK);
3136 fl_activate_object(fd_form_ref->ref_name);
3137 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3139 fl_deactivate_object(fd_form_ref->ref_name);
3140 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3143 fl_show_object(brow);
3147 extern "C" void RefHideCB(FL_OBJECT *, long)
3149 fl_hide_form(fd_form_ref->form_ref);