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 "support/lstrings.h"
20 #include FORMS_H_LOCATION
22 #include "layout_forms.h"
23 #include "bullet_forms.h"
24 #include "print_form.h"
26 #include "spellchecker.h"
30 #include "insets/insetref.h"
31 #include "insets/insetquotes.h"
32 #include "insets/insetlabel.h"
33 #include "insets/figinset.h"
35 #include "latexoptions.h"
37 #include "minibuffer.h"
39 #include "bufferlist.h"
40 #include "support/filetools.h"
41 #include "support/path.h"
43 #include "lyx_gui_misc.h"
45 #include "lastfiles.h"
46 #include "support/FileInfo.h"
48 #include "support/syscall.h"
49 #include "support/lyxlib.h"
50 #include "lyxserver.h"
51 #include "FontLoader.h"
57 #include "CutAndPaste.h"
61 using std::back_inserter;
65 using std::istream_iterator;
68 extern Combox * combo_language;
69 extern BufferList bufferlist;
70 extern void show_symbols_form();
71 extern FD_form_title * fd_form_title;
72 extern FD_form_paragraph * fd_form_paragraph;
73 extern FD_form_character * fd_form_character;
74 extern FD_form_document * fd_form_document;
75 extern FD_form_quotes * fd_form_quotes;
76 extern FD_form_preamble * fd_form_preamble;
77 extern FD_form_table * fd_form_table;
78 extern FD_form_print * fd_form_print;
79 extern FD_form_figure * fd_form_figure;
80 extern FD_form_screen * fd_form_screen;
81 extern FD_form_toc * fd_form_toc;
82 extern FD_form_ref * fd_form_ref;
83 extern FD_LaTeXOptions * fd_latex_options;
84 extern FD_form_bullet * fd_form_bullet;
86 extern BufferView * current_view; // called too many times in this file...
88 extern void DeleteSimpleCutBuffer(); /* for the cleanup when exiting */
90 extern bool send_fax(string const & fname, string const & sendcmd);
91 extern void MenuSendto();
93 extern LyXServer * lyxserver;
95 // this should be static, but I need it in buffer.C
96 bool quitting; // flag, that we are quitting the program
97 extern bool finished; // all cleanup done just let it run through now.
99 char ascii_type; /* for selection notify callbacks */
101 bool scrolling = false;
103 char updatetimer = 0;
105 /* whether the work area should get callbacks */
106 bool input_prohibited = false;
108 /* the selection possible is needed, that only motion events are
109 * used, where the bottom press event was on the drawing area too */
110 bool selection_possible = false;
112 // This is used to make the dreaded font toggle problem hopefully go
113 // away. Definitely not the best solution, but I think it sorta works.
114 bool toggleall = true;
117 This is the inset locking stuff needed for mathed --------------------
119 an inset can simple call LockInset in it's edit call and *ONLY* in it's
121 Inset::Edit() can only be called by the main lyx module.
123 Then the inset may modify the menu's and/or iconbars.
125 Unlocking is either done by LyX or the inset itself with a UnlockInset-call
127 During the lock, all button and keyboard events will be modified
128 and send to the inset through the following inset-features. Note that
129 Inset::InsetUnlock will be called from inside UnlockInset. It is meant
130 to contain the code for restoring the menus and things like this.
133 virtual void InsetButtonPress(int x, int y, int button);
134 virtual void InsetButtonRelease(int x, int y, int button);
135 virtual void InsetKeyPress(XKeyEvent *ev);
136 virtual void InsetMotionNotify(int x, int y, int state);
137 virtual void InsetUnlock();
139 If a inset wishes any redraw and/or update it just has to call
141 It's is completly irrelevant, where the inset is. UpdateInset will
142 find it in any paragraph in any buffer.
143 Of course the_locking_inset and the insets in the current paragraph/buffer
144 are checked first, so no performance problem should occur.
146 Hope that's ok for the beginning, Alejandro,
147 sorry that I needed so much time,
152 //void UpdateInset(BufferView * bv, Inset * inset, bool mark_dirty = true);
154 /* these functions return 1 if an error occured,
156 // Now they work only for updatable insets. [Alejandro 080596]
157 //int LockInset(UpdatableInset * inset);
158 void ToggleLockedInsetCursor(long x, long y, int asc, int desc);
159 //void FitLockedInsetCursor(long x, long y, int asc, int desc);
160 //int UnlockInset(UpdatableInset * inset);
161 //void LockedInsetStoreUndo(Undo::undo_kind kind);
163 /* this is for asyncron updating. UpdateInsetUpdateList will be called
164 automatically from LyX. Just insert the Inset into the Updatelist */
165 //void UpdateInsetUpdateList();
166 //void PutInsetIntoInsetUpdateList(Inset * inset);
168 //InsetUpdateStruct * InsetUpdateList = 0;
172 -----------------------------------------------------------------------
175 /* some function prototypes */
177 int RunLinuxDoc(BufferView *, int, string const &);
178 int RunDocBook(int, string const &);
179 void MenuWrite(Buffer * buf);
180 void MenuWriteAs(Buffer * buffer);
181 void MenuReload(Buffer * buf);
182 void MenuLayoutSave();
185 void ShowMessage(Buffer * buf,
187 string const & msg2 = string(),
188 string const & msg3 = string(), int delay = 6)
191 buf->getUser()->owner()->getMiniBuffer()->Set(msg1, msg2,
194 // can somebody think of something more clever? cerr?
195 cout << msg1 << msg2 << msg3 << endl;
199 // How should this actually work? Should it prohibit input in all BufferViews,
200 // or just in the current one? If "just the current one", then it should be
201 // placed in BufferView. If "all BufferViews" then LyXGUI (I think) should
202 // run "ProhibitInput" on all LyXViews which will run prohibitInput on all
203 // BufferViews. Or is it perhaps just the (input in) BufferViews in the
204 // current LyxView that should be prohibited (Lgb) (This applies to
205 // "AllowInput" as well.)
208 input_prohibited = true;
209 current_view->hideCursor();
211 static Cursor cursor;
212 static bool cursor_undefined = true;
214 if (cursor_undefined){
215 cursor = XCreateFontCursor(fl_display, XC_watch);
217 cursor_undefined = false;
220 /* set the cursor to the watch for all forms and the canvas */
221 XDefineCursor(fl_display, current_view->owner()->getForm()->window,
223 if (fd_form_paragraph->form_paragraph->visible)
224 XDefineCursor(fl_display,
225 fd_form_paragraph->form_paragraph->window,
227 if (fd_form_character->form_character->visible)
228 XDefineCursor(fl_display,
229 fd_form_character->form_character->window,
233 fl_deactivate_all_forms();
237 // Should find a way to move this into BufferView.C
238 void SetXtermCursor(Window win)
240 static Cursor cursor;
241 static bool cursor_undefined = true;
242 if (cursor_undefined){
243 cursor = XCreateFontCursor(fl_display, XC_xterm);
245 cursor_undefined = false;
247 XDefineCursor(fl_display, win, cursor);
254 input_prohibited = false;
256 /* reset the cursor from the watch for all forms and the canvas */
258 XUndefineCursor(fl_display, current_view->owner()->getForm()->window);
259 if (fd_form_paragraph->form_paragraph->visible)
260 XUndefineCursor(fl_display,
261 fd_form_paragraph->form_paragraph->window);
262 if (fd_form_character->form_character->visible)
263 XUndefineCursor(fl_display,
264 fd_form_character->form_character->window);
266 // What to do about this? (Lgb)
267 if (current_view->belowMouse())
268 SetXtermCursor(current_view->owner()->getForm()->window);
271 fl_activate_all_forms();
275 void FreeUpdateTimer()
277 /* a real free timer would be better but I don't know
278 * how to do this with xforms */
283 void SetUpdateTimer(float time)
285 fl_set_timer(current_view->owner()->getMainForm()->timer_update, time);
298 // should be moved to lyxfunc.C
299 void MenuWrite(Buffer * buffer)
302 if (!buffer->save()) {
303 string fname = buffer->fileName();
304 string s = MakeAbsPath(fname);
305 if (AskQuestion(_("Save failed. Rename and try again?"),
306 MakeDisplayPath(s, 50),
307 _("(If not, document is not saved.)"))) {
311 lastfiles->newFile(buffer->fileName());
316 // should be moved to BufferView.C
317 // Half of this func should be in LyXView, the rest in BufferView.
318 void MenuWriteAs(Buffer * buffer)
320 // Why do we require BufferView::text to be able to write a
321 // document? I see no point in that. (Lgb)
322 //if (!bv->text) return;
324 string fname = buffer->fileName();
325 string oldname = fname;
329 fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
330 fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
332 if (!IsLyXFilename(fname))
335 fname = fileDlg.Select(_("Enter Filename to Save Document as"),
338 OnlyFilename(fname));
344 // Make sure the absolute filename ends with appropriate suffix
345 string s = MakeAbsPath(fname);
346 if (!IsLyXFilename(s))
349 // Same name as we have already?
351 if (!AskQuestion(_("Same name as document already has:"),
352 MakeDisplayPath(s, 50),
355 // Falls through to name change and save
357 // No, but do we have another file with this name open?
358 else if (bufferlist.exists(s)) {
359 if (AskQuestion(_("Another document with same name open!"),
360 MakeDisplayPath(s, 50),
361 _("Replace with current document?")))
363 bufferlist.close(bufferlist.getBuffer(s));
365 // Ok, change the name of the buffer, but don't save!
369 ShowMessage(buffer, _("Document renamed to '"),
370 MakeDisplayPath(s), _("', but not saved..."));
373 } // Check whether the file exists
376 if (myfile.isOK() && !AskQuestion(_("Document already exists:"),
377 MakeDisplayPath(s, 50),
382 // Ok, change the name of the buffer
386 // Small bug: If the save fails, we have irreversible changed the name
392 int MenuRunLaTeX(Buffer * buffer)
396 if (buffer->isLinuxDoc())
397 ret = RunLinuxDoc(buffer->getUser(), 1, buffer->fileName());
398 else if (buffer->isLiterate())
399 ret = buffer->runLiterate();
400 else if (buffer->isDocBook())
401 ret = RunDocBook(1, buffer->fileName());
403 ret = buffer->runLaTeX();
409 s = _("One error detected");
410 t = _("You should try to fix it.");
413 s += _(" errors detected.");
414 t = _("You should try to fix them.");
416 WriteAlert(_("There were errors during the LaTeX run."), s, t);
422 int MenuBuildProg(Buffer * buffer)
426 if (buffer->isLiterate())
427 ret = buffer->buildProgram();
429 string s = _("Wrong type of document");
430 string t = _("The Build operation is not allowed in this document");
431 WriteAlert(_("There were errors during the Build process."), s, t);
439 s = _("One error detected");
440 t = _("You should try to fix it.");
443 s += _(" errors detected.");
444 t = _("You should try to fix them.");
446 WriteAlert(_("There were errors during the Build process."), s, t);
452 int MenuRunChktex(Buffer * buffer)
456 if (buffer->isSGML()) {
457 WriteAlert(_("Chktex does not work with SGML derived documents."));
460 ret = buffer->runChktex();
466 s = _("No warnings found.");
467 } else if (ret == 1) {
468 s = _("One warning found.");
469 t = _("Use 'Edit->Go to Error' to find it.");
472 s += _(" warnings found.");
473 t = _("Use 'Edit->Go to Error' to find them.");
475 WriteAlert(_("Chktex run successfully"), s, t);
477 WriteAlert(_("Error!"), _("It seems chktex does not work."));
483 int MakeLaTeXOutput(Buffer * buffer)
489 string path = OnlyPath(buffer->fileName());
490 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
491 path = buffer->tmppath;
493 if (!buffer->isDviClean()) {
495 ret = MenuRunLaTeX(buffer);
501 /* wait == false means don't wait for termination */
502 /* wait == true means wait for termination */
503 // The bool should be placed last on the argument line. (Lgb)
504 // Returns false if we fail.
505 bool RunScript(Buffer * buffer, bool wait,
506 string const & command,
507 string const & orgname = string(),
508 bool need_shell = true)
512 string name = orgname;
515 if (MakeLaTeXOutput(buffer) > 0)
517 /* get DVI-Filename */
519 name = ChangeExtension(buffer->getLatexName(),
522 path = OnlyPath(name);
523 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
524 path = buffer->tmppath;
527 // At this point we check whether the command contains the
528 // filename parameter $$FName and if that's the case we
529 // substitute the real file name otherwise the filename is
530 // simply appended. rokrau 1/12/00
533 if ( (i=command.find("$$FName")) != string::npos)
535 cmd.replace(i,7,QuoteName(name));
538 cmd = command + ' ' + QuoteName(name);
547 // OS/2 cmd.exe has another use for '&'
549 // This is not NLS safe, but it's OK, I think.
550 string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
552 // COMSPEC is set, unless user unsets
553 sh = OnlyFilename(GetEnvPath("COMSPEC"));
558 if (contains(sh, "cmd.exe")
559 || contains(sh, "4os2.exe"))
560 cmd = "start /min/n " + cmd;
565 // It seems that, if wait is false, we never get back
566 // the return code of the command. This means that all
567 // the code I added in PrintApplyCB is currently
570 #warning What should we do here?
572 ShowMessage(buffer, _("Executing command:"), cmd);
573 result = one.startscript(Systemcalls::System, cmd);
575 ShowMessage(buffer, _("Executing command:"), cmd);
576 result = one.startscript(wait ? Systemcalls::Wait
577 : Systemcalls::DontWait, cmd);
583 // Returns false if we fail
584 bool CreatePostscript(Buffer * buffer, bool wait = false)
593 if (MakeLaTeXOutput(buffer) > 0) {
597 // Generate postscript file
598 string psname = ChangeExtension (buffer->fileName(),
604 char real_papersize = buffer->params.papersize;
605 if (real_papersize == BufferParams::PAPER_DEFAULT)
606 real_papersize = lyxrc.default_papersize;
608 switch (real_papersize) {
609 case BufferParams::PAPER_USLETTER:
612 case BufferParams::PAPER_A3PAPER:
615 case BufferParams::PAPER_A4PAPER:
618 case BufferParams::PAPER_A5PAPER:
621 case BufferParams::PAPER_B5PAPER:
624 case BufferParams::PAPER_EXECUTIVEPAPER:
627 case BufferParams::PAPER_LEGALPAPER:
630 default: /* If nothing else fits, keep an empty value... */
634 // Make postscript file.
635 string command = lyxrc.dvi_to_ps_command + ' ' + lyxrc.print_to_file + ' ';
636 command += QuoteName(psname);
637 if (buffer->params.use_geometry
638 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
639 && !lyxrc.print_paper_dimension_flag.empty()
640 && !buffer->params.paperwidth.empty()
641 && !buffer->params.paperheight.empty()) {
642 // using a custom papersize
644 command += lyxrc.print_paper_dimension_flag + ' ';
645 command += buffer->params.paperwidth + ',';
646 command += buffer->params.paperheight;
647 } else if (!paper.empty()
648 && (real_papersize != BufferParams::PAPER_USLETTER ||
649 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
650 // dvips won't accept -t letter -t landscape. In all other
651 // cases, include the paper size explicitly.
653 command += lyxrc.print_paper_flag + ' ' + paper;
655 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE) {
657 command += lyxrc.print_landscape_flag;
659 // push directorypath, if necessary
660 string path = OnlyPath(buffer->fileName());
661 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
662 path = buffer->tmppath;
665 bool ret = RunScript(buffer, wait, command);
671 // Returns false if we fail
672 //bool MenuPreviewPS(Buffer * buffer)
673 bool PreviewPostscript(Buffer * buffer)
679 // Generate postscript file
680 if (!CreatePostscript(buffer, true)) {
684 // Start postscript viewer
686 string ps = ChangeExtension (buffer->fileName(),
688 // push directorypath, if necessary
689 string path = OnlyPath(buffer->fileName());
690 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
691 path = buffer->tmppath;
694 bool ret = RunScript(buffer, false, lyxrc.view_ps_command, ps);
700 void MenuFax(Buffer * buffer)
706 // Generate postscript file
707 if (!CreatePostscript(buffer, true)) {
712 string ps = ChangeExtension (buffer->fileName(), ".ps_tmp", true);
713 string path = OnlyPath (buffer->fileName());
714 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
715 path = buffer->tmppath;
718 if (!lyxrc.fax_program.empty()) {
719 string help2 = subst(lyxrc.fax_program, "$$FName", ps);
721 Systemcalls one(Systemcalls::System, help2);
723 send_fax(ps, lyxrc.fax_command);
727 // Returns false if we fail
728 bool PreviewDVI(Buffer * buffer)
734 string paper = lyxrc.view_dvi_paper_option;
735 if (!paper.empty()) {
737 char real_papersize = buffer->params.papersize;
738 if (real_papersize == BufferParams::PAPER_DEFAULT)
739 real_papersize = lyxrc.default_papersize;
741 switch (real_papersize) {
742 case BufferParams::PAPER_USLETTER:
745 case BufferParams::PAPER_A3PAPER:
748 case BufferParams::PAPER_A4PAPER:
751 case BufferParams::PAPER_A5PAPER:
754 case BufferParams::PAPER_B5PAPER:
757 case BufferParams::PAPER_EXECUTIVEPAPER:
758 paper += " foolscap";
760 case BufferParams::PAPER_LEGALPAPER:
763 default: /* If nothing else fits, keep the empty value */
766 if (real_papersize==' ') {
767 // if (paper.empty()) {
768 if (buffer->params.orientation
769 == BufferParams::ORIENTATION_LANDSCAPE)
770 // we HAVE to give a size when the page is in
771 // landscape, so use USletter.
772 paper = " -paper usr";
774 // paper = " -paper " + paper;
775 if (buffer->params.orientation
776 == BufferParams::ORIENTATION_LANDSCAPE)
780 // push directorypath, if necessary
781 string path = OnlyPath(buffer->fileName());
782 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
783 path = buffer->tmppath;
787 string command = lyxrc.view_dvi_command + " " + paper;
788 bool ret = RunScript(buffer, false, command);
793 bool AskOverwrite(Buffer * buffer, string const & s)
796 // be friendly if there is a gui
799 !AskQuestion(_("File already exists:"),
800 MakeDisplayPath(s, 50),
801 _("Do you want to overwrite the file?"))) {
802 ShowMessage(buffer, _("Canceled"));
809 void MenuMakeLaTeX(Buffer * buffer)
811 // Why care about this?
815 // Get LaTeX-Filename
816 string s = buffer->getLatexName(false);
818 if (!AskOverwrite(buffer, s))
821 if (buffer->isDocBook())
822 ShowMessage(buffer, _("DocBook does not have a latex backend"));
824 if (buffer->isLinuxDoc())
825 RunLinuxDoc(buffer->getUser(), 0, buffer->fileName());
827 buffer->makeLaTeXFile(s, string(), true);
828 ShowMessage(buffer, _("Nice LaTeX file saved as"),
830 buffer->markDviDirty();
835 void MenuMakeLinuxDoc(Buffer * buffer)
838 //if (!bv->text) return;
840 if (!buffer->isLinuxDoc()) {
841 WriteAlert(_("Error!"), _("Document class must be linuxdoc."));
845 // Get LinuxDoc-Filename
846 string s = ChangeExtension(buffer->fileName(),
849 if (!AskOverwrite(buffer, s))
852 ShowMessage(buffer, _("Building LinuxDoc SGML file `"),
853 MakeDisplayPath(s),"'...");
855 buffer->makeLinuxDocFile(s, 65);
857 ShowMessage(buffer, _("LinuxDoc SGML file save as"),
862 void MenuMakeDocBook(Buffer * buffer)
865 //if (!bv->text) return;
867 if (!buffer->isDocBook()) {
868 WriteAlert(_("Error!"),
869 _("Document class must be docbook."));
873 // Get DocBook-Filename
874 string s = ChangeExtension(buffer->fileName(),
877 if (!AskOverwrite(buffer, s))
880 ShowMessage(buffer, _("Building DocBook SGML file `"),
881 MakeDisplayPath(s), "'...");
883 buffer->makeDocBookFile(s, 65);
885 ShowMessage(buffer, _("DocBook SGML file save as"),
890 void MenuMakeAscii(Buffer * buffer)
893 //if (!bv->text) return;
895 /* get LaTeX-Filename */
896 string s = ChangeExtension (buffer->fileName(),
900 if (!AskOverwrite(buffer, s))
903 buffer->writeFileAscii(s, lyxrc.ascii_linelen);
905 ShowMessage(buffer, _("Ascii file saved as"), MakeDisplayPath(s));
909 void MenuPrint(Buffer * buffer)
915 string input_file = ChangeExtension(buffer->fileName(),
916 lyxrc.print_file_extension,
918 fl_set_input(fd_form_print->input_file, input_file.c_str());
920 if (fd_form_print->form_print->visible) {
921 fl_raise_form(fd_form_print->form_print);
924 fl_show_form(fd_form_print->form_print,
925 FL_PLACE_MOUSE, FL_FULLBORDER,
930 void MenuMakeHTML(Buffer * buffer)
932 // First, create LaTeX file
933 MenuMakeLaTeX(buffer);
935 // And now, run the converter
936 string file = buffer->fileName();
937 Path path(OnlyPath(file));
938 // the tex file name has to be correct for
939 // latex, but the html file name can be
941 string result = ChangeExtension(file, ".html", false);
942 string infile = buffer->getLatexName(false);
943 string tmp = lyxrc.html_command;
944 tmp = subst(tmp, "$$FName", infile);
945 tmp = subst(tmp, "$$OutName", result);
947 int res = one.startscript(Systemcalls::System, tmp);
949 ShowMessage(buffer, _("Document exported as HTML to file `")
950 + MakeDisplayPath(result) +'\'');
952 ShowMessage(buffer, _("Unable to convert to HTML the file `")
953 + MakeDisplayPath(infile)
959 void MenuMakeHTML_LinuxDoc(Buffer * buffer)
961 // First, create LinuxDoc file
962 MenuMakeLinuxDoc(buffer);
964 // And now, run the converter
965 string file = buffer->fileName();
967 string result = ChangeExtension(file, ".html", false);
968 string infile = ChangeExtension(file, ".sgml", false);
969 string tmp = lyxrc.linuxdoc_to_html_command;
970 tmp = subst(tmp, "$$FName", infile);
971 tmp = subst(tmp, "$$OutName", result);
973 int res = one.startscript(Systemcalls::System, tmp);
975 ShowMessage(buffer,_("Document exported as HTML to file `")
976 + MakeDisplayPath(result) +'\'');
978 ShowMessage(buffer,_("Unable to convert to HTML the file `")
979 + MakeDisplayPath(infile)
985 void MenuMakeHTML_DocBook(Buffer * buffer)
987 // First, create LaTeX file
988 MenuMakeDocBook(buffer);
990 // And now, run the converter
991 string file = buffer->fileName();
992 string result = ChangeExtension(file, ".html", false);
993 string infile = ChangeExtension(file, ".sgml", false);
994 string tmp = lyxrc.docbook_to_html_command;
995 tmp = subst(tmp, "$$FName", infile);
996 tmp = subst(tmp, "$$OutName", result);
998 int res = one.startscript(Systemcalls::System, tmp);
1000 ShowMessage(buffer,_("Document exported as HTML to file `")
1001 + MakeDisplayPath(result) +'\'');
1003 ShowMessage(buffer,_("Unable to convert to HTML the file `")
1004 + MakeDisplayPath(infile)
1010 void MenuExport(Buffer * buffer, string const & extyp)
1013 if (extyp == "latex") {
1014 // make sure that this buffer is not linuxdoc
1015 MenuMakeLaTeX(buffer);
1018 else if (extyp == "linuxdoc") {
1019 // make sure that this buffer is not latex
1020 MenuMakeLinuxDoc(buffer);
1023 else if (extyp == "docbook") {
1024 // make sure that this buffer is not latex or linuxdoc
1025 MenuMakeDocBook(buffer);
1028 else if (extyp == "dvi") {
1029 // Run LaTeX as "Update dvi..." Bernhard.
1030 // We want the dvi in the current directory. This
1031 // is achieved by temporarily disabling use of
1032 // temp directory. As a side-effect, we get
1033 // *.log and *.aux files also. (Asger)
1034 bool flag = lyxrc.use_tempdir;
1035 lyxrc.use_tempdir = false;
1036 MenuRunLaTeX(buffer);
1037 lyxrc.use_tempdir = flag;
1040 else if (extyp == "postscript") {
1041 // Start Print-dialog. Not as good as dvi... Bernhard.
1043 // Since the MenuPrint is a pop-up, we can't use
1044 // the same trick as above. (Asger)
1045 // MISSING: Move of ps-file :-(
1046 // And MenuPrint should not be used for this at all...
1049 else if (extyp == "ascii") {
1050 MenuMakeAscii(buffer);
1052 else if (extyp == "custom") {
1056 else if (extyp == "html") {
1057 MenuMakeHTML(buffer);
1059 // HTML from linuxdoc
1060 else if (extyp == "html-linuxdoc") {
1061 MenuMakeHTML_LinuxDoc(buffer);
1063 // HTML from docbook
1064 else if (extyp == "html-docbook") {
1065 MenuMakeHTML_DocBook(buffer);
1068 ShowMessage(buffer, _("Unknown export type: ") + extyp);
1075 lyxerr.debug() << "Running QuitLyX." << endl;
1077 if (!bufferlist.QwriteAll())
1080 lastfiles->writeFile(lyxrc.lastfiles);
1082 // Set a flag that we do quitting from the program,
1083 // so no refreshes are necessary.
1086 // close buffers first
1087 bufferlist.closeAll();
1089 // do any other cleanup procedures now
1090 lyxerr.debug() << "Deleting tmp dir " << system_tempdir << endl;
1092 DestroyLyXTmpDir(system_tempdir);
1100 // should probably be moved into BufferList (Lgb)
1101 // Perfect target for a thread...
1103 if (!current_view->available())
1106 if (current_view->buffer()->isBakClean()
1107 || current_view->buffer()->isReadonly()) {
1108 // We don't save now, but we'll try again later
1109 current_view->owner()->resetAutosaveTimer();
1113 current_view->owner()->getMiniBuffer()->Set(_("Autosaving current document..."));
1115 // create autosave filename
1116 string fname = OnlyPath(current_view->buffer()->fileName());
1118 fname += OnlyFilename(current_view->buffer()->fileName());
1121 // tmp_ret will be located (usually) in /tmp
1122 // will that be a problem?
1123 string tmp_ret = tmpnam(0);
1125 pid_t pid = fork(); // If you want to debug the autosave
1126 // you should set pid to -1, and comment out the
1128 if (pid == 0 || pid == -1) {
1129 // pid = -1 signifies that lyx was unable
1130 // to fork. But we will do the save
1132 bool failed = false;
1133 if (!tmp_ret.empty()) {
1134 current_view->buffer()->writeFile(tmp_ret, 1);
1135 // assume successful write of tmp_ret
1136 if (rename(tmp_ret.c_str(), fname.c_str()) == -1) {
1138 // most likely couldn't move between filesystems
1139 // unless write of tmp_ret failed
1140 // so remove tmp file (if it exists)
1141 remove(tmp_ret.c_str());
1148 // failed to write/rename tmp_ret so try writing direct
1149 if (!current_view->buffer()->writeFile(fname, 1)) {
1150 // It is dangerous to do this in the child,
1151 // but safe in the parent, so...
1153 current_view->owner()->getMiniBuffer()->Set(_("Autosave Failed!"));
1156 if (pid == 0) { // we are the child so...
1161 current_view->buffer()->markBakClean();
1162 current_view->owner()->resetAutosaveTimer();
1167 // Copyright CHT Software Service GmbH
1170 // create new file with template
1173 Buffer * NewLyxFile(string const & filename)
1175 // Split argument by :
1177 string tmpname = split(filename, name, ':');
1178 #ifdef __EMX__ // Fix me! lyx_cb.C may not be low level enough to allow this.
1179 if (name.length() == 1
1180 && isalpha(static_cast<unsigned char>(name[0]))
1181 && (prefixIs(tmpname, "/") || prefixIs(tmpname, "\\"))) {
1183 name += token(tmpname, ':', 0);
1184 tmpname = split(tmpname, ':');
1187 lyxerr.debug() << "Arg is " << filename
1188 << "\nName is " << name
1189 << "\nTemplate is " << tmpname << endl;
1191 // find a free buffer
1192 Buffer * tmpbuf = bufferlist.newFile(name, tmpname);
1194 lastfiles->newFile(tmpbuf->fileName());
1199 // Insert ascii file (if filename is empty, prompt for one)
1200 void InsertAsciiFile(BufferView * bv, string const & f, bool asParagraph)
1205 if (!bv->available()) return;
1207 if (fname.empty()) {
1209 fname = fileDlg.Select(_("File to Insert"),
1210 bv->owner()->buffer()->filepath,
1213 if (fname.empty()) return;
1218 if (!fi.readable()) {
1219 WriteFSAlert(_("Error! Specified file is unreadable: "),
1220 MakeDisplayPath(fname, 50));
1224 ifstream ifs(fname.c_str());
1226 WriteFSAlert(_("Error! Cannot open specified file: "),
1227 MakeDisplayPath(fname, 50));
1231 ifs.unsetf(ios::skipws);
1232 istream_iterator<char> ii(ifs);
1233 istream_iterator<char> end;
1234 //string tmpstr(ii, end); // yet a reason for using std::string
1235 // alternate approach to get the file into a string:
1237 copy(ii, end, back_inserter(tmpstr));
1238 // insert the string
1239 current_view->hideCursor();
1241 // clear the selection
1244 bv->text->InsertStringA(tmpstr);
1246 bv->text->InsertStringB(tmpstr);
1251 void MenuShowTableOfContents()
1253 static int ow = -1, oh;
1256 if (fd_form_toc->form_toc->visible) {
1257 fl_raise_form(fd_form_toc->form_toc);
1259 fl_show_form(fd_form_toc->form_toc,
1260 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1261 _("Table Of Contents"));
1263 ow = fd_form_toc->form_toc->w;
1264 oh = fd_form_toc->form_toc->h;
1266 fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
1271 void MenuInsertLabel(char const * arg)
1275 if (label.empty()) {
1277 result = askForText(_("Enter new label to insert:"));
1279 label = frontStrip(strip(result.second));
1282 if (!label.empty()) {
1283 InsetLabel * new_inset = new InsetLabel;
1284 new_inset->setContents(label);
1285 current_view->insertInset(new_inset);
1291 void MenuInsertRef()
1293 static int ow = -1, oh;
1296 if (fd_form_ref->form_ref->visible) {
1297 fl_raise_form(fd_form_ref->form_ref);
1299 fl_show_form(fd_form_ref->form_ref,
1300 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1301 _("Insert Reference"));
1303 ow = fd_form_ref->form_ref->w;
1304 oh = fd_form_ref->form_ref->h;
1306 fl_set_form_minsize(fd_form_ref->form_ref, ow, oh);
1311 void MenuPasteSelection(char at)
1313 if (!current_view->available())
1318 Atom data_prop = XInternAtom(fl_display,
1321 if (data_prop == None)
1323 XConvertSelection(fl_display,
1324 XA_PRIMARY, XA_STRING, data_prop,
1325 current_view->owner()->getForm()->window, 0);
1330 // candidate for move to BufferView
1331 void Foot(BufferView * bv)
1333 if (!bv->available())
1336 bv->owner()->getMiniBuffer()
1337 ->Set(_("Inserting Footnote..."));
1340 bv->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1345 // candidate for move to LyXView
1346 // This is only used in toolbar.C
1347 void LayoutsCB(int sel, void *)
1349 string tmp = tostr(sel);
1350 current_view->owner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1356 * SGML Linuxdoc support:
1357 * (flag == 0) make TeX output
1358 * (flag == 1) make dvi output
1360 int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
1367 /* generate a path-less extension name */
1368 string name = ChangeExtension (filename, ".sgml", true);
1369 string path = OnlyPath (filename);
1370 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
1371 path = bv->buffer()->tmppath;
1375 if (!bv->available())
1377 bv->buffer()->makeLinuxDocFile(name, 0);
1378 #ifdef WITH_WARNINGS
1379 #warning remove this once we have a proper geometry class
1381 BufferParams::PAPER_SIZE ps = static_cast<BufferParams::PAPER_SIZE>(bv->buffer()->params.papersize);
1383 case BufferParams::PAPER_A4PAPER:
1384 add_flags = "-p a4";
1386 case BufferParams::PAPER_USLETTER:
1387 add_flags = "-p letter";
1389 default: /* nothing to be done yet ;-) */ break;
1396 case 0: /* TeX output asked */
1397 bv->owner()->getMiniBuffer()->Set(_("Converting LinuxDoc SGML to TeX file..."));
1398 s2 = lyxrc.linuxdoc_to_latex_command + ' ' + add_flags + " -o tex " + ' ' + name;
1399 if (one.startscript(Systemcalls::System, s2))
1402 case 1: /* dvi output asked */
1403 bv->owner()->getMiniBuffer()->Set(_("Converting LinuxDoc SGML to dvi file..."));
1404 s2 = lyxrc.linuxdoc_to_latex_command + ' ' + add_flags + " -o dvi " + ' ' + name;
1405 if (one.startscript(Systemcalls::System, s2)) {
1408 bv->buffer()->markDviClean();
1410 default: /* unknown output */
1416 bv->buffer()->redraw();
1422 * SGML DocBook support:
1423 * (flag == 1) make dvi output
1425 int RunDocBook(int flag, string const & filename)
1427 /* generate a path-less extension name */
1428 string name = ChangeExtension (filename, ".sgml", true);
1429 string path = OnlyPath (filename);
1430 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
1431 path = current_view->buffer()->tmppath;
1435 if (!current_view->available())
1438 current_view->buffer()->makeDocBookFile(name, 0);
1440 // Shall this code go or should it stay? (Lgb)
1441 // This code is a placeholder for future implementation. (Jose')
1442 // string add_flags;
1443 // LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->buffer()->params.papersize;
1445 // case BufferParams::PAPER_A4PAPER: add_flags = "-p a4"; break;
1446 // case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
1447 // default: /* nothing to be done yet ;-) */ break;
1454 case 1: /* dvi output asked */
1456 current_view->owner()->getMiniBuffer()->Set(_("Converting DocBook SGML to dvi file..."));
1457 string s2 = lyxrc.docbook_to_dvi_command + ' ' + name;
1458 if (one.startscript(Systemcalls::System, s2)) {
1461 current_view->buffer()->markDviClean();
1464 default: /* unknown output */
1470 current_view->buffer()->redraw();
1475 void MenuLayoutCharacter()
1477 static int ow = -1, oh;
1479 if (fd_form_character->form_character->visible) {
1480 fl_raise_form(fd_form_character->form_character);
1482 fl_show_form(fd_form_character->form_character,
1483 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1484 _("Character Style"));
1486 ow = fd_form_character->form_character->w;
1487 oh = fd_form_character->form_character->h;
1489 fl_set_form_minsize(fd_form_character->form_character, ow, oh);
1495 void DeactivateParagraphButtons ()
1497 fl_deactivate_object (fd_form_paragraph->button_ok);
1498 fl_deactivate_object (fd_form_paragraph->button_apply);
1499 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1500 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1505 void ActivateParagraphButtons ()
1507 fl_activate_object (fd_form_paragraph->button_ok);
1508 fl_activate_object (fd_form_paragraph->button_apply);
1509 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1510 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1515 void DisableParagraphLayout ()
1517 DeactivateParagraphButtons();
1518 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1519 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1520 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1521 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1522 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1523 fl_deactivate_object (fd_form_paragraph->check_noindent);
1524 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1525 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1526 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1527 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1528 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1529 fl_deactivate_object (fd_form_paragraph->input_space_above);
1530 fl_deactivate_object (fd_form_paragraph->input_space_below);
1531 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1532 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1533 fl_deactivate_object (fd_form_paragraph->check_space_above);
1534 fl_deactivate_object (fd_form_paragraph->check_space_below);
1539 void EnableParagraphLayout ()
1541 ActivateParagraphButtons();
1542 fl_activate_object (fd_form_paragraph->input_labelwidth);
1543 fl_activate_object (fd_form_paragraph->check_lines_top);
1544 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1545 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1546 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1547 fl_activate_object (fd_form_paragraph->check_noindent);
1548 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1549 fl_activate_object (fd_form_paragraph->radio_align_right);
1550 fl_activate_object (fd_form_paragraph->radio_align_left);
1551 fl_activate_object (fd_form_paragraph->radio_align_block);
1552 fl_activate_object (fd_form_paragraph->radio_align_center);
1553 fl_activate_object (fd_form_paragraph->input_space_above);
1554 fl_activate_object (fd_form_paragraph->input_space_below);
1555 fl_activate_object (fd_form_paragraph->choice_space_above);
1556 fl_activate_object (fd_form_paragraph->choice_space_below);
1557 fl_activate_object (fd_form_paragraph->check_space_above);
1558 fl_activate_object (fd_form_paragraph->check_space_below);
1562 bool UpdateLayoutParagraph()
1564 if (!current_view->available()) {
1565 if (fd_form_paragraph->form_paragraph->visible)
1566 fl_hide_form(fd_form_paragraph->form_paragraph);
1570 Buffer * buf = current_view->buffer();
1572 fl_set_input(fd_form_paragraph->input_labelwidth,
1573 current_view->text->cursor.par->GetLabelWidthString().c_str());
1574 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1575 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1576 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1577 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1579 int align = current_view->text->cursor.par->GetAlign();
1580 if (align == LYX_ALIGN_LAYOUT)
1581 align = textclasslist.Style(buf->params.textclass,
1582 current_view->text->cursor.par->GetLayout()).align;
1585 case LYX_ALIGN_RIGHT:
1586 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1588 case LYX_ALIGN_LEFT:
1589 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1591 case LYX_ALIGN_CENTER:
1592 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1595 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1599 fl_set_button(fd_form_paragraph->check_lines_top,
1600 current_view->text->cursor.par->FirstPhysicalPar()->line_top);
1601 fl_set_button(fd_form_paragraph->check_lines_bottom,
1602 current_view->text->cursor.par->FirstPhysicalPar()->line_bottom);
1603 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1604 current_view->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1605 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1606 current_view->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1607 fl_set_button(fd_form_paragraph->check_noindent,
1608 current_view->text->cursor.par->FirstPhysicalPar()->noindent);
1609 fl_set_input (fd_form_paragraph->input_space_above, "");
1611 switch (current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1613 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
1615 case VSpace::DEFSKIP:
1616 fl_set_choice (fd_form_paragraph->choice_space_above, 2);
1618 case VSpace::SMALLSKIP:
1619 fl_set_choice (fd_form_paragraph->choice_space_above, 3);
1621 case VSpace::MEDSKIP:
1622 fl_set_choice (fd_form_paragraph->choice_space_above, 4);
1624 case VSpace::BIGSKIP:
1625 fl_set_choice (fd_form_paragraph->choice_space_above, 5);
1628 fl_set_choice (fd_form_paragraph->choice_space_above, 6);
1630 case VSpace::LENGTH:
1631 fl_set_choice (fd_form_paragraph->choice_space_above, 7);
1632 fl_set_input (fd_form_paragraph->input_space_above,
1633 current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1636 fl_set_button (fd_form_paragraph->check_space_above,
1637 current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1638 fl_set_input (fd_form_paragraph->input_space_below, "");
1639 switch (current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1641 fl_set_choice (fd_form_paragraph->choice_space_below,
1644 case VSpace::DEFSKIP:
1645 fl_set_choice (fd_form_paragraph->choice_space_below,
1648 case VSpace::SMALLSKIP:
1649 fl_set_choice (fd_form_paragraph->choice_space_below,
1652 case VSpace::MEDSKIP:
1653 fl_set_choice (fd_form_paragraph->choice_space_below,
1656 case VSpace::BIGSKIP:
1657 fl_set_choice (fd_form_paragraph->choice_space_below,
1661 fl_set_choice (fd_form_paragraph->choice_space_below,
1664 case VSpace::LENGTH:
1665 fl_set_choice (fd_form_paragraph->choice_space_below,
1667 fl_set_input (fd_form_paragraph->input_space_below,
1668 current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1671 fl_set_button (fd_form_paragraph->check_space_below,
1672 current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1674 fl_set_button(fd_form_paragraph->check_noindent,
1675 current_view->text->cursor.par->FirstPhysicalPar()->noindent);
1677 if (current_view->buffer()->isReadonly()) {
1678 DisableParagraphLayout();
1680 EnableParagraphLayout();
1686 void MenuLayoutParagraph()
1688 if (UpdateLayoutParagraph()) {
1689 if (fd_form_paragraph->form_paragraph->visible) {
1690 fl_raise_form(fd_form_paragraph->form_paragraph);
1692 fl_show_form(fd_form_paragraph->form_paragraph,
1693 FL_PLACE_MOUSE, FL_FULLBORDER,
1694 _("Paragraph Environment"));
1701 void DeactivateDocumentButtons ()
1703 fl_deactivate_object (fd_form_document->button_ok);
1704 fl_deactivate_object (fd_form_document->button_apply);
1705 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1706 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1711 void ActivateDocumentButtons ()
1713 fl_activate_object (fd_form_document->button_ok);
1714 fl_activate_object (fd_form_document->button_apply);
1715 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1716 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1721 void DisableDocumentLayout ()
1723 DeactivateDocumentButtons ();
1724 fl_deactivate_object (fd_form_document->group_radio_separation);
1725 fl_deactivate_object (fd_form_document->radio_indent);
1726 fl_deactivate_object (fd_form_document->radio_skip);
1727 fl_deactivate_object (fd_form_document->choice_class);
1728 fl_deactivate_object (fd_form_document->choice_pagestyle);
1729 fl_deactivate_object (fd_form_document->choice_fonts);
1730 fl_deactivate_object (fd_form_document->choice_fontsize);
1731 fl_deactivate_object (fd_form_document->input_float_placement);
1732 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1733 fl_deactivate_object (fd_form_document->choice_inputenc);
1734 fl_deactivate_object (fd_form_document->group_radio_sides);
1735 fl_deactivate_object (fd_form_document->radio_sides_one);
1736 fl_deactivate_object (fd_form_document->radio_sides_two);
1737 fl_deactivate_object (fd_form_document->group_radio_columns);
1738 fl_deactivate_object (fd_form_document->radio_columns_one);
1739 fl_deactivate_object (fd_form_document->radio_columns_two);
1740 fl_deactivate_object (fd_form_document->input_extra);
1741 fl_deactivate_object (fd_form_document->choice_language);
1742 combo_language->deactivate();
1743 fl_deactivate_object (fd_form_document->input_default_skip);
1744 fl_deactivate_object (fd_form_document->choice_default_skip);
1745 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1746 fl_deactivate_object (fd_form_document->slider_tocdepth);
1747 fl_deactivate_object (fd_form_document->choice_spacing);
1748 fl_deactivate_object (fd_form_document->input_spacing);
1749 fl_deactivate_object (fd_form_document->check_use_amsmath);
1754 void EnableDocumentLayout ()
1756 ActivateDocumentButtons ();
1757 fl_activate_object (fd_form_document->group_radio_separation);
1758 fl_activate_object (fd_form_document->radio_indent);
1759 fl_activate_object (fd_form_document->radio_skip);
1760 fl_activate_object (fd_form_document->choice_class);
1761 fl_activate_object (fd_form_document->choice_pagestyle);
1762 fl_activate_object (fd_form_document->choice_fonts);
1763 fl_activate_object (fd_form_document->choice_fontsize);
1764 fl_activate_object (fd_form_document->input_float_placement);
1765 fl_activate_object (fd_form_document->choice_postscript_driver);
1766 fl_activate_object (fd_form_document->choice_inputenc);
1767 fl_activate_object (fd_form_document->group_radio_sides);
1768 fl_activate_object (fd_form_document->radio_sides_one);
1769 fl_activate_object (fd_form_document->radio_sides_two);
1770 fl_activate_object (fd_form_document->group_radio_columns);
1771 fl_activate_object (fd_form_document->radio_columns_one);
1772 fl_activate_object (fd_form_document->radio_columns_two);
1773 fl_activate_object (fd_form_document->input_extra);
1774 fl_activate_object (fd_form_document->choice_language);
1775 combo_language->activate();
1776 fl_activate_object (fd_form_document->input_default_skip);
1777 fl_activate_object (fd_form_document->choice_default_skip);
1778 fl_activate_object (fd_form_document->slider_secnumdepth);
1779 fl_activate_object (fd_form_document->slider_tocdepth);
1780 fl_activate_object (fd_form_document->choice_spacing);
1781 fl_activate_object (fd_form_document->input_spacing);
1782 fl_activate_object (fd_form_document->check_use_amsmath);
1786 bool UpdateLayoutDocument(BufferParams * params)
1788 if (!current_view->available()) {
1789 if (fd_form_document->form_document->visible)
1790 fl_hide_form(fd_form_document->form_document);
1795 params = ¤t_view->buffer()->params;
1796 LyXTextClass const & tclass = textclasslist.TextClass(params->textclass);
1798 fl_set_choice_text(fd_form_document->choice_class,
1799 textclasslist.DescOfClass(params->textclass).c_str());
1800 combo_language->select_text(params->language.c_str());
1802 fl_set_choice_text(fd_form_document->choice_fonts,
1803 params->fonts.c_str());
1804 fl_set_choice_text(fd_form_document->choice_inputenc,
1805 params->inputenc.c_str());
1806 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1807 params->graphicsDriver.c_str());
1809 // ale970405+lasgoutt970513
1810 fl_clear_choice(fd_form_document->choice_fontsize);
1811 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1812 fl_addto_choice(fd_form_document->choice_fontsize,
1813 tclass.opt_fontsize().c_str());
1814 fl_set_choice(fd_form_document->choice_fontsize,
1815 tokenPos(tclass.opt_fontsize(), '|', params->fontsize) + 2);
1817 // ale970405+lasgoutt970513
1818 fl_clear_choice(fd_form_document->choice_pagestyle);
1819 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1820 fl_addto_choice(fd_form_document->choice_pagestyle,
1821 tclass.opt_pagestyle().c_str());
1823 fl_set_choice(fd_form_document->choice_pagestyle,
1824 tokenPos(tclass.opt_pagestyle(), '|', params->pagestyle) + 2);
1826 fl_set_button(fd_form_document->radio_indent, 0);
1827 fl_set_button(fd_form_document->radio_skip, 0);
1830 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1832 if (params->paragraph_separation == BufferParams::PARSEP_INDENT)
1833 fl_set_button(fd_form_document->radio_indent, 1);
1835 fl_set_button(fd_form_document->radio_skip, 1);
1837 switch (params->getDefSkip().kind()) {
1838 case VSpace::SMALLSKIP:
1839 fl_set_choice (fd_form_document->choice_default_skip, 1);
1841 case VSpace::MEDSKIP:
1842 fl_set_choice (fd_form_document->choice_default_skip, 2);
1844 case VSpace::BIGSKIP:
1845 fl_set_choice (fd_form_document->choice_default_skip, 3);
1847 case VSpace::LENGTH:
1848 fl_set_choice (fd_form_document->choice_default_skip, 4);
1849 fl_set_input (fd_form_document->input_default_skip,
1850 params->getDefSkip().asLyXCommand().c_str());
1853 fl_set_choice (fd_form_document->choice_default_skip, 2);
1857 fl_set_button(fd_form_document->radio_sides_one, 0);
1858 fl_set_button(fd_form_document->radio_sides_two, 0);
1860 switch (params->sides) {
1861 case LyXTextClass::OneSide:
1862 fl_set_button(fd_form_document->radio_sides_one, 1);
1864 case LyXTextClass::TwoSides:
1865 fl_set_button(fd_form_document->radio_sides_two, 1);
1869 fl_set_button(fd_form_document->radio_columns_one, 0);
1870 fl_set_button(fd_form_document->radio_columns_two, 0);
1872 if (params->columns == 2)
1873 fl_set_button(fd_form_document->radio_columns_two, 1);
1875 fl_set_button(fd_form_document->radio_columns_one, 1);
1877 fl_set_input(fd_form_document->input_spacing, "");
1878 switch (params->spacing.getSpace()) {
1879 case Spacing::Single:
1882 fl_set_choice(fd_form_document->choice_spacing, 1);
1885 case Spacing::Onehalf:
1888 fl_set_choice(fd_form_document->choice_spacing, 2);
1891 case Spacing::Double:
1894 fl_set_choice(fd_form_document->choice_spacing, 3);
1897 case Spacing::Other:
1899 fl_set_choice(fd_form_document->choice_spacing, 4);
1901 //sprintf(sval, "%g", params->spacing.getValue());
1903 std::ostringstream sval;
1904 sval << params->spacing.getValue(); // setw?
1905 fl_set_input(fd_form_document->input_spacing,
1906 sval.str().c_str());
1909 ostrstream sval(tval, 20);
1910 sval << params->spacing.getValue() << '\0'; // setw?
1911 fl_set_input(fd_form_document->input_spacing, sval.str());
1918 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1919 params->secnumdepth);
1920 fl_set_counter_value(fd_form_document->slider_tocdepth,
1922 if (!params->float_placement.empty()) { // buffer local (Lgb)
1923 fl_set_input(fd_form_document->input_float_placement,
1924 params->float_placement.c_str());
1926 fl_set_input(fd_form_document->input_float_placement, "");
1928 if (!params->options.empty())
1929 fl_set_input(fd_form_document->input_extra,
1930 params->options.c_str());
1932 fl_set_input(fd_form_document->input_extra, "");
1934 if (current_view->buffer()->isSGML()) {
1935 // bullets not used in SGML derived documents
1936 fl_deactivate_object(fd_form_document->button_bullets);
1937 fl_set_object_lcol(fd_form_document->button_bullets,
1940 fl_activate_object(fd_form_document->button_bullets);
1941 fl_set_object_lcol(fd_form_document->button_bullets,
1945 if (current_view->buffer()->isReadonly()) {
1946 DisableDocumentLayout();
1948 EnableDocumentLayout();
1955 void MenuLayoutDocument()
1957 if (UpdateLayoutDocument()) {
1958 if (fd_form_document->form_document->visible) {
1959 fl_raise_form(fd_form_document->form_document);
1961 fl_show_form(fd_form_document->form_document,
1962 FL_PLACE_MOUSE, FL_FULLBORDER,
1963 _("Document Layout"));
1969 bool UpdateLayoutQuotes()
1972 if (!current_view->available()
1973 || current_view->buffer()->isReadonly())
1977 fl_set_choice(fd_form_quotes->choice_quotes_language,
1978 current_view->buffer()->params.quotes_language + 1);
1979 fl_set_button(fd_form_quotes->radio_single, 0);
1980 fl_set_button(fd_form_quotes->radio_double, 0);
1982 if (current_view->buffer()->params.quotes_times == InsetQuotes::SingleQ)
1983 fl_set_button(fd_form_quotes->radio_single, 1);
1985 fl_set_button(fd_form_quotes->radio_double, 1);
1986 } else if (fd_form_quotes->form_quotes->visible) {
1987 fl_hide_form(fd_form_quotes->form_quotes);
1993 void MenuLayoutQuotes()
1995 if (UpdateLayoutQuotes()) {
1996 if (fd_form_quotes->form_quotes->visible) {
1997 fl_raise_form(fd_form_quotes->form_quotes);
1999 fl_show_form(fd_form_quotes->form_quotes,
2000 FL_PLACE_MOUSE, FL_FULLBORDER,
2007 bool UpdateLayoutPreamble()
2010 if (!current_view->available())
2014 fl_set_input(fd_form_preamble->input_preamble,
2015 current_view->buffer()->params.preamble.c_str());
2017 if (current_view->buffer()->isReadonly()) {
2018 fl_deactivate_object(fd_form_preamble->input_preamble);
2019 fl_deactivate_object(fd_form_preamble->button_ok);
2020 fl_deactivate_object(fd_form_preamble->button_apply);
2021 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
2022 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
2025 fl_activate_object(fd_form_preamble->input_preamble);
2026 fl_activate_object(fd_form_preamble->button_ok);
2027 fl_activate_object(fd_form_preamble->button_apply);
2028 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
2029 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
2031 } else if (fd_form_preamble->form_preamble->visible) {
2032 fl_hide_form(fd_form_preamble->form_preamble);
2038 void MenuLayoutPreamble()
2040 static int ow = -1, oh;
2042 if (UpdateLayoutPreamble()) {
2043 if (fd_form_preamble->form_preamble->visible) {
2044 fl_raise_form(fd_form_preamble->form_preamble);
2046 fl_show_form(fd_form_preamble->form_preamble,
2047 FL_PLACE_MOUSE | FL_FREE_SIZE,
2049 _("LaTeX Preamble"));
2051 ow = fd_form_preamble->form_preamble->w;
2052 oh = fd_form_preamble->form_preamble->h;
2054 fl_set_form_minsize(fd_form_preamble->form_preamble,
2061 void MenuLayoutSave()
2063 if (!current_view->available())
2066 if (AskQuestion(_("Do you want to save the current settings"),
2067 _("for Character, Document, Paper and Quotes"),
2068 _("as default for new documents?")))
2069 current_view->buffer()->saveParamsAsDefaults();
2073 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2074 They also show the current font state. */
2077 void ToggleAndShow(BufferView *, LyXFont const &);
2080 void FontSize(string const & size)
2082 LyXFont font(LyXFont::ALL_IGNORE);
2083 font.setGUISize(size);
2084 ToggleAndShow(current_view, font);
2090 LyXFont font(LyXFont::ALL_IGNORE);
2091 font.setEmph(LyXFont::TOGGLE);
2092 ToggleAndShow(current_view, font);
2098 LyXFont font(LyXFont::ALL_IGNORE);
2099 font.setNoun(LyXFont::TOGGLE);
2100 ToggleAndShow(current_view, font);
2106 LyXFont font(LyXFont::ALL_IGNORE);
2107 font.setSeries(LyXFont::BOLD_SERIES);
2108 ToggleAndShow(current_view, font);
2114 LyXFont font(LyXFont::ALL_IGNORE);
2115 font.setUnderbar(LyXFont::TOGGLE);
2116 ToggleAndShow(current_view, font);
2122 LyXFont font(LyXFont::ALL_IGNORE);
2123 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2124 ToggleAndShow(current_view, font);
2130 LyXFont font(LyXFont::ALL_IGNORE);
2131 font.setFamily(LyXFont::SANS_FAMILY);
2132 ToggleAndShow(current_view, font);
2138 LyXFont font(LyXFont::ALL_IGNORE);
2139 font.setFamily(LyXFont::ROMAN_FAMILY);
2140 ToggleAndShow(current_view, font);
2146 LyXFont font(LyXFont::ALL_IGNORE);
2147 font.setLatex (LyXFont::TOGGLE);
2148 ToggleAndShow(current_view, font);
2151 void LangCB(string const & l)
2153 LyXFont font(LyXFont::ALL_IGNORE);
2154 Languages::iterator lit = languages.find(l);
2155 if (lit != languages.end()) {
2156 font.setLanguage(&(*lit).second);
2157 ToggleAndShow(current_view, font);
2159 WriteAlert(_("Error! unknown language"),l);
2165 LyXFont font(LyXFont::ALL_INHERIT, ignore_language);
2166 ToggleAndShow(current_view, font);
2170 /* -------> Returns the current font and depth by printing a message. In the
2171 * future perhaps we could try to implement a callback to the button-bar.
2172 * That is, `light' the bold button when the font is currently bold, etc.
2174 string CurrentState()
2177 if (current_view->available()) {
2178 // I think we should only show changes from the default
2180 Buffer * buffer = current_view->buffer();
2181 LyXFont font = current_view->text->real_current_font;
2182 LyXFont defaultfont = textclasslist.TextClass(buffer->
2183 params.textclass).defaultfont();
2184 font.reduce(defaultfont);
2185 state = _("Font: ") + font.stateText();
2187 int depth = current_view->text->GetDepth();
2189 state += string(_(", Depth: ")) + tostr(depth);
2195 // candidate for move to BufferView
2196 /* -------> Does the actual toggle job of the XxxCB() calls above.
2197 * Also shows the current font state.
2200 void ToggleAndShow(BufferView * bv, LyXFont const & font)
2202 if (bv->available()) {
2205 if (bv->the_locking_inset)
2206 bv->the_locking_inset->SetFont(bv, font, toggleall);
2208 bv->text->ToggleFree(font, toggleall);
2214 // candidate for move to BufferView
2215 void Margin(BufferView * bv)
2217 if (bv->available()) {
2218 bv->owner()->getMiniBuffer()->Set(_("Inserting margin note..."));
2221 bv->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2229 if (fd_form_figure->form_figure->visible) {
2230 fl_raise_form(fd_form_figure->form_figure);
2232 fl_show_form(fd_form_figure->form_figure,
2233 FL_PLACE_MOUSE, FL_FULLBORDER,
2234 _("Insert Figure"));
2241 if (fd_form_table->form_table->visible) {
2242 fl_raise_form(fd_form_table->form_table);
2244 fl_show_form(fd_form_table->form_table,
2245 FL_PLACE_MOUSE, FL_FULLBORDER,
2251 // candidate for move to BufferView
2252 void Melt(BufferView * bv)
2254 if (!bv->available()) return;
2256 bv->owner()->getMiniBuffer()->Set(_("Melt"));
2260 bv->text->MeltFootnoteEnvironment();
2265 // candidate for move to BufferView
2266 // Change environment depth.
2267 // if decInc >= 0, increment depth
2268 // if decInc < 0, decrement depth
2269 void changeDepth(BufferView * bv, int decInc)
2271 if (!bv->available()) return;
2276 bv->text->IncDepth();
2278 bv->text->DecDepth();
2280 bv->owner()->getMiniBuffer()
2281 ->Set(_("Changed environment depth"
2282 " (in possible range, maybe not)"));
2286 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2287 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2288 LyXFont UserFreeFont()
2290 LyXFont font(LyXFont::ALL_IGNORE);
2292 int pos = fl_get_choice(fd_form_character->choice_family);
2294 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2295 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2296 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2297 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2298 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2301 pos = fl_get_choice(fd_form_character->choice_series);
2303 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2304 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2305 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2306 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2309 pos = fl_get_choice(fd_form_character->choice_shape);
2311 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2312 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2313 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2314 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2315 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2316 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2319 pos = fl_get_choice(fd_form_character->choice_size);
2321 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2322 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2323 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2324 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2325 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2326 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2327 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2328 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2329 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2330 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2331 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2332 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2333 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2334 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2337 pos = fl_get_choice(fd_form_character->choice_bar);
2339 case 1: font.setEmph(LyXFont::IGNORE);
2340 font.setUnderbar(LyXFont::IGNORE);
2341 font.setNoun(LyXFont::IGNORE);
2342 font.setLatex(LyXFont::IGNORE);
2344 case 2: font.setEmph(LyXFont::TOGGLE); break;
2345 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2346 case 4: font.setNoun(LyXFont::TOGGLE); break;
2347 case 5: font.setLatex(LyXFont::TOGGLE); break;
2348 case 6: font.setEmph(LyXFont::INHERIT);
2349 font.setUnderbar(LyXFont::INHERIT);
2350 font.setNoun(LyXFont::INHERIT);
2351 font.setLatex(LyXFont::INHERIT);
2355 pos = fl_get_choice(fd_form_character->choice_color);
2357 case 1: font.setColor(LColor::ignore); break;
2358 case 2: font.setColor(LColor::none); break;
2359 case 3: font.setColor(LColor::black); break;
2360 case 4: font.setColor(LColor::white); break;
2361 case 5: font.setColor(LColor::red); break;
2362 case 6: font.setColor(LColor::green); break;
2363 case 7: font.setColor(LColor::blue); break;
2364 case 8: font.setColor(LColor::cyan); break;
2365 case 9: font.setColor(LColor::magenta); break;
2366 case 10: font.setColor(LColor::yellow); break;
2367 case 11: font.setColor(LColor::inherit); break;
2376 ToggleAndShow(current_view, UserFreeFont());
2380 /* callbacks for form form_title */
2381 extern "C" void TimerCB(FL_OBJECT *, long)
2383 // only if the form still exists
2384 if (lyxrc.show_banner && fd_form_title->form_title != 0) {
2385 if (fd_form_title->form_title->visible) {
2386 fl_hide_form(fd_form_title->form_title);
2388 fl_free_form(fd_form_title->form_title);
2389 fd_form_title->form_title = 0;
2394 /* callbacks for form form_paragraph */
2396 extern "C" void ParagraphVSpaceCB(FL_OBJECT * obj, long )
2398 // "Synchronize" the choices and input fields, making it
2399 // impossible to commit senseless data.
2401 FD_form_paragraph const * fp = fd_form_paragraph;
2403 if (obj == fp->choice_space_above) {
2404 if (fl_get_choice (fp->choice_space_above) != 7) {
2405 fl_set_input (fp->input_space_above, "");
2406 ActivateParagraphButtons();
2408 } else if (obj == fp->choice_space_below) {
2409 if (fl_get_choice (fp->choice_space_below) != 7) {
2410 fl_set_input (fp->input_space_below, "");
2411 ActivateParagraphButtons();
2413 } else if (obj == fp->input_space_above) {
2414 string input = fl_get_input (fp->input_space_above);
2416 if (input.empty()) {
2417 fl_set_choice (fp->choice_space_above, 1);
2418 ActivateParagraphButtons();
2420 else if (isValidGlueLength (input)) {
2421 fl_set_choice (fp->choice_space_above, 7);
2422 ActivateParagraphButtons();
2425 fl_set_choice (fp->choice_space_above, 7);
2426 DeactivateParagraphButtons();
2428 } else if (obj == fp->input_space_below) {
2429 string input = fl_get_input (fp->input_space_below);
2431 if (input.empty()) {
2432 fl_set_choice (fp->choice_space_below, 1);
2433 ActivateParagraphButtons();
2435 else if (isValidGlueLength (input)) {
2436 fl_set_choice (fp->choice_space_below, 7);
2437 ActivateParagraphButtons();
2440 fl_set_choice (fp->choice_space_below, 7);
2441 DeactivateParagraphButtons();
2447 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2449 if (!current_view->available())
2452 VSpace space_top, space_bottom;
2454 string labelwidthstring;
2457 // If a vspace kind is "Length" but there's no text in
2458 // the input field, reset the kind to "None".
2459 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2460 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2461 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2463 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2464 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2465 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2468 bool line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2469 bool line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2470 bool pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2471 bool pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2472 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2473 case 1: space_top = VSpace(VSpace::NONE); break;
2474 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2475 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2476 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2477 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2478 case 6: space_top = VSpace(VSpace::VFILL); break;
2479 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2481 if (fl_get_button (fd_form_paragraph->check_space_above))
2482 space_top.setKeep (true);
2483 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2484 case 1: space_bottom = VSpace(VSpace::NONE); break;
2485 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2486 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2487 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2488 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2489 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2490 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2492 if (fl_get_button (fd_form_paragraph->check_space_below))
2493 space_bottom.setKeep (true);
2495 if (fl_get_button(fd_form_paragraph->radio_align_left))
2496 align = LYX_ALIGN_LEFT;
2497 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2498 align = LYX_ALIGN_RIGHT;
2499 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2500 align = LYX_ALIGN_CENTER;
2502 align = LYX_ALIGN_BLOCK;
2504 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2505 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2507 current_view->text->SetParagraph(line_top,
2516 current_view->update(1);
2517 current_view->owner()->getMiniBuffer()->Set(_("Paragraph layout set"));
2521 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2523 fl_hide_form(fd_form_paragraph->form_paragraph);
2527 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2529 ParagraphApplyCB(ob, data);
2530 ParagraphCancelCB(ob, data);
2534 /* callbacks for form form_character */
2536 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2538 // we set toggleall locally here, since it should be true for
2539 // all other uses of ToggleAndShow() (JMarc)
2540 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2541 ToggleAndShow(current_view, UserFreeFont());
2546 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2548 fl_hide_form(fd_form_character->form_character);
2552 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2554 CharacterApplyCB(ob, data);
2555 CharacterCloseCB(ob, data);
2559 /* callbacks for form form_document */
2561 void UpdateDocumentButtons(BufferParams const & params)
2563 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2565 switch (params.sides) {
2566 case LyXTextClass::OneSide:
2567 fl_set_button(fd_form_document->radio_sides_one, 1);
2569 case LyXTextClass::TwoSides:
2570 fl_set_button(fd_form_document->radio_sides_two, 1);
2574 if (params.columns == 2)
2575 fl_set_button(fd_form_document->radio_columns_two, 1);
2577 fl_set_button(fd_form_document->radio_columns_one, 1);
2579 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2580 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2581 params.secnumdepth);
2582 fl_set_counter_value(fd_form_document->slider_tocdepth,
2587 extern "C" void ChoiceClassCB(FL_OBJECT * ob, long)
2590 if (textclasslist.Load(fl_get_choice(ob)-1)) {
2591 if (AskQuestion(_("Should I set some parameters to"),
2592 fl_get_choice_text(ob),
2593 _("the defaults of this document class?"))) {
2594 BufferParams params = BufferParams();
2595 params.textclass = fl_get_choice(ob)-1;
2596 params.useClassDefaults();
2597 UpdateLayoutDocument(¶ms);
2598 UpdateDocumentButtons(params);
2601 // unable to load new style
2602 WriteAlert(_("Conversion Errors!"),
2603 _("Unable to switch to new document class."),
2604 _("Reverting to original document class."));
2605 fl_set_choice(fd_form_document->choice_class,
2606 current_view->buffer()->params.textclass + 1);
2612 extern "C" void DocumentDefskipCB(FL_OBJECT * obj, long)
2614 // "Synchronize" the choice and the input field, so that it
2615 // is impossible to commit senseless data.
2616 FD_form_document const * fd = fd_form_document;
2618 if (obj == fd->choice_default_skip) {
2619 if (fl_get_choice (fd->choice_default_skip) != 4) {
2620 fl_set_input (fd->input_default_skip, "");
2621 ActivateDocumentButtons();
2623 } else if (obj == fd->input_default_skip) {
2625 char const * input = fl_get_input (fd->input_default_skip);
2628 fl_set_choice (fd->choice_default_skip, 2);
2629 ActivateDocumentButtons();
2630 } else if (isValidGlueLength (input)) {
2631 fl_set_choice (fd->choice_default_skip, 4);
2632 ActivateDocumentButtons();
2634 fl_set_choice (fd->choice_default_skip, 4);
2635 DeactivateDocumentButtons();
2641 extern "C" void DocumentSpacingCB(FL_OBJECT * obj, long)
2643 // "Synchronize" the choice and the input field, so that it
2644 // is impossible to commit senseless data.
2645 FD_form_document const * fd = fd_form_document;
2647 if (obj == fd->choice_spacing
2648 && fl_get_choice (fd->choice_spacing) != 4) {
2649 fl_set_input(fd->input_spacing, "");
2650 } else if (obj == fd->input_spacing) {
2652 const char* input = fl_get_input (fd->input_spacing);
2655 fl_set_choice (fd->choice_spacing, 1);
2657 fl_set_choice (fd->choice_spacing, 4);
2663 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2666 BufferParams * params = &(current_view->buffer()->params);
2668 params->language = combo_language->getline();
2669 Languages::iterator lit = languages.find(params->language);
2670 if (lit != languages.end())
2671 params->language_info = &(*lit).second;
2673 params->language_info = default_language;
2675 // If default skip is a "Length" but there's no text in the
2676 // input field, reset the kind to "Medskip", which is the default.
2677 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2678 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2679 fl_set_choice (fd_form_document->choice_default_skip, 2);
2682 /* this shouldn't be done automatically IMO. For example I write german
2683 * documents with an american keyboard very often. Matthias */
2685 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2686 fl_get_choice(fd_form_document->choice_language)); */
2688 fl_get_choice_text(fd_form_document->choice_fonts);
2690 fl_get_choice_text(fd_form_document->choice_inputenc);
2692 fl_get_choice_text(fd_form_document->choice_fontsize);
2694 fl_get_choice_text(fd_form_document->choice_pagestyle);
2695 params->graphicsDriver =
2696 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2697 params->use_amsmath =
2698 fl_get_button(fd_form_document->check_use_amsmath);
2700 if (!current_view->available())
2702 current_view->text->SetCursor(current_view->text->cursor.par,
2703 current_view->text->cursor.pos);
2704 current_view->setState();
2706 LyXTextClassList::ClassList::size_type new_class =
2707 fl_get_choice(fd_form_document->choice_class) - 1;
2709 if (params->textclass != new_class) {
2710 // try to load new_class
2711 if (textclasslist.Load(new_class)) {
2712 // successfully loaded
2714 current_view->owner()->getMiniBuffer()->
2715 Set(_("Converting document to new document class..."));
2717 int ret = cap.SwitchLayoutsBetweenClasses(
2718 current_view->buffer()->params.textclass,
2720 current_view->buffer()->paragraph);
2725 s = _("One paragraph couldn't be converted");
2728 s += _(" paragraphs couldn't be converted");
2730 WriteAlert(_("Conversion Errors!"), s,
2731 _("into chosen document class"));
2734 params->textclass = new_class;
2736 // problem changing class -- warn user and retain old style
2737 WriteAlert(_("Conversion Errors!"),
2738 _("Unable to switch to new document class."),
2739 _("Reverting to original document class."));
2740 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2744 char tmpsep = params->paragraph_separation;
2745 if (fl_get_button(fd_form_document->radio_indent))
2746 params->paragraph_separation = BufferParams::PARSEP_INDENT;
2748 params->paragraph_separation = BufferParams::PARSEP_SKIP;
2749 if (tmpsep != params->paragraph_separation)
2752 VSpace tmpdefskip = params->getDefSkip();
2753 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2754 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2755 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2756 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2757 case 4: params->setDefSkip(
2758 VSpace (LyXGlueLength (fl_get_input
2759 (fd_form_document->input_default_skip))));
2761 // DocumentDefskipCB assures that this never happens
2762 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2764 if (!(tmpdefskip == params->getDefSkip()))
2767 if (fl_get_button(fd_form_document->radio_columns_two))
2768 params->columns = 2;
2770 params->columns = 1;
2771 if (fl_get_button(fd_form_document->radio_sides_two))
2772 params->sides = LyXTextClass::TwoSides;
2774 params->sides = LyXTextClass::OneSide;
2776 Spacing tmpSpacing = params->spacing;
2777 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2779 lyxerr.debug() << "Spacing: SINGLE" << endl;
2780 params->spacing.set(Spacing::Single);
2783 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2784 params->spacing.set(Spacing::Onehalf);
2787 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2788 params->spacing.set(Spacing::Double);
2791 lyxerr.debug() << "Spacing: OTHER" << endl;
2792 params->spacing.set(Spacing::Other,
2793 fl_get_input(fd_form_document->input_spacing));
2796 if (tmpSpacing != params->spacing)
2799 signed char tmpchar =
2800 static_cast<signed char>(fl_get_counter_value(fd_form_document->slider_secnumdepth));
2801 if (params->secnumdepth != tmpchar)
2803 params->secnumdepth = tmpchar;
2806 static_cast<int>(fl_get_counter_value(fd_form_document->slider_tocdepth));
2808 params->float_placement =
2809 fl_get_input(fd_form_document->input_float_placement);
2811 // More checking should be done to ensure the string doesn't have
2812 // spaces or illegal placement characters in it. (thornley)
2815 current_view->redoCurrentBuffer();
2817 current_view->owner()->getMiniBuffer()->Set(_("Document layout set"));
2818 current_view->buffer()->markDirty();
2821 fl_get_input(fd_form_document->input_extra);
2826 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
2828 fl_hide_form(fd_form_document->form_document);
2832 extern "C" void DocumentOKCB(FL_OBJECT * ob, long data)
2834 DocumentCancelCB(ob, data);
2835 DocumentApplyCB(ob, data);
2839 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
2842 // bullet callbacks etc. in bullet_panel.C -- ARRae
2846 /* callbacks for form form_quotes */
2848 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
2850 if (!current_view->available())
2853 current_view->owner()->getMiniBuffer()->Set(_("Quotes type set"));
2854 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
2855 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
2857 lga = InsetQuotes::EnglishQ;
2860 lga = InsetQuotes::SwedishQ;
2863 lga = InsetQuotes::GermanQ;
2866 lga = InsetQuotes::PolishQ;
2869 lga = InsetQuotes::FrenchQ;
2872 lga = InsetQuotes::DanishQ;
2875 current_view->buffer()->params.quotes_language = lga;
2876 if (fl_get_button(fd_form_quotes->radio_single))
2877 current_view->buffer()->
2878 params.quotes_times = InsetQuotes::SingleQ;
2880 current_view->buffer()->
2881 params.quotes_times = InsetQuotes::DoubleQ;
2885 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
2887 fl_hide_form(fd_form_quotes->form_quotes);
2891 extern "C" void QuotesOKCB(FL_OBJECT * ob, long data)
2893 QuotesApplyCB(ob, data);
2894 QuotesCancelCB(ob, data);
2899 /* callbacks for form form_preamble */
2901 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
2903 fl_hide_form(fd_form_preamble->form_preamble);
2907 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
2909 if (!current_view->available())
2912 current_view->buffer()->params.preamble =
2913 fl_get_input(fd_form_preamble->input_preamble);
2914 current_view->buffer()->markDirty();
2915 current_view->owner()->getMiniBuffer()->Set(_("LaTeX preamble set"));
2919 extern "C" void PreambleOKCB(FL_OBJECT * ob, long data)
2921 PreambleApplyCB(ob, data);
2922 PreambleCancelCB(ob, data);
2926 /* callbacks for form form_table */
2928 extern "C" void TableApplyCB(FL_OBJECT *, long)
2930 if (!current_view->available())
2933 // check for tables in tables
2934 if (current_view->text->cursor.par->table){
2935 WriteAlert(_("Impossible Operation!"),
2936 _("Cannot insert table in table."),
2941 current_view->owner()->getMiniBuffer()->Set(_("Inserting table..."));
2943 int ysize = int(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
2944 int xsize = int(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
2947 current_view->hideCursor();
2948 current_view->beforeChange();
2949 current_view->update(-2);
2951 current_view->text->SetCursorParUndo();
2952 current_view->text->FreezeUndo();
2954 current_view->text->BreakParagraph();
2955 current_view->update(-1);
2957 if (current_view->text->cursor.par->Last()) {
2958 current_view->text->CursorLeft();
2960 current_view->text->BreakParagraph();
2961 current_view->update(-1);
2964 current_view->text->current_font.setLatex(LyXFont::OFF);
2965 //if (!fl_get_button(fd_form_table->check_latex)){
2966 // insert the new wysiwy table
2967 current_view->text->SetLayout(0); // standard layout
2968 if (current_view->text->cursor.par->footnoteflag ==
2969 LyXParagraph::NO_FOOTNOTE) {
2971 ->SetParagraph(0, 0,
2973 VSpace (0.3 * current_view->buffer()->
2974 params.spacing.getValue(),
2976 VSpace (0.3 * current_view->buffer()->
2977 params.spacing.getValue(),
2984 ->SetParagraph(0, 0,
2986 VSpace(VSpace::NONE),
2987 VSpace(VSpace::NONE),
2993 current_view->text->cursor.par->table =
2994 new LyXTable(xsize, ysize);
2996 Language const * lang =
2997 current_view->text->cursor.par->getParLanguage();
2998 LyXFont font(LyXFont::ALL_INHERIT,lang);
2999 for (int i = 0; i < xsize * ysize - 1; ++i) {
3000 current_view->text->cursor.par->InsertChar(0, LyXParagraph::META_NEWLINE);
3001 current_view->text->cursor.par->SetFont(0, font);
3003 current_view->text->RedoParagraph();
3005 current_view->text->UnFreezeUndo();
3007 current_view->update(1);
3008 current_view->owner()->getMiniBuffer()->Set(_("Table inserted"));
3009 current_view->setState();
3013 extern "C" void TableCancelCB(FL_OBJECT *, long)
3015 fl_hide_form(fd_form_table->form_table);
3019 extern "C" void TableOKCB(FL_OBJECT * ob, long data)
3021 TableApplyCB(ob, data);
3022 TableCancelCB(ob, data);
3026 /* callbacks for form form_print */
3028 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3030 fl_hide_form(fd_form_print->form_print);
3035 bool stringOnlyContains (string const & LStr, char const * cset)
3038 char const * cstr = LStr.c_str();
3040 return strspn(cstr, cset) == strlen(cstr);
3042 return LStr.find_first_not_of(cset) == string::npos;
3047 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3049 if (!current_view->available())
3051 Buffer * buffer = current_view->buffer();
3052 string path = OnlyPath(buffer->fileName());
3055 if (fl_get_button(fd_form_print->radio_even_pages))
3056 pageflag = lyxrc.print_evenpage_flag + ' ';
3057 else if (fl_get_button(fd_form_print->radio_odd_pages))
3058 pageflag = lyxrc.print_oddpage_flag + ' ';
3060 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3061 // User may give a page (range) list
3062 // User may print multiple (unsorted) copies
3063 string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
3064 pages = subst(pages, '+',',');
3065 pages = frontStrip(strip(pages)) ;
3066 while (!pages.empty()) { // a page range was given
3068 pages = split (pages, piece, ',') ;
3069 piece = strip(piece) ;
3070 piece = frontStrip(piece) ;
3071 if ( !stringOnlyContains (piece, "0123456789-") ) {
3072 WriteAlert(_("ERROR! Unable to print!"),
3073 _("Check 'range of pages'!"));
3076 if (piece.find('-') == string::npos) { // not found
3077 pageflag += lyxrc.print_pagerange_flag + piece + '-' + piece + ' ' ;
3078 } else if (suffixIs(piece, "-") ) { // missing last page
3079 pageflag += lyxrc.print_pagerange_flag + piece + "1000 ";
3080 } else if (prefixIs(piece, "-") ) { // missing first page
3081 pageflag += lyxrc.print_pagerange_flag + '1' + piece + ' ' ;
3083 pageflag += lyxrc.print_pagerange_flag + piece + ' ' ;
3087 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3088 if (!copies.empty()) { // a number of copies was given
3089 if ( !stringOnlyContains (copies, "0123456789") ) {
3090 WriteAlert(_("ERROR! Unable to print!"),
3091 _("Check 'number of copies'!"));
3094 if (fl_get_button(fd_form_print->do_unsorted))
3095 pageflag += lyxrc.print_copies_flag;
3097 pageflag += lyxrc.print_collcopies_flag;
3098 pageflag += " " + copies + ' ' ;
3102 if (fl_get_button(fd_form_print->radio_order_reverse))
3103 reverseflag = lyxrc.print_reverse_flag + ' ';
3105 string orientationflag;
3106 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
3107 orientationflag = lyxrc.print_landscape_flag + ' ';
3109 string ps_file = fl_get_input(fd_form_print->input_file);
3110 string printer = strip(fl_get_input(fd_form_print->input_printer));
3113 if (lyxrc.print_adapt_output // printer name should be passed to dvips
3114 && ! printer.empty()) // a printer name has been given
3115 printerflag = lyxrc.print_to_printer + printer + ' ';
3118 if (!lyxrc.print_extra_options.empty())
3119 extraflags = lyxrc.print_extra_options + ' ';
3121 string command = lyxrc.print_command + ' '
3122 + printerflag + pageflag + reverseflag
3123 + orientationflag + extraflags;
3125 char real_papersize = buffer->params.papersize;
3126 if (real_papersize == BufferParams::PAPER_DEFAULT)
3127 real_papersize = lyxrc.default_papersize;
3130 switch (real_papersize) {
3131 case BufferParams::PAPER_USLETTER:
3134 case BufferParams::PAPER_A3PAPER:
3137 case BufferParams::PAPER_A4PAPER:
3140 case BufferParams::PAPER_A5PAPER:
3143 case BufferParams::PAPER_B5PAPER:
3146 case BufferParams::PAPER_EXECUTIVEPAPER:
3149 case BufferParams::PAPER_LEGALPAPER:
3152 default: /* If nothing else fits, keep an empty value... */
3156 if (buffer->params.use_geometry
3157 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
3158 && !lyxrc.print_paper_dimension_flag.empty()
3159 && !buffer->params.paperwidth.empty()
3160 && !buffer->params.paperheight.empty()) {
3161 // using a custom papersize
3163 command += lyxrc.print_paper_dimension_flag + ' ';
3164 command += buffer->params.paperwidth + ',';
3165 command += buffer->params.paperheight + ' ';
3166 } else if (!lyxrc.print_paper_flag.empty()
3168 && (real_papersize != BufferParams::PAPER_USLETTER ||
3169 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
3170 command += " " + lyxrc.print_paper_flag + " " + paper + " ";
3172 if (fl_get_button(fd_form_print->radio_file))
3173 command += lyxrc.print_to_file
3174 + QuoteName(MakeAbsPath(ps_file, path));
3175 else if (!lyxrc.print_spool_command.empty())
3176 command += lyxrc.print_to_file
3177 + QuoteName(ps_file);
3179 // push directorypath, if necessary
3180 if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
3181 path = buffer->tmppath;
3186 if (!lyxrc.print_spool_command.empty() &&
3187 !fl_get_button(fd_form_print->radio_file)) {
3188 string command2 = lyxrc.print_spool_command + ' ';
3189 if (!printer.empty())
3190 command2 += lyxrc.print_spool_printerprefix
3192 // First run dvips and, if succesful, then spool command
3193 if ((result = RunScript(buffer, true, command))) {
3194 result = RunScript(buffer, false, command2, ps_file);
3197 result = RunScript(buffer, false, command);
3200 WriteAlert(_("Error:"),
3201 _("Unable to print"),
3202 _("Check that your parameters are correct"));
3206 extern "C" void PrintOKCB(FL_OBJECT * ob, long data)
3208 PrintCancelCB(ob, data);
3209 PrintApplyCB(ob, data);
3213 /* callbacks for form form_figure */
3214 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3216 if (!current_view->available())
3219 Buffer * buffer = current_view->buffer();
3220 if(buffer->isReadonly()) // paranoia
3223 current_view->owner()->getMiniBuffer()->Set(_("Inserting figure..."));
3224 if (fl_get_button(fd_form_figure->radio_inline)
3225 || current_view->text->cursor.par->table) {
3226 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3227 current_view->insertInset(new_inset);
3228 current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
3229 new_inset->Edit(current_view, 0, 0, 0);
3233 current_view->hideCursor();
3234 current_view->update(-2);
3235 current_view->beforeChange();
3237 current_view->text->SetCursorParUndo();
3238 current_view->text->FreezeUndo();
3240 current_view->text->BreakParagraph();
3241 current_view->update(-1);
3243 if (current_view->text->cursor.par->Last()) {
3244 current_view->text->CursorLeft();
3246 current_view->text->BreakParagraph();
3247 current_view->update(-1);
3250 // The standard layout should always be numer 0;
3251 current_view->text->SetLayout(0);
3253 if (current_view->text->cursor.par->footnoteflag ==
3254 LyXParagraph::NO_FOOTNOTE) {
3255 current_view->text->
3258 VSpace (0.3 * buffer->params.spacing.getValue(),
3261 buffer->params.spacing.getValue(),
3263 LYX_ALIGN_CENTER, string(), 0);
3265 current_view->text->SetParagraph(0, 0,
3267 VSpace(VSpace::NONE),
3268 VSpace(VSpace::NONE),
3274 current_view->update(-1);
3276 Inset * new_inset = new InsetFig(100, 100, buffer);
3277 current_view->insertInset(new_inset);
3278 new_inset->Edit(current_view, 0, 0, 0);
3279 current_view->update(0);
3280 current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
3281 current_view->text->UnFreezeUndo();
3282 current_view->setState();
3286 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3288 fl_hide_form(fd_form_figure->form_figure);
3292 extern "C" void FigureOKCB(FL_OBJECT * ob, long data)
3294 FigureApplyCB(ob, data);
3295 FigureCancelCB(ob, data);
3299 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3301 lyxrc.roman_font_name = fl_get_input(fd_form_screen->input_roman);
3302 lyxrc.sans_font_name = fl_get_input(fd_form_screen->input_sans);
3303 lyxrc.typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3304 lyxrc.font_norm = fl_get_input(fd_form_screen->input_font_norm);
3305 lyxrc.zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3306 fontloader.update();
3308 // All buffers will need resize
3309 bufferlist.resize();
3311 current_view->owner()->getMiniBuffer()->Set(_("Screen options set"));
3315 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3317 fl_hide_form(fd_form_screen->form_screen);
3321 extern "C" void ScreenOKCB(FL_OBJECT * ob, long data)
3323 ScreenCancelCB(ob, data);
3324 ScreenApplyCB(ob, data);
3328 void LaTeXOptions(BufferView * bv)
3330 if (!bv->available())
3333 fl_set_button(fd_latex_options->accents,
3334 int(bv->buffer()->params.allowAccents));
3336 if (fd_latex_options->LaTeXOptions->visible) {
3337 fl_raise_form(fd_latex_options->LaTeXOptions);
3339 fl_show_form(fd_latex_options->LaTeXOptions,
3340 FL_PLACE_MOUSE, FL_FULLBORDER,
3341 _("LaTeX Options"));
3346 // This function runs "configure" and then rereads lyx.defaults to
3347 // reconfigure the automatic settings.
3348 void Reconfigure(BufferView * bv)
3350 bv->owner()->getMiniBuffer()->Set(_("Running configure..."));
3352 // Run configure in user lyx directory
3353 Path p(user_lyxdir);
3354 Systemcalls one(Systemcalls::System,
3355 AddName(system_lyxdir, "configure"));
3357 bv->owner()->getMiniBuffer()->Set(_("Reloading configuration..."));
3358 lyxrc.read(LibFileSearch(string(), "lyxrc.defaults"));
3359 WriteAlert(_("The system has been reconfigured."),
3360 _("You need to restart LyX to make use of any"),
3361 _("updated document class specifications."));
3366 // Table of Contents
3376 static TocList * toclist = 0;
3379 extern "C" void TocSelectCB(FL_OBJECT * ob, long)
3381 if (!current_view->available())
3384 TocList * tmptoclist = toclist;
3385 int i = fl_get_browser(ob);
3386 for (int a = 1; a < i && tmptoclist->next; ++a) {
3387 tmptoclist = tmptoclist->next;
3394 LyXParagraph * par = current_view->buffer()->paragraph;
3395 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3396 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3397 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3398 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3399 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3400 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3401 par->appendix != tmptoclist->appendix)) {
3402 par = par->LastPhysicalPar()->Next();
3406 current_view->beforeChange();
3407 current_view->text->SetCursor(par, 0);
3408 current_view->text->sel_cursor =
3409 current_view->text->cursor;
3410 current_view->update(0);
3413 WriteAlert(_("Error"),
3414 _("Couldn't find this label"),
3415 _("in current document."));
3421 extern "C" void TocCancelCB(FL_OBJECT *, long)
3423 fl_hide_form(fd_form_toc->form_toc);
3427 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3429 static LyXParagraph * stapar = 0;
3430 TocList * tmptoclist = 0;
3432 /* deleted the toclist */
3435 tmptoclist = toclist->next;
3437 toclist = tmptoclist;
3441 tmptoclist = toclist;
3444 fl_clear_browser(fd_form_toc->browser_toc);
3445 if (!current_view->available()) {
3446 fl_add_browser_line(fd_form_toc->browser_toc,
3447 _("*** No Document ***"));
3450 fl_hide_object(fd_form_toc->browser_toc);
3451 /* get the table of contents */
3452 LyXParagraph * par = current_view->buffer()->paragraph;
3454 char * line = new char[200];
3460 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3464 labeltype = textclasslist.Style(current_view->buffer()->params.textclass,
3465 par->GetLayout()).labeltype;
3467 if (labeltype >= LABEL_COUNTER_CHAPTER
3468 && labeltype <= LABEL_COUNTER_CHAPTER +
3469 current_view->buffer()->params.tocdepth) {
3470 /* insert this into the table of contents */
3471 /* first indent a little bit */
3475 textclasslist.TextClass(current_view->buffer()->
3476 params.textclass).maxcounter()) * 4 + 2;
3480 // Then the labestring
3481 if (!par->labelstring.empty()) {
3482 string::size_type i = 0;
3483 while (pos < 199 && i < par->labelstring.length()) {
3484 line[pos] = par->labelstring[i];
3493 /* now the contents */
3494 LyXParagraph::size_type i = 0;
3495 while (pos < 199 && i < par->size()) {
3496 c = par->GetChar(i);
3497 if (isprint(c) || c >= 128) {
3504 fl_add_browser_line(fd_form_toc->browser_toc, line);
3506 /* make a toclist entry */
3508 tmptoclist = new TocList;
3509 toclist = tmptoclist;
3511 tmptoclist->next = new TocList;
3512 tmptoclist = tmptoclist->next;
3515 tmptoclist->next = 0;
3517 for (a = 0; a < 6; ++a) {
3518 tmptoclist->counter[a] = par->GetFirstCounter(a);
3520 tmptoclist->appendix = par->appendix;
3522 par = par->LastPhysicalPar()->Next();
3526 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3527 fl_show_object(fd_form_toc->browser_toc);
3531 /* callbacks for form form_ref */
3532 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3534 if (!current_view->available())
3538 fl_get_browser_line(fd_form_ref->browser_ref,
3539 fl_get_browser(fd_form_ref->browser_ref));
3540 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3546 current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3556 if(current_view->buffer()->isSGML())
3557 t += "[" + u + "]" + "{" + s + "}";
3562 new InsetRef(t, current_view->buffer());
3563 current_view->insertInset(new_inset);
3567 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3569 if (!current_view->available()) {
3570 fl_clear_browser(fd_form_ref->browser_ref);
3574 FL_OBJECT * brow = fd_form_ref->browser_ref;
3576 // Get the current line, in order to restore it later
3577 char const * const btmp = fl_get_browser_line(brow,
3578 fl_get_browser(brow));
3579 string currentstr = btmp ? btmp : "";
3581 fl_clear_browser(brow);
3583 string refs = current_view->buffer()->getReferenceList('\n');
3586 fl_addto_browser_chars(brow, refs.c_str());
3587 int total_lines = fl_get_browser_maxline(brow);
3588 for (int i = 1; i <= total_lines ; ++i) {
3589 if (fl_get_browser_line(brow, i) == currentstr) {
3594 fl_set_browser_topline(brow, topline);
3596 if (!fl_get_browser_maxline(brow)) {
3597 fl_add_browser_line(brow,
3598 _("*** No labels found in document ***"));
3599 fl_deactivate_object(brow);
3601 fl_select_browser_line(brow, topline);
3602 fl_activate_object(brow);
3604 if (current_view->buffer()->isReadonly()) {
3605 // would be better to de/activate insert buttons
3606 // but that's more work... besides this works. ARRae
3607 fl_hide_form(fd_form_ref->form_ref);
3609 if (!current_view->buffer()->isSGML()) {
3610 fl_deactivate_object(fd_form_ref->ref_name);
3611 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3614 fl_activate_object(fd_form_ref->ref_name);
3615 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3620 extern "C" void RefHideCB(FL_OBJECT *, long)
3622 fl_hide_form(fd_form_ref->form_ref);