1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich,
7 * Copyright 1995-1999 The LyX Team.
9 * ====================================================== */
23 #include "support/lstrings.h"
25 #include FORMS_H_LOCATION
27 #include "layout_forms.h"
28 #include "bullet_forms.h"
29 #include "print_form.h"
31 #include "spellchecker.h"
35 #include "insets/insetref.h"
36 #include "insets/insetquotes.h"
38 #include "insets/insetlatex.h"
40 #include "insets/insetlabel.h"
41 #include "insets/insetinfo.h"
42 #include "insets/insetspecialchar.h"
43 #include "insets/figinset.h"
45 #include "latexoptions.h"
47 #include "minibuffer.h"
49 #include "bufferlist.h"
50 #include "support/filetools.h"
51 #include "support/path.h"
53 #include "lyx_gui_misc.h"
54 #include "LyXView.h" // only because of form_main
55 #include "lastfiles.h"
56 #include "support/FileInfo.h"
57 #include "lyxscreen.h"
59 #include "support/syscall.h"
60 #include "support/lyxlib.h"
61 #include "lyxserver.h"
62 #include "FontLoader.h"
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;
94 extern FontLoader fontloader;
96 // this should be static, but I need it in buffer.C
97 bool quitting; // flag, that we are quitting the program
98 extern bool finished; // all cleanup done just let it run through now.
100 char ascii_type; /* for selection notify callbacks */
102 bool scrolling = false;
104 char updatetimer = 0;
106 /* whether the work area should get callbacks */
107 bool input_prohibited = false;
109 /* the selection possible is needed, that only motion events are
110 * used, where the bottom press event was on the drawing area too */
111 bool selection_possible = false;
113 // This is used to make the dreaded font toggle problem hopefully go
114 // away. Definitely not the best solution, but I think it sorta works.
115 bool toggleall = true;
118 This is the inset locking stuff needed for mathed --------------------
120 an inset can simple call LockInset in it's edit call and *ONLY* in it's
122 Inset::Edit() can only be called by the main lyx module.
124 Then the inset may modify the menu's and/or iconbars.
126 Unlocking is either done by LyX or the inset itself with a UnlockInset-call
128 During the lock, all button and keyboard events will be modified
129 and send to the inset through the following inset-features. Note that
130 Inset::InsetUnlock will be called from inside UnlockInset. It is meant
131 to contain the code for restoring the menus and things like this.
134 virtual void InsetButtonPress(int x, int y, int button);
135 virtual void InsetButtonRelease(int x, int y, int button);
136 virtual void InsetKeyPress(XKeyEvent *ev);
137 virtual void InsetMotionNotify(int x, int y, int state);
138 virtual void InsetUnlock();
140 If a inset wishes any redraw and/or update it just has to call
142 It's is completly irrelevant, where the inset is. UpdateInset will
143 find it in any paragraph in any buffer.
144 Of course the_locking_inset and the insets in the current paragraph/buffer
145 are checked first, so no performance problem should occur.
147 Hope that's ok for the beginning, Alejandro,
148 sorry that I needed so much time,
153 void UpdateInset(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(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 // How should this actually work? Should it prohibit input in all BufferViews,
186 // or just in the current one? If "just the current one", then it should be
187 // placed in BufferView. If "all BufferViews" then LyXGUI (I think) should
188 // run "ProhibitInput" on all LyXViews which will run prohibitInput on all
189 // BufferViews. Or is it perhaps just the (input in) BufferViews in the
190 // current LyxView that should be prohibited (Lgb) (This applies to
191 // "AllowInput" as well.)
194 input_prohibited = true;
195 if (current_view->getScreen())
196 current_view->getScreen()->HideCursor();
198 static Cursor cursor;
199 static bool cursor_undefined = true;
201 if (cursor_undefined){
202 cursor = XCreateFontCursor(fl_display, XC_watch);
204 cursor_undefined = false;
207 /* set the cursor to the watch for all forms and the canvas */
208 XDefineCursor(fl_display, current_view->owner()->getForm()->window,
210 if (fd_form_paragraph->form_paragraph->visible)
211 XDefineCursor(fl_display,
212 fd_form_paragraph->form_paragraph->window,
214 if (fd_form_character->form_character->visible)
215 XDefineCursor(fl_display,
216 fd_form_character->form_character->window,
220 fl_deactivate_all_forms();
224 // Should find a way to move this into BufferView.C
225 void SetXtermCursor(Window win)
227 static Cursor cursor;
228 static bool cursor_undefined = true;
229 if (cursor_undefined){
230 cursor = XCreateFontCursor(fl_display, XC_xterm);
232 cursor_undefined = false;
234 XDefineCursor(fl_display, win, cursor);
241 input_prohibited = false;
243 /* reset the cursor from the watch for all forms and the canvas */
245 XUndefineCursor(fl_display, current_view->owner()->getForm()->window);
246 if (fd_form_paragraph->form_paragraph->visible)
247 XUndefineCursor(fl_display,
248 fd_form_paragraph->form_paragraph->window);
249 if (fd_form_character->form_character->visible)
250 XUndefineCursor(fl_display,
251 fd_form_character->form_character->window);
252 if (current_view->getWorkArea()->belowmouse)
253 SetXtermCursor(current_view->owner()->getForm()->window);
256 fl_activate_all_forms();
260 void FreeUpdateTimer()
262 /* a real free timer would be better but I don't know
263 * how to do this with xforms */
268 void SetUpdateTimer(float time)
270 fl_set_timer(current_view->owner()->getMainForm()->timer_update, time);
283 // should be moved to lyxfunc.C
284 void MenuWrite(Buffer * buffer)
287 if (!bufferlist.write(buffer, lyxrc->make_backup)) {
288 string fname = buffer->fileName();
289 string s = MakeAbsPath(fname);
290 if (AskQuestion(_("Save failed. Rename and try again?"),
291 MakeDisplayPath(s, 50),
292 _("(If not, document is not saved.)"))) {
296 lastfiles->newFile(buffer->fileName());
301 // should be moved to BufferView.C
302 // Half of this func should be in LyXView, the rest in BufferView.
303 void MenuWriteAs(Buffer * buffer)
305 // Why do we require BufferView::text to be able to write a
306 // document? I see no point in that. (Lgb)
307 //if (!bv->text) return;
309 string fname = buffer->fileName();
310 string oldname = fname;
314 fileDlg.SetButton(0, _("Documents"), lyxrc->document_path);
315 fileDlg.SetButton(1, _("Templates"), lyxrc->template_path);
317 if (!IsLyXFilename(fname))
320 fname = fileDlg.Select(_("Enter Filename to Save Document as"),
323 OnlyFilename(fname));
327 // Can we do without this one?
329 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Canceled."));
333 // Make sure the absolute filename ends with appropriate suffix
334 string s = MakeAbsPath(fname);
335 if (!IsLyXFilename(s))
338 // Same name as we have already?
340 if (!AskQuestion(_("Same name as document already has:"),
341 MakeDisplayPath(s, 50),
344 // Falls through to name change and save
346 // No, but do we have another file with this name open?
347 else if (bufferlist.exists(s)) {
348 if (AskQuestion(_("Another document with same name open!"),
349 MakeDisplayPath(s, 50),
350 _("Replace with current document?")))
352 bufferlist.close(bufferlist.getBuffer(s));
354 // Ok, change the name of the buffer, but don't save!
358 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Document renamed to '"),
360 _("', but not saved..."));
363 } // Check whether the file exists
366 if (myfile.isOK() && !AskQuestion(_("Document already exists:"),
367 MakeDisplayPath(s, 50),
372 // Ok, change the name of the buffer
376 // Small bug: If the save fails, we have irreversible changed the name
382 int MenuRunLaTeX(Buffer * buffer)
386 if (buffer->isLinuxDoc())
387 ret = RunLinuxDoc(1, buffer->fileName());
388 else if (buffer->isLiterate())
389 ret = buffer->runLiterate();
390 else if (buffer->isDocBook())
391 ret = RunDocBook(1, buffer->fileName());
393 ret = buffer->runLaTeX();
399 s = _("One error detected");
400 t = _("You should try to fix it.");
403 s += _(" errors detected.");
404 t = _("You should try to fix them.");
406 WriteAlert(_("There were errors during the LaTeX run."), s, t);
412 int MenuBuildProg(Buffer * buffer)
416 if (buffer->isLiterate())
417 ret = buffer->buildProgram();
419 string s = _("Wrong type of document");
420 string t = _("The Build operation is not allowed in this document");
421 WriteAlert(_("There were errors during the Build process."), s, t);
429 s = _("One error detected");
430 t = _("You should try to fix it.");
433 s += _(" errors detected.");
434 t = _("You should try to fix them.");
436 WriteAlert(_("There were errors during the Build process."), s, t);
442 int MenuRunChktex(Buffer * buffer)
446 if (buffer->isSGML()) {
447 WriteAlert(_("Chktex does not work with SGML derived documents."));
450 ret = buffer->runChktex();
456 s = _("No warnings found.");
457 } else if (ret == 1) {
458 s = _("One warning found.");
459 t = _("Use 'Edit->Go to Error' to find it.");
462 s += _(" warnings found.");
463 t = _("Use 'Edit->Go to Error' to find them.");
465 WriteAlert(_("Chktex run successfully"), s, t);
467 WriteAlert(_("Error!"), _("It seems chktex does not work."));
473 int MakeLaTeXOutput(Buffer * buffer)
479 string path = OnlyPath(buffer->fileName());
480 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
481 path = buffer->tmppath;
483 if (!buffer->isDviClean()) {
485 ret = MenuRunLaTeX(buffer);
491 /* wait == false means don't wait for termination */
492 /* wait == true means wait for termination */
493 // The bool should be placed last on the argument line. (Lgb)
494 // Returns false if we fail.
495 bool RunScript(Buffer * buffer, bool wait,
496 string const & command,
497 string const & orgname = string(),
498 bool need_shell = true)
502 string name = orgname;
505 if (MakeLaTeXOutput(buffer) > 0)
507 /* get DVI-Filename */
509 name = ChangeExtension(buffer->getLatexName(),
512 path = OnlyPath(name);
513 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
514 path = buffer->tmppath;
518 cmd = command + ' ' + QuoteName(name);
527 // OS/2 cmd.exe has another use for '&'
529 // This is not NLS safe, but it's OK, I think.
530 string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
532 // COMSPEC is set, unless user unsets
533 sh = OnlyFilename(GetEnvPath("COMSPEC"));
538 if (contains(sh, "cmd.exe")
539 || contains(sh, "4os2.exe"))
540 cmd = "start /min/n " + cmd;
545 // It seems that, if wait is false, we never get back
546 // the return code of the command. This means that all
547 // the code I added in PrintApplyCB is currently
550 #warning What should we do here?
552 buffer->getUser()->owner()->getMiniBuffer()->Set(
553 _("Executing command:"), cmd);
554 result = one.startscript(Systemcalls::System, cmd);
556 buffer->getUser()->owner()->getMiniBuffer()->Set(
557 _("Executing command:"), cmd);
558 result = one.startscript(wait ? Systemcalls::Wait
559 : Systemcalls::DontWait, cmd);
565 // Returns false if we fail
566 bool CreatePostscript(Buffer * buffer, bool wait = false)
575 if (MakeLaTeXOutput(buffer) > 0) {
579 // Generate postscript file
580 string psname = ChangeExtension (buffer->fileName(),
586 char real_papersize = buffer->params.papersize;
587 if (real_papersize == BufferParams::PAPER_DEFAULT)
588 real_papersize = lyxrc->default_papersize;
590 switch (real_papersize) {
591 case BufferParams::PAPER_USLETTER:
594 case BufferParams::PAPER_A3PAPER:
597 case BufferParams::PAPER_A4PAPER:
600 case BufferParams::PAPER_A5PAPER:
603 case BufferParams::PAPER_B5PAPER:
606 case BufferParams::PAPER_EXECUTIVEPAPER:
609 case BufferParams::PAPER_LEGALPAPER:
612 default: /* If nothing else fits, keep an empty value... */
616 // Make postscript file.
617 string command = lyxrc->dvi_to_ps_command + ' ' + lyxrc->print_to_file + ' ';
618 command += QuoteName(psname);
619 if (buffer->params.use_geometry
620 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
621 && !lyxrc->print_paper_dimension_flag.empty()
622 && !buffer->params.paperwidth.empty()
623 && !buffer->params.paperheight.empty()) {
624 // using a custom papersize
626 command += lyxrc->print_paper_dimension_flag + ' ';
627 command += buffer->params.paperwidth + ',';
628 command += buffer->params.paperheight;
629 } else if (!paper.empty()
630 && (real_papersize != BufferParams::PAPER_USLETTER ||
631 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
632 // dvips won't accept -t letter -t landscape. In all other
633 // cases, include the paper size explicitly.
635 command += lyxrc->print_paper_flag + ' ' + paper;
637 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE) {
639 command += lyxrc->print_landscape_flag;
641 // push directorypath, if necessary
642 string path = OnlyPath(buffer->fileName());
643 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
644 path = buffer->tmppath;
647 bool ret = RunScript(buffer, wait, command);
653 // Returns false if we fail
654 //bool MenuPreviewPS(Buffer * buffer)
655 bool PreviewPostscript(Buffer * buffer)
661 // Generate postscript file
662 if (!CreatePostscript(buffer, true)) {
666 // Start postscript viewer
668 string ps = ChangeExtension (buffer->fileName(),
670 // push directorypath, if necessary
671 string path = OnlyPath(buffer->fileName());
672 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
673 path = buffer->tmppath;
676 bool ret = RunScript(buffer, false, lyxrc->view_ps_command, ps);
682 void MenuFax(Buffer * buffer)
688 // Generate postscript file
689 if (!CreatePostscript(buffer, true)) {
694 string ps = ChangeExtension (buffer->fileName(), ".ps_tmp", true);
695 string path = OnlyPath (buffer->fileName());
696 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
697 path = buffer->tmppath;
700 if (!lyxrc->fax_program.empty()) {
701 string help2 = subst(lyxrc->fax_program, "$$FName", ps);
703 Systemcalls one(Systemcalls::System, help2);
705 send_fax(ps, lyxrc->fax_command);
709 // Returns false if we fail
710 bool PreviewDVI(Buffer * buffer)
719 char real_papersize = buffer->params.papersize;
720 if (real_papersize == BufferParams::PAPER_DEFAULT)
721 real_papersize = lyxrc->default_papersize;
723 switch (real_papersize) {
724 case BufferParams::PAPER_USLETTER:
727 case BufferParams::PAPER_A3PAPER:
730 case BufferParams::PAPER_A4PAPER:
733 case BufferParams::PAPER_A5PAPER:
736 case BufferParams::PAPER_B5PAPER:
739 case BufferParams::PAPER_EXECUTIVEPAPER:
742 case BufferParams::PAPER_LEGALPAPER:
745 default: /* If nothing else fits, keep the empty value */
750 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
751 // we HAVE to give a size when the page is in
752 // landscape, so use USletter.
753 paper = " -paper usr";
755 paper = " -paper " + paper;
756 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
760 // push directorypath, if necessary
761 string path = OnlyPath(buffer->fileName());
762 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
763 path = buffer->tmppath;
767 string command = lyxrc->view_dvi_command + paper ;
768 bool ret = RunScript(buffer, false, command);
773 void MenuMakeLaTeX(Buffer * buffer)
775 // Why care about this?
779 // Get LaTeX-Filename
780 string s = buffer->getLatexName(false);
784 !AskQuestion(_("File already exists:"),
785 MakeDisplayPath(s, 50),
786 _("Do you want to overwrite the file?"))) {
787 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Canceled"));
791 if (buffer->isDocBook())
792 buffer->getUser()->owner()->getMiniBuffer()->Set(
793 _("DocBook does not have a latex backend"));
795 if (buffer->isLinuxDoc())
796 RunLinuxDoc(0, buffer->fileName());
798 buffer->makeLaTeXFile(s, string(), true);
799 buffer->getUser()->owner()->getMiniBuffer()->Set(
800 _("Nice LaTeX file saved as"), MakeDisplayPath(s));
801 buffer->markDviDirty();
806 void MenuMakeLinuxDoc(Buffer * buffer)
809 //if (!bv->text) return;
811 if (!buffer->isLinuxDoc()) {
812 WriteAlert(_("Error!"), _("Document class must be linuxdoc."));
816 // Get LinuxDoc-Filename
817 string s = ChangeExtension(buffer->fileName(),
822 !AskQuestion(_("File already exists:"),
823 MakeDisplayPath(s, 50),
824 _("Do you want to overwrite the file?"))) {
825 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Canceled"));
829 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Building LinuxDoc SGML file `"),
830 MakeDisplayPath(s),"'...");
832 buffer->makeLinuxDocFile(s, 65);
834 buffer->getUser()->owner()->getMiniBuffer()->Set(_("LinuxDoc SGML file save as"),
839 void MenuMakeDocBook(Buffer * buffer)
842 //if (!bv->text) return;
844 if (!buffer->isDocBook()) {
845 WriteAlert(_("Error!"),
846 _("Document class must be docbook."));
850 // Get DocBook-Filename
851 string s = ChangeExtension(buffer->fileName(),
856 !AskQuestion(_("File already exists:"),
857 MakeDisplayPath(s, 50),
858 _("Do you want to overwrite the file?"))) {
859 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Canceled"));
863 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Building DocBook SGML file `"),
864 MakeDisplayPath(s), "'...");
866 buffer->makeDocBookFile(s, 65);
868 buffer->getUser()->owner()->getMiniBuffer()->Set(_("DocBook SGML file save as"),
873 void MenuMakeAscii(Buffer * buffer)
876 //if (!bv->text) return;
878 /* get LaTeX-Filename */
879 string s = ChangeExtension (buffer->fileName(),
884 !AskQuestion(_("File already exists:"),
885 MakeDisplayPath(s, 50),
886 _("Do you want to overwrite the file?"))) {
887 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Canceled"));
891 buffer->writeFileAscii(s, lyxrc->ascii_linelen);
893 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Ascii file saved as"), MakeDisplayPath(s));
897 void MenuPrint(Buffer * buffer)
903 string input_file = ChangeExtension(buffer->fileName(),
904 lyxrc->print_file_extension,
906 fl_set_input(fd_form_print->input_file, input_file.c_str());
908 if (fd_form_print->form_print->visible) {
909 fl_raise_form(fd_form_print->form_print);
912 fl_show_form(fd_form_print->form_print,
913 FL_PLACE_MOUSE, FL_FULLBORDER,
918 void MenuMakeHTML(Buffer * buffer)
920 // First, create LaTeX file
921 MenuMakeLaTeX(buffer);
923 // And now, run the converter
924 string file = buffer->fileName();
925 Path path(OnlyPath(file));
926 // the tex file name has to be correct for
927 // latex, but the html file name can be
929 string result = ChangeExtension(file, ".html", false);
930 string infile = buffer->getLatexName(false);
931 string tmp = lyxrc->html_command;
932 tmp = subst(tmp, "$$FName", infile);
933 tmp = subst(tmp, "$$OutName", result);
935 int res = one.startscript(Systemcalls::System, tmp);
937 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Document exported as HTML to file `")
938 + MakeDisplayPath(result) +'\'');
940 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Unable to convert to HTML the file `")
941 + MakeDisplayPath(infile)
947 void MenuExport(Buffer * buffer, string const & extyp)
950 if (extyp == "latex") {
951 // make sure that this buffer is not linuxdoc
952 MenuMakeLaTeX(buffer);
955 else if (extyp == "linuxdoc") {
956 // make sure that this buffer is not latex
957 MenuMakeLinuxDoc(buffer);
960 else if (extyp == "docbook") {
961 // make sure that this buffer is not latex or linuxdoc
962 MenuMakeDocBook(buffer);
965 else if (extyp == "dvi") {
966 // Run LaTeX as "Update dvi..." Bernhard.
967 // We want the dvi in the current directory. This
968 // is achieved by temporarily disabling use of
969 // temp directory. As a side-effect, we get
970 // *.log and *.aux files also. (Asger)
971 bool flag = lyxrc->use_tempdir;
972 lyxrc->use_tempdir = false;
973 MenuRunLaTeX(buffer);
974 lyxrc->use_tempdir = flag;
977 else if (extyp == "postscript") {
978 // Start Print-dialog. Not as good as dvi... Bernhard.
980 // Since the MenuPrint is a pop-up, we can't use
981 // the same trick as above. (Asger)
982 // MISSING: Move of ps-file :-(
983 // And MenuPrint should not be used for this at all...
986 else if (extyp == "ascii") {
987 MenuMakeAscii(buffer);
989 else if (extyp == "custom") {
993 else if (extyp == "html") {
994 MenuMakeHTML(buffer);
997 buffer->getUser()->owner()->getMiniBuffer()->Set(_("Unknown export type: ") + extyp);
1004 lyxerr.debug() << "Running QuitLyX." << endl;
1006 if (!bufferlist.QwriteAll())
1009 lastfiles->writeFile(lyxrc->lastfiles);
1011 // Set a flag that we do quitting from the program,
1012 // so no refreshes are necessary.
1015 // close buffers first
1016 bufferlist.closeAll();
1018 // do any other cleanup procedures now
1019 lyxerr.debug() << "Deleting tmp dir " << system_tempdir << endl;
1021 DestroyLyXTmpDir(system_tempdir);
1029 // should probably be moved into BufferList (Lgb)
1030 // Perfect target for a thread...
1032 if (!current_view->getScreen() || !current_view->available())
1035 if (current_view->buffer()->isBakClean()
1036 || current_view->buffer()->isReadonly()) {
1037 // We don't save now, but we'll try again later
1038 current_view->owner()->resetAutosaveTimer();
1042 current_view->owner()->getMiniBuffer()->Set(_("Autosaving current document..."));
1044 // create autosave filename
1045 string fname = OnlyPath(current_view->buffer()->fileName());
1047 fname += OnlyFilename(current_view->buffer()->fileName());
1050 // tmp_ret will be located (usually) in /tmp
1051 // will that be a problem?
1052 string tmp_ret = tmpnam(0);
1054 pid_t pid = fork(); // If you want to debug the autosave
1055 // you should set pid to -1, and comment out the
1057 if (pid == 0 || pid == -1) {
1058 // pid = -1 signifies that lyx was unable
1059 // to fork. But we will do the save
1061 bool failed = false;
1062 if (!tmp_ret.empty()) {
1063 current_view->buffer()->writeFile(tmp_ret, 1);
1064 // assume successful write of tmp_ret
1065 if (rename(tmp_ret.c_str(), fname.c_str()) == -1) {
1067 // most likely couldn't move between filesystems
1068 // unless write of tmp_ret failed
1069 // so remove tmp file (if it exists)
1070 remove(tmp_ret.c_str());
1077 // failed to write/rename tmp_ret so try writing direct
1078 if (!current_view->buffer()->writeFile(fname, 1)) {
1079 // It is dangerous to do this in the child,
1080 // but safe in the parent, so...
1082 current_view->owner()->getMiniBuffer()->Set(_("Autosave Failed!"));
1085 if (pid == 0) { // we are the child so...
1090 current_view->buffer()->markBakClean();
1091 current_view->owner()->resetAutosaveTimer();
1096 // (c) CHT Software Service GmbH
1099 // create new file with template
1102 Buffer * NewLyxFile(string const & filename)
1104 // Split argument by :
1106 string tmpname = split(filename, name, ':');
1107 #ifdef __EMX__ // Fix me! lyx_cb.C may not be low level enough to allow this.
1108 if (name.length() == 1
1109 && isalpha(static_cast<unsigned char>(name[0]))
1110 && (prefixIs(tmpname, "/") || prefixIs(tmpname, "\\"))) {
1112 name += token(tmpname, ':', 0);
1113 tmpname = split(tmpname, ':');
1116 lyxerr.debug() << "Arg is " << filename
1117 << "\nName is " << name
1118 << "\nTemplate is " << tmpname << endl;
1120 // find a free buffer
1121 Buffer * tmpbuf = bufferlist.newFile(name, tmpname);
1123 lastfiles->newFile(tmpbuf->fileName());
1128 // Insert ascii file (if filename is empty, prompt for one)
1129 void InsertAsciiFile(string const & f, bool asParagraph)
1134 if (!current_view->getScreen()) return;
1136 if (fname.empty()) {
1138 fname = fileDlg.Select(_("File to Insert"),
1139 current_view->owner()->buffer()->filepath,
1142 if (fname.empty()) return;
1147 if (!fi.readable()) {
1148 WriteFSAlert(_("Error! Specified file is unreadable: "),
1149 MakeDisplayPath(fname, 50));
1153 ifstream ifs(fname.c_str());
1155 WriteFSAlert(_("Error! Cannot open specified file: "),
1156 MakeDisplayPath(fname, 50));
1159 LyXParagraph * tmppar = new LyXParagraph;
1160 tmppar->readSimpleWholeFile(ifs);
1162 // set the end of the string
1163 #ifdef WITH_WARNINGS
1164 #warning why do we do this?
1166 // I don't think this is needed. Actually it might be plain wrong.
1167 tmppar->InsertChar(tmppar->text.size() - 1, '\0');
1169 // insert the string
1170 current_view->getScreen()->HideCursor();
1172 // clear the selection
1173 current_view->beforeChange();
1175 current_view->text->InsertStringA(tmppar->text);
1177 current_view->text->InsertStringB(tmppar->text);
1179 current_view->update(1);
1183 void MenuShowTableOfContents()
1185 static int ow = -1, oh;
1188 if (fd_form_toc->form_toc->visible) {
1189 fl_raise_form(fd_form_toc->form_toc);
1191 fl_show_form(fd_form_toc->form_toc,
1192 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1193 _("Table Of Contents"));
1195 ow = fd_form_toc->form_toc->w;
1196 oh = fd_form_toc->form_toc->h;
1198 fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
1203 void MenuInsertLabel(char const * arg)
1207 if (label.empty()) {
1209 result = askForText(_("Enter new label to insert:"));
1211 label = frontStrip(strip(result.second));
1214 if (!label.empty()) {
1215 InsetLabel * new_inset = new InsetLabel;
1216 new_inset->setContents(label);
1217 current_view->insertInset(new_inset);
1223 void MenuInsertRef()
1225 static int ow = -1, oh;
1228 if (fd_form_ref->form_ref->visible) {
1229 fl_raise_form(fd_form_ref->form_ref);
1231 fl_show_form(fd_form_ref->form_ref,
1232 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1233 _("Insert Reference"));
1235 ow = fd_form_ref->form_ref->w;
1236 oh = fd_form_ref->form_ref->h;
1238 fl_set_form_minsize(fd_form_ref->form_ref, ow, oh);
1243 void MenuPasteSelection(char at)
1245 if (!current_view->getScreen())
1250 Atom data_prop = XInternAtom(fl_display,
1253 if (data_prop == None)
1255 XConvertSelection(fl_display,
1256 XA_PRIMARY, XA_STRING, data_prop,
1257 current_view->owner()->getForm()->window, 0);
1262 // candidate for move to BufferView
1263 extern "C" void FootCB(FL_OBJECT *, long)
1265 if (!current_view->available())
1268 current_view->owner()->getMiniBuffer()->Set(_("Inserting Footnote..."));
1269 current_view->getScreen()->HideCursor();
1270 current_view->update(-2);
1271 current_view->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1272 current_view->update(1);
1276 // candidate for move to LyXView
1277 void LayoutsCB(int sel, void *)
1279 string tmp = tostr(sel);
1280 current_view->owner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1286 * SGML Linuxdoc support:
1287 * (flag == -1) import SGML file
1288 * (flag == 0) make TeX output
1289 * (flag == 1) make dvi output
1291 int RunLinuxDoc(int flag, string const & filename)
1300 /* generate a path-less extension name */
1301 name = ChangeExtension (filename, ".sgml", true);
1302 path = OnlyPath (filename);
1303 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1304 path = current_view->buffer()->tmppath;
1309 if (!current_view->available())
1311 current_view->buffer()->makeLinuxDocFile(name, 0);
1312 #ifdef WITH_WARNINGS
1313 #warning remove this once we have a proper geometry class
1315 BufferParams::PAPER_SIZE ps = static_cast<BufferParams::PAPER_SIZE>(current_view->buffer()->params.papersize);
1317 case BufferParams::PAPER_A4PAPER:
1318 add_flags = "-p a4";
1320 case BufferParams::PAPER_USLETTER:
1321 add_flags = "-p letter";
1323 default: /* nothing to be done yet ;-) */ break;
1331 case -1: /* Import file */
1332 current_view->owner()->getMiniBuffer()->Set(_("Importing LinuxDoc SGML file `"),
1333 MakeDisplayPath(filename), "'...");
1334 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1336 if (one.startscript(Systemcalls::System, s2))
1339 case 0: /* TeX output asked */
1340 current_view->owner()->getMiniBuffer()->Set(_("Converting LinuxDoc SGML to TeX file..."));
1341 s2 = "sgml2latex " + add_flags + " -o tex "
1342 + lyxrc->sgml_extra_options + ' ' + name;
1343 if (one.startscript(Systemcalls::System, s2))
1346 case 1: /* dvi output asked */
1347 current_view->owner()->getMiniBuffer()->Set(_("Converting LinuxDoc SGML to dvi file..."));
1348 s2 = "sgml2latex " + add_flags + " -o dvi "
1349 + lyxrc->sgml_extra_options + ' ' + name;
1350 if (one.startscript(Systemcalls::System, s2)) {
1353 current_view->buffer()->markDviClean();
1355 default: /* unknown output */
1361 current_view->buffer()->redraw();
1367 * SGML DocBook support:
1368 * (flag == 1) make dvi output
1370 int RunDocBook(int flag, string const & filename)
1372 /* generate a path-less extension name */
1373 string name = ChangeExtension (filename, ".sgml", true);
1374 string path = OnlyPath (filename);
1375 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1376 path = current_view->buffer()->tmppath;
1380 if (!current_view->available())
1383 current_view->buffer()->makeDocBookFile(name, 0);
1385 // Shall this code go or should it stay? (Lgb)
1386 // string add_flags;
1387 // LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->buffer()->params.papersize;
1389 // case BufferParams::PAPER_A4PAPER: add_flags = "-p a4"; break;
1390 // case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
1391 // default: /* nothing to be done yet ;-) */ break;
1398 case 1: /* dvi output asked */
1400 current_view->owner()->getMiniBuffer()->Set(_("Converting DocBook SGML to dvi file..."));
1401 string s2 = "sgmltools --backend dvi " + name;
1402 if (one.startscript(Systemcalls::System, s2)) {
1405 current_view->buffer()->markDviClean();
1408 default: /* unknown output */
1414 current_view->buffer()->redraw();
1419 void BufferView::allFloats(char flag, char figmar)
1421 if (!available()) return;
1423 LyXCursor cursor = text->cursor;
1425 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1427 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1428 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1430 && cursor.par->footnotekind != LyXParagraph::FIG
1431 && cursor.par->footnotekind != LyXParagraph::TAB
1432 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1433 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1434 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1439 LyXCursor tmpcursor = cursor;
1440 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1441 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1443 LyXParagraph *par = buffer()->paragraph;
1446 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1448 && par->footnotekind != LyXParagraph::FOOTNOTE
1449 && par->footnotekind != LyXParagraph::MARGIN)
1451 && par->footnotekind != LyXParagraph::FIG
1452 && par->footnotekind != LyXParagraph::TAB
1453 && par->footnotekind != LyXParagraph::WIDE_FIG
1454 && par->footnotekind != LyXParagraph::WIDE_TAB
1455 && par->footnotekind != LyXParagraph::ALGORITHM
1460 && par->previous->footnoteflag !=
1461 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1462 text->SetCursorIntern(par->previous,
1464 text->OpenFootnote();
1469 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1473 par->footnotekind != LyXParagraph::FOOTNOTE
1475 par->footnotekind != LyXParagraph::MARGIN
1480 par->footnotekind != LyXParagraph::FIG
1482 par->footnotekind != LyXParagraph::TAB
1484 par->footnotekind != LyXParagraph::WIDE_FIG
1486 par->footnotekind != LyXParagraph::WIDE_TAB
1488 par->footnotekind != LyXParagraph::ALGORITHM
1492 text->SetCursorIntern(par, 0);
1493 text->CloseFootnote();
1499 text->SetCursorIntern(cursor.par, cursor.pos);
1506 void MenuLayoutCharacter()
1508 static int ow = -1, oh;
1510 if (fd_form_character->form_character->visible) {
1511 fl_raise_form(fd_form_character->form_character);
1513 fl_show_form(fd_form_character->form_character,
1514 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1515 _("Character Style"));
1517 ow = fd_form_character->form_character->w;
1518 oh = fd_form_character->form_character->h;
1520 fl_set_form_minsize(fd_form_character->form_character, ow, oh);
1525 inline void DeactivateParagraphButtons ()
1527 fl_deactivate_object (fd_form_paragraph->button_ok);
1528 fl_deactivate_object (fd_form_paragraph->button_apply);
1529 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1530 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1534 inline void ActivateParagraphButtons ()
1536 fl_activate_object (fd_form_paragraph->button_ok);
1537 fl_activate_object (fd_form_paragraph->button_apply);
1538 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1539 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1543 inline void DisableParagraphLayout ()
1545 DeactivateParagraphButtons();
1546 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1547 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1548 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1549 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1550 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1551 fl_deactivate_object (fd_form_paragraph->check_noindent);
1552 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1553 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1554 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1555 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1556 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1557 fl_deactivate_object (fd_form_paragraph->input_space_above);
1558 fl_deactivate_object (fd_form_paragraph->input_space_below);
1559 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1560 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1561 fl_deactivate_object (fd_form_paragraph->check_space_above);
1562 fl_deactivate_object (fd_form_paragraph->check_space_below);
1566 inline void EnableParagraphLayout ()
1568 ActivateParagraphButtons();
1569 fl_activate_object (fd_form_paragraph->input_labelwidth);
1570 fl_activate_object (fd_form_paragraph->check_lines_top);
1571 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1572 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1573 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1574 fl_activate_object (fd_form_paragraph->check_noindent);
1575 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1576 fl_activate_object (fd_form_paragraph->radio_align_right);
1577 fl_activate_object (fd_form_paragraph->radio_align_left);
1578 fl_activate_object (fd_form_paragraph->radio_align_block);
1579 fl_activate_object (fd_form_paragraph->radio_align_center);
1580 fl_activate_object (fd_form_paragraph->input_space_above);
1581 fl_activate_object (fd_form_paragraph->input_space_below);
1582 fl_activate_object (fd_form_paragraph->choice_space_above);
1583 fl_activate_object (fd_form_paragraph->choice_space_below);
1584 fl_activate_object (fd_form_paragraph->check_space_above);
1585 fl_activate_object (fd_form_paragraph->check_space_below);
1589 bool UpdateLayoutParagraph()
1591 if (!current_view->getScreen() || !current_view->available()) {
1592 if (fd_form_paragraph->form_paragraph->visible)
1593 fl_hide_form(fd_form_paragraph->form_paragraph);
1597 Buffer * buf = current_view->buffer();
1599 fl_set_input(fd_form_paragraph->input_labelwidth,
1600 current_view->text->cursor.par->GetLabelWidthString().c_str());
1601 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1602 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1603 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1604 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1606 int align = current_view->text->cursor.par->GetAlign();
1607 if (align == LYX_ALIGN_LAYOUT)
1608 align = textclasslist.Style(buf->params.textclass,
1609 current_view->text->cursor.par->GetLayout()).align;
1612 case LYX_ALIGN_RIGHT:
1613 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1615 case LYX_ALIGN_LEFT:
1616 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1618 case LYX_ALIGN_CENTER:
1619 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1622 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1626 fl_set_button(fd_form_paragraph->check_lines_top,
1627 current_view->text->cursor.par->FirstPhysicalPar()->line_top);
1628 fl_set_button(fd_form_paragraph->check_lines_bottom,
1629 current_view->text->cursor.par->FirstPhysicalPar()->line_bottom);
1630 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1631 current_view->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1632 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1633 current_view->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1634 fl_set_button(fd_form_paragraph->check_noindent,
1635 current_view->text->cursor.par->FirstPhysicalPar()->noindent);
1636 fl_set_input (fd_form_paragraph->input_space_above, "");
1638 switch (current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1640 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
1642 case VSpace::DEFSKIP:
1643 fl_set_choice (fd_form_paragraph->choice_space_above, 2);
1645 case VSpace::SMALLSKIP:
1646 fl_set_choice (fd_form_paragraph->choice_space_above, 3);
1648 case VSpace::MEDSKIP:
1649 fl_set_choice (fd_form_paragraph->choice_space_above, 4);
1651 case VSpace::BIGSKIP:
1652 fl_set_choice (fd_form_paragraph->choice_space_above, 5);
1655 fl_set_choice (fd_form_paragraph->choice_space_above, 6);
1657 case VSpace::LENGTH:
1658 fl_set_choice (fd_form_paragraph->choice_space_above, 7);
1659 fl_set_input (fd_form_paragraph->input_space_above,
1660 current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1663 fl_set_button (fd_form_paragraph->check_space_above,
1664 current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1665 fl_set_input (fd_form_paragraph->input_space_below, "");
1666 switch (current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1668 fl_set_choice (fd_form_paragraph->choice_space_below,
1671 case VSpace::DEFSKIP:
1672 fl_set_choice (fd_form_paragraph->choice_space_below,
1675 case VSpace::SMALLSKIP:
1676 fl_set_choice (fd_form_paragraph->choice_space_below,
1679 case VSpace::MEDSKIP:
1680 fl_set_choice (fd_form_paragraph->choice_space_below,
1683 case VSpace::BIGSKIP:
1684 fl_set_choice (fd_form_paragraph->choice_space_below,
1688 fl_set_choice (fd_form_paragraph->choice_space_below,
1691 case VSpace::LENGTH:
1692 fl_set_choice (fd_form_paragraph->choice_space_below,
1694 fl_set_input (fd_form_paragraph->input_space_below,
1695 current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1698 fl_set_button (fd_form_paragraph->check_space_below,
1699 current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1701 fl_set_button(fd_form_paragraph->check_noindent,
1702 current_view->text->cursor.par->FirstPhysicalPar()->noindent);
1704 if (current_view->buffer()->isReadonly()) {
1705 DisableParagraphLayout();
1707 EnableParagraphLayout();
1713 void MenuLayoutParagraph()
1715 if (UpdateLayoutParagraph()) {
1716 if (fd_form_paragraph->form_paragraph->visible) {
1717 fl_raise_form(fd_form_paragraph->form_paragraph);
1719 fl_show_form(fd_form_paragraph->form_paragraph,
1720 FL_PLACE_MOUSE, FL_FULLBORDER,
1721 _("Paragraph Environment"));
1728 void DeactivateDocumentButtons ()
1730 fl_deactivate_object (fd_form_document->button_ok);
1731 fl_deactivate_object (fd_form_document->button_apply);
1732 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1733 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1738 void ActivateDocumentButtons ()
1740 fl_activate_object (fd_form_document->button_ok);
1741 fl_activate_object (fd_form_document->button_apply);
1742 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1743 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1748 void DisableDocumentLayout ()
1750 DeactivateDocumentButtons ();
1751 fl_deactivate_object (fd_form_document->group_radio_separation);
1752 fl_deactivate_object (fd_form_document->radio_indent);
1753 fl_deactivate_object (fd_form_document->radio_skip);
1754 fl_deactivate_object (fd_form_document->choice_class);
1755 fl_deactivate_object (fd_form_document->choice_pagestyle);
1756 fl_deactivate_object (fd_form_document->choice_fonts);
1757 fl_deactivate_object (fd_form_document->choice_fontsize);
1758 fl_deactivate_object (fd_form_document->input_float_placement);
1759 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1760 fl_deactivate_object (fd_form_document->choice_inputenc);
1761 fl_deactivate_object (fd_form_document->group_radio_sides);
1762 fl_deactivate_object (fd_form_document->radio_sides_one);
1763 fl_deactivate_object (fd_form_document->radio_sides_two);
1764 fl_deactivate_object (fd_form_document->group_radio_columns);
1765 fl_deactivate_object (fd_form_document->radio_columns_one);
1766 fl_deactivate_object (fd_form_document->radio_columns_two);
1767 fl_deactivate_object (fd_form_document->input_extra);
1768 fl_deactivate_object (fd_form_document->choice_language);
1769 combo_language->deactivate();
1770 fl_deactivate_object (fd_form_document->input_default_skip);
1771 fl_deactivate_object (fd_form_document->choice_default_skip);
1772 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1773 fl_deactivate_object (fd_form_document->slider_tocdepth);
1774 fl_deactivate_object (fd_form_document->choice_spacing);
1775 fl_deactivate_object (fd_form_document->input_spacing);
1776 fl_deactivate_object (fd_form_document->check_use_amsmath);
1781 void EnableDocumentLayout ()
1783 ActivateDocumentButtons ();
1784 fl_activate_object (fd_form_document->group_radio_separation);
1785 fl_activate_object (fd_form_document->radio_indent);
1786 fl_activate_object (fd_form_document->radio_skip);
1787 fl_activate_object (fd_form_document->choice_class);
1788 fl_activate_object (fd_form_document->choice_pagestyle);
1789 fl_activate_object (fd_form_document->choice_fonts);
1790 fl_activate_object (fd_form_document->choice_fontsize);
1791 fl_activate_object (fd_form_document->input_float_placement);
1792 fl_activate_object (fd_form_document->choice_postscript_driver);
1793 fl_activate_object (fd_form_document->choice_inputenc);
1794 fl_activate_object (fd_form_document->group_radio_sides);
1795 fl_activate_object (fd_form_document->radio_sides_one);
1796 fl_activate_object (fd_form_document->radio_sides_two);
1797 fl_activate_object (fd_form_document->group_radio_columns);
1798 fl_activate_object (fd_form_document->radio_columns_one);
1799 fl_activate_object (fd_form_document->radio_columns_two);
1800 fl_activate_object (fd_form_document->input_extra);
1801 fl_activate_object (fd_form_document->choice_language);
1802 combo_language->activate();
1803 fl_activate_object (fd_form_document->input_default_skip);
1804 fl_activate_object (fd_form_document->choice_default_skip);
1805 fl_activate_object (fd_form_document->slider_secnumdepth);
1806 fl_activate_object (fd_form_document->slider_tocdepth);
1807 fl_activate_object (fd_form_document->choice_spacing);
1808 fl_activate_object (fd_form_document->input_spacing);
1809 fl_activate_object (fd_form_document->check_use_amsmath);
1813 bool UpdateLayoutDocument(BufferParams * params)
1815 if (!current_view->getScreen() || !current_view->available()) {
1816 if (fd_form_document->form_document->visible)
1817 fl_hide_form(fd_form_document->form_document);
1822 params = ¤t_view->buffer()->params;
1823 LyXTextClass const & tclass = textclasslist.TextClass(params->textclass);
1825 fl_set_choice_text(fd_form_document->choice_class,
1826 textclasslist.DescOfClass(params->textclass).c_str());
1827 combo_language->select_text(params->language.c_str());
1829 fl_set_choice_text(fd_form_document->choice_fonts,
1830 params->fonts.c_str());
1831 fl_set_choice_text(fd_form_document->choice_inputenc,
1832 params->inputenc.c_str());
1833 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1834 params->graphicsDriver.c_str());
1836 // ale970405+lasgoutt970513
1837 fl_clear_choice(fd_form_document->choice_fontsize);
1838 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1839 fl_addto_choice(fd_form_document->choice_fontsize,
1840 tclass.opt_fontsize().c_str());
1841 fl_set_choice(fd_form_document->choice_fontsize,
1842 tokenPos(tclass.opt_fontsize(), '|', params->fontsize) + 2);
1844 // ale970405+lasgoutt970513
1845 fl_clear_choice(fd_form_document->choice_pagestyle);
1846 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1847 fl_addto_choice(fd_form_document->choice_pagestyle,
1848 tclass.opt_pagestyle().c_str());
1850 fl_set_choice(fd_form_document->choice_pagestyle,
1851 tokenPos(tclass.opt_pagestyle(), '|', params->pagestyle) + 2);
1853 fl_set_button(fd_form_document->radio_indent, 0);
1854 fl_set_button(fd_form_document->radio_skip, 0);
1857 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1859 if (params->paragraph_separation == BufferParams::PARSEP_INDENT)
1860 fl_set_button(fd_form_document->radio_indent, 1);
1862 fl_set_button(fd_form_document->radio_skip, 1);
1864 switch (params->getDefSkip().kind()) {
1865 case VSpace::SMALLSKIP:
1866 fl_set_choice (fd_form_document->choice_default_skip, 1);
1868 case VSpace::MEDSKIP:
1869 fl_set_choice (fd_form_document->choice_default_skip, 2);
1871 case VSpace::BIGSKIP:
1872 fl_set_choice (fd_form_document->choice_default_skip, 3);
1874 case VSpace::LENGTH:
1875 fl_set_choice (fd_form_document->choice_default_skip, 4);
1876 fl_set_input (fd_form_document->input_default_skip,
1877 params->getDefSkip().asLyXCommand().c_str());
1880 fl_set_choice (fd_form_document->choice_default_skip, 2);
1884 fl_set_button(fd_form_document->radio_sides_one, 0);
1885 fl_set_button(fd_form_document->radio_sides_two, 0);
1887 switch (params->sides) {
1888 case LyXTextClass::OneSide:
1889 fl_set_button(fd_form_document->radio_sides_one, 1);
1891 case LyXTextClass::TwoSides:
1892 fl_set_button(fd_form_document->radio_sides_two, 1);
1896 fl_set_button(fd_form_document->radio_columns_one, 0);
1897 fl_set_button(fd_form_document->radio_columns_two, 0);
1899 if (params->columns == 2)
1900 fl_set_button(fd_form_document->radio_columns_two, 1);
1902 fl_set_button(fd_form_document->radio_columns_one, 1);
1904 fl_set_input(fd_form_document->input_spacing, "");
1905 switch (params->spacing.getSpace()) {
1906 case Spacing::Single:
1909 fl_set_choice(fd_form_document->choice_spacing, 1);
1912 case Spacing::Onehalf:
1915 fl_set_choice(fd_form_document->choice_spacing, 2);
1918 case Spacing::Double:
1921 fl_set_choice(fd_form_document->choice_spacing, 3);
1924 case Spacing::Other:
1926 fl_set_choice(fd_form_document->choice_spacing, 4);
1928 sprintf(sval, "%g", params->spacing.getValue());
1929 fl_set_input(fd_form_document->input_spacing, sval);
1935 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1936 params->secnumdepth);
1937 fl_set_counter_value(fd_form_document->slider_tocdepth,
1939 if (!params->float_placement.empty()) { // buffer local (Lgb)
1940 fl_set_input(fd_form_document->input_float_placement,
1941 params->float_placement.c_str());
1943 fl_set_input(fd_form_document->input_float_placement, "");
1945 if (!params->options.empty())
1946 fl_set_input(fd_form_document->input_extra,
1947 params->options.c_str());
1949 fl_set_input(fd_form_document->input_extra, "");
1951 if (current_view->buffer()->isSGML()) {
1952 // bullets not used in SGML derived documents
1953 fl_deactivate_object(fd_form_document->button_bullets);
1954 fl_set_object_lcol(fd_form_document->button_bullets,
1957 fl_activate_object(fd_form_document->button_bullets);
1958 fl_set_object_lcol(fd_form_document->button_bullets,
1962 if (current_view->buffer()->isReadonly()) {
1963 DisableDocumentLayout();
1965 EnableDocumentLayout();
1972 void MenuLayoutDocument()
1974 if (UpdateLayoutDocument()) {
1975 if (fd_form_document->form_document->visible) {
1976 fl_raise_form(fd_form_document->form_document);
1978 fl_show_form(fd_form_document->form_document,
1979 FL_PLACE_MOUSE, FL_FULLBORDER,
1980 _("Document Layout"));
1986 bool UpdateLayoutQuotes()
1989 if (!current_view->getScreen()
1990 || !current_view->available()
1991 || current_view->buffer()->isReadonly())
1995 fl_set_choice(fd_form_quotes->choice_quotes_language,
1996 current_view->buffer()->params.quotes_language + 1);
1997 fl_set_button(fd_form_quotes->radio_single, 0);
1998 fl_set_button(fd_form_quotes->radio_double, 0);
2000 if (current_view->buffer()->params.quotes_times == InsetQuotes::SingleQ)
2001 fl_set_button(fd_form_quotes->radio_single, 1);
2003 fl_set_button(fd_form_quotes->radio_double, 1);
2004 } else if (fd_form_quotes->form_quotes->visible) {
2005 fl_hide_form(fd_form_quotes->form_quotes);
2011 void MenuLayoutQuotes()
2013 if (UpdateLayoutQuotes()) {
2014 if (fd_form_quotes->form_quotes->visible) {
2015 fl_raise_form(fd_form_quotes->form_quotes);
2017 fl_show_form(fd_form_quotes->form_quotes,
2018 FL_PLACE_MOUSE, FL_FULLBORDER,
2025 bool UpdateLayoutPreamble()
2028 if (!current_view->getScreen() || ! current_view->available())
2032 fl_set_input(fd_form_preamble->input_preamble,
2033 current_view->buffer()->params.preamble.c_str());
2035 if (current_view->buffer()->isReadonly()) {
2036 fl_deactivate_object(fd_form_preamble->input_preamble);
2037 fl_deactivate_object(fd_form_preamble->button_ok);
2038 fl_deactivate_object(fd_form_preamble->button_apply);
2039 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
2040 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
2043 fl_activate_object(fd_form_preamble->input_preamble);
2044 fl_activate_object(fd_form_preamble->button_ok);
2045 fl_activate_object(fd_form_preamble->button_apply);
2046 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
2047 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
2049 } else if (fd_form_preamble->form_preamble->visible) {
2050 fl_hide_form(fd_form_preamble->form_preamble);
2055 void MenuLayoutPreamble()
2057 static int ow = -1, oh;
2059 if (UpdateLayoutPreamble()) {
2060 if (fd_form_preamble->form_preamble->visible) {
2061 fl_raise_form(fd_form_preamble->form_preamble);
2063 fl_show_form(fd_form_preamble->form_preamble,
2064 FL_PLACE_MOUSE | FL_FREE_SIZE,
2066 _("LaTeX Preamble"));
2068 ow = fd_form_preamble->form_preamble->w;
2069 oh = fd_form_preamble->form_preamble->h;
2071 fl_set_form_minsize(fd_form_preamble->form_preamble,
2078 void MenuLayoutSave()
2080 if (!current_view->getScreen() || ! current_view->available())
2083 if (AskQuestion(_("Do you want to save the current settings"),
2084 _("for Character, Document, Paper and Quotes"),
2085 _("as default for new documents?")))
2086 current_view->buffer()->saveParamsAsDefaults();
2090 void BufferView::insertNote()
2092 InsetInfo * new_inset = new InsetInfo();
2093 insertInset(new_inset);
2094 new_inset->Edit(0, 0);
2098 void BufferView::openStuff()
2101 owner()->getMiniBuffer()->Set(_("Open/Close..."));
2102 getScreen()->HideCursor();
2107 current_view->SetState();
2112 void BufferView::toggleFloat()
2115 owner()->getMiniBuffer()->Set(_("Open/Close..."));
2116 getScreen()->HideCursor();
2119 text->ToggleFootnote();
2121 current_view->SetState();
2126 void BufferView::menuUndo()
2129 owner()->getMiniBuffer()->Set(_("Undo"));
2130 getScreen()->HideCursor();
2133 if (!text->TextUndo())
2134 owner()->getMiniBuffer()->Set(_("No further undo information"));
2137 current_view->SetState();
2142 void BufferView::menuRedo()
2144 if (the_locking_inset) {
2145 owner()->getMiniBuffer()->Set(_("Redo not yet supported in math mode"));
2150 owner()->getMiniBuffer()->Set(_("Redo"));
2151 getScreen()->HideCursor();
2154 if (!text->TextRedo())
2155 owner()->getMiniBuffer()->Set(_("No further redo information"));
2158 current_view->SetState();
2163 void BufferView::hyphenationPoint()
2166 getScreen()->HideCursor();
2168 InsetSpecialChar * new_inset =
2169 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2170 insertInset(new_inset);
2175 void BufferView::ldots()
2178 getScreen()->HideCursor();
2180 InsetSpecialChar * new_inset =
2181 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2182 insertInset(new_inset);
2187 void BufferView::endOfSentenceDot()
2190 getScreen()->HideCursor();
2192 InsetSpecialChar * new_inset =
2193 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2194 insertInset(new_inset);
2199 void BufferView::menuSeparator()
2202 getScreen()->HideCursor();
2204 InsetSpecialChar * new_inset =
2205 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2206 insertInset(new_inset);
2211 void BufferView::newline()
2214 getScreen()->HideCursor();
2216 text->InsertChar(LyXParagraph::META_NEWLINE);
2222 void BufferView::protectedBlank()
2225 getScreen()->HideCursor();
2227 text->InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR);
2233 void BufferView::hfill()
2236 getScreen()->HideCursor();
2238 text->InsertChar(LyXParagraph::META_HFILL);
2244 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2245 They also show the current font state. */
2248 void ToggleAndShow(LyXFont const &);
2251 void FontSizeCB(string const & size)
2253 LyXFont font(LyXFont::ALL_IGNORE);
2254 font.setGUISize(size);
2255 ToggleAndShow(font);
2261 LyXFont font(LyXFont::ALL_IGNORE);
2262 font.setEmph(LyXFont::TOGGLE);
2263 ToggleAndShow(font);
2269 LyXFont font(LyXFont::ALL_IGNORE);
2270 font.setNoun(LyXFont::TOGGLE);
2271 ToggleAndShow(font);
2277 LyXFont font(LyXFont::ALL_IGNORE);
2278 font.setSeries(LyXFont::BOLD_SERIES);
2279 ToggleAndShow(font);
2285 LyXFont font(LyXFont::ALL_IGNORE);
2286 font.setUnderbar(LyXFont::TOGGLE);
2287 ToggleAndShow(font);
2293 LyXFont font(LyXFont::ALL_IGNORE);
2294 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2295 ToggleAndShow(font);
2301 LyXFont font(LyXFont::ALL_IGNORE);
2302 font.setFamily(LyXFont::SANS_FAMILY);
2303 ToggleAndShow(font);
2309 LyXFont font(LyXFont::ALL_IGNORE);
2310 font.setFamily(LyXFont::ROMAN_FAMILY);
2311 ToggleAndShow(font);
2317 LyXFont font(LyXFont::ALL_IGNORE);
2318 font.setLatex (LyXFont::TOGGLE);
2319 ToggleAndShow(font);
2324 LyXFont font(LyXFont::ALL_IGNORE);
2325 font.setDirection (LyXFont::TOGGLE_DIR);
2326 ToggleAndShow(font);
2333 LyXFont font(LyXFont::ALL_INHERIT);
2334 ToggleAndShow(font);
2338 /* -------> Returns the current font and depth by printing a message. In the
2339 * future perhaps we could try to implement a callback to the button-bar.
2340 * That is, `light' the bold button when the font is currently bold, etc.
2342 string CurrentState()
2345 if (current_view->available()) {
2346 // I think we should only show changes from the default
2348 Buffer * buffer = current_view->buffer();
2349 LyXFont font = current_view->text->real_current_font;
2350 LyXFont defaultfont = textclasslist.TextClass(buffer->
2351 params.textclass).defaultfont();
2352 font.reduce(defaultfont);
2353 state = _("Font: ") + font.stateText();
2355 int depth = current_view->text->GetDepth();
2357 state += string(_(", Depth: ")) + tostr(depth);
2363 // candidate for move to BufferView
2364 /* -------> Does the actual toggle job of the XxxCB() calls above.
2365 * Also shows the current font state.
2368 void ToggleAndShow(LyXFont const & font)
2370 if (current_view->available()) {
2371 current_view->getScreen()->HideCursor();
2372 current_view->update(-2);
2373 current_view->text->ToggleFree(font, toggleall);
2374 current_view->update(1);
2379 // candidate for move to BufferView
2380 extern "C" void MarginCB(FL_OBJECT *, long)
2382 if (current_view->available()) {
2383 current_view->owner()->getMiniBuffer()->Set(_("Inserting margin note..."));
2384 current_view->getScreen()->HideCursor();
2385 current_view->update(-2);
2386 current_view->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2387 current_view->update(1);
2392 extern "C" void FigureCB(FL_OBJECT *, long)
2394 if (fd_form_figure->form_figure->visible) {
2395 fl_raise_form(fd_form_figure->form_figure);
2397 fl_show_form(fd_form_figure->form_figure,
2398 FL_PLACE_MOUSE, FL_FULLBORDER,
2399 _("Insert Figure"));
2404 extern "C" void TableCB(FL_OBJECT *, long)
2406 if (fd_form_table->form_table->visible) {
2407 fl_raise_form(fd_form_table->form_table);
2409 fl_show_form(fd_form_table->form_table,
2410 FL_PLACE_MOUSE, FL_FULLBORDER,
2416 void BufferView::copyEnvironment()
2419 text->copyEnvironmentType();
2420 // clear the selection, even if mark_set
2421 getScreen()->ToggleSelection();
2422 text->ClearSelection();
2424 owner()->getMiniBuffer()->Set(_("Paragraph environment type copied"));
2429 void BufferView::pasteEnvironment()
2432 text->pasteEnvironmentType();
2433 owner()->getMiniBuffer()->Set(_("Paragraph environment type set"));
2439 void BufferView::copy()
2442 text->CopySelection();
2443 // clear the selection, even if mark_set
2444 getScreen()->ToggleSelection();
2445 text->ClearSelection();
2447 owner()->getMiniBuffer()->Set(_("Copy"));
2452 void BufferView::cut()
2455 getScreen()->HideCursor();
2457 text->CutSelection();
2459 owner()->getMiniBuffer()->Set(_("Cut"));
2464 void BufferView::paste()
2466 if (!available()) return;
2468 owner()->getMiniBuffer()->Set(_("Paste"));
2469 getScreen()->HideCursor();
2470 // clear the selection
2471 getScreen()->ToggleSelection();
2472 text->ClearSelection();
2476 text->PasteSelection();
2479 // clear the selection
2480 getScreen()->ToggleSelection();
2481 text->ClearSelection();
2486 // candidate for move to BufferView
2487 extern "C" void MeltCB(FL_OBJECT *, long)
2489 if (!current_view->available()) return;
2491 current_view->owner()->getMiniBuffer()->Set(_("Melt"));
2492 current_view->getScreen()->HideCursor();
2493 current_view->beforeChange();
2494 current_view->update(-2);
2495 current_view->text->MeltFootnoteEnvironment();
2496 current_view->update(1);
2500 // candidate for move to BufferView
2501 // Change environment depth.
2502 // if decInc == 0, depth change taking mouse button number into account
2503 // if decInc == 1, increment depth
2504 // if decInc == -1, decrement depth
2505 extern "C" void DepthCB(FL_OBJECT * ob, long decInc)
2509 /* When decInc != 0, fake a mouse button. This allows us to
2510 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2511 /* check out wether ob is defined, too (Matthias) */
2514 else if (!decInc && ob) {
2515 button = fl_get_button_numb(ob);
2518 if (current_view->available()) {
2519 current_view->getScreen()->HideCursor();
2520 current_view->update(-2);
2522 current_view->text->IncDepth();
2524 current_view->text->DecDepth();
2525 current_view->update(1);
2526 current_view->owner()->getMiniBuffer()->Set(_("Changed environment depth"
2527 " (in possible range, maybe not)"));
2532 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2533 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2534 LyXFont UserFreeFont()
2536 LyXFont font(LyXFont::ALL_IGNORE);
2538 int pos = fl_get_choice(fd_form_character->choice_family);
2540 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2541 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2542 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2543 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2544 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2547 pos = fl_get_choice(fd_form_character->choice_series);
2549 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2550 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2551 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2552 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2555 pos = fl_get_choice(fd_form_character->choice_shape);
2557 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2558 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2559 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2560 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2561 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2562 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2565 pos = fl_get_choice(fd_form_character->choice_size);
2567 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2568 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2569 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2570 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2571 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2572 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2573 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2574 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2575 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2576 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2577 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2578 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2579 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2580 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2583 pos = fl_get_choice(fd_form_character->choice_bar);
2585 case 1: font.setEmph(LyXFont::IGNORE);
2586 font.setUnderbar(LyXFont::IGNORE);
2587 font.setNoun(LyXFont::IGNORE);
2588 font.setLatex(LyXFont::IGNORE);
2590 case 2: font.setEmph(LyXFont::TOGGLE); break;
2591 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2592 case 4: font.setNoun(LyXFont::TOGGLE); break;
2593 case 5: font.setLatex(LyXFont::TOGGLE); break;
2594 case 6: font.setEmph(LyXFont::INHERIT);
2595 font.setUnderbar(LyXFont::INHERIT);
2596 font.setNoun(LyXFont::INHERIT);
2597 font.setLatex(LyXFont::INHERIT);
2601 pos = fl_get_choice(fd_form_character->choice_color);
2603 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2604 case 2: font.setColor(LyXFont::NONE); break;
2605 case 3: font.setColor(LyXFont::BLACK); break;
2606 case 4: font.setColor(LyXFont::WHITE); break;
2607 case 5: font.setColor(LyXFont::RED); break;
2608 case 6: font.setColor(LyXFont::GREEN); break;
2609 case 7: font.setColor(LyXFont::BLUE); break;
2610 case 8: font.setColor(LyXFont::CYAN); break;
2611 case 9: font.setColor(LyXFont::MAGENTA); break;
2612 case 10: font.setColor(LyXFont::YELLOW); break;
2613 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2622 ToggleAndShow(UserFreeFont());
2626 /* callbacks for form form_title */
2627 extern "C" void TimerCB(FL_OBJECT *, long)
2629 // only if the form still exists
2630 if (fd_form_title->form_title != 0) {
2631 if (fd_form_title->form_title->visible) {
2632 fl_hide_form(fd_form_title->form_title);
2634 fl_free_form(fd_form_title->form_title);
2635 fd_form_title->form_title = 0;
2640 /* callbacks for form form_paragraph */
2642 extern "C" void ParagraphVSpaceCB(FL_OBJECT * obj, long )
2644 // "Synchronize" the choices and input fields, making it
2645 // impossible to commit senseless data.
2647 FD_form_paragraph const * fp = fd_form_paragraph;
2649 if (obj == fp->choice_space_above) {
2650 if (fl_get_choice (fp->choice_space_above) != 7) {
2651 fl_set_input (fp->input_space_above, "");
2652 ActivateParagraphButtons();
2654 } else if (obj == fp->choice_space_below) {
2655 if (fl_get_choice (fp->choice_space_below) != 7) {
2656 fl_set_input (fp->input_space_below, "");
2657 ActivateParagraphButtons();
2659 } else if (obj == fp->input_space_above) {
2660 string input = fl_get_input (fp->input_space_above);
2662 if (input.empty()) {
2663 fl_set_choice (fp->choice_space_above, 1);
2664 ActivateParagraphButtons();
2666 else if (isValidGlueLength (input)) {
2667 fl_set_choice (fp->choice_space_above, 7);
2668 ActivateParagraphButtons();
2671 fl_set_choice (fp->choice_space_above, 7);
2672 DeactivateParagraphButtons();
2674 } else if (obj == fp->input_space_below) {
2675 string input = fl_get_input (fp->input_space_below);
2677 if (input.empty()) {
2678 fl_set_choice (fp->choice_space_below, 1);
2679 ActivateParagraphButtons();
2681 else if (isValidGlueLength (input)) {
2682 fl_set_choice (fp->choice_space_below, 7);
2683 ActivateParagraphButtons();
2686 fl_set_choice (fp->choice_space_below, 7);
2687 DeactivateParagraphButtons();
2693 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2695 if (!current_view->available())
2698 VSpace space_top, space_bottom;
2700 string labelwidthstring;
2703 // If a vspace kind is "Length" but there's no text in
2704 // the input field, reset the kind to "None".
2705 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2706 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2707 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2709 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2710 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2711 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2714 bool line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2715 bool line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2716 bool pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2717 bool pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2718 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2719 case 1: space_top = VSpace(VSpace::NONE); break;
2720 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2721 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2722 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2723 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2724 case 6: space_top = VSpace(VSpace::VFILL); break;
2725 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2727 if (fl_get_button (fd_form_paragraph->check_space_above))
2728 space_top.setKeep (true);
2729 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2730 case 1: space_bottom = VSpace(VSpace::NONE); break;
2731 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2732 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2733 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2734 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2735 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2736 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2738 if (fl_get_button (fd_form_paragraph->check_space_below))
2739 space_bottom.setKeep (true);
2741 if (fl_get_button(fd_form_paragraph->radio_align_left))
2742 align = LYX_ALIGN_LEFT;
2743 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2744 align = LYX_ALIGN_RIGHT;
2745 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2746 align = LYX_ALIGN_CENTER;
2748 align = LYX_ALIGN_BLOCK;
2750 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2751 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2753 current_view->text->SetParagraph(line_top,
2762 current_view->update(1);
2763 current_view->owner()->getMiniBuffer()->Set(_("Paragraph layout set"));
2767 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2769 fl_hide_form(fd_form_paragraph->form_paragraph);
2773 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2775 ParagraphApplyCB(ob, data);
2776 ParagraphCancelCB(ob, data);
2780 /* callbacks for form form_character */
2782 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2784 // we set toggleall locally here, since it should be true for
2785 // all other uses of ToggleAndShow() (JMarc)
2786 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2787 ToggleAndShow( UserFreeFont());
2792 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2794 fl_hide_form(fd_form_character->form_character);
2798 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2800 CharacterApplyCB(ob, data);
2801 CharacterCloseCB(ob, data);
2805 /* callbacks for form form_document */
2807 void UpdateDocumentButtons(BufferParams const & params)
2809 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2811 switch (params.sides) {
2812 case LyXTextClass::OneSide:
2813 fl_set_button(fd_form_document->radio_sides_one, 1);
2815 case LyXTextClass::TwoSides:
2816 fl_set_button(fd_form_document->radio_sides_two, 1);
2820 if (params.columns == 2)
2821 fl_set_button(fd_form_document->radio_columns_two, 1);
2823 fl_set_button(fd_form_document->radio_columns_one, 1);
2825 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2826 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2827 params.secnumdepth);
2828 fl_set_counter_value(fd_form_document->slider_tocdepth,
2833 extern "C" void ChoiceClassCB(FL_OBJECT * ob, long)
2836 if (textclasslist.Load(fl_get_choice(ob)-1)) {
2837 if (AskQuestion(_("Should I set some parameters to"),
2838 fl_get_choice_text(ob),
2839 _("the defaults of this document class?"))) {
2840 BufferParams params = BufferParams();
2841 params.textclass = fl_get_choice(ob)-1;
2842 params.useClassDefaults();
2843 UpdateLayoutDocument(¶ms);
2844 UpdateDocumentButtons(params);
2847 // unable to load new style
2848 WriteAlert(_("Conversion Errors!"),
2849 _("Unable to switch to new document class."),
2850 _("Reverting to original document class."));
2851 fl_set_choice(fd_form_document->choice_class,
2852 current_view->buffer()->params.textclass + 1);
2858 extern "C" void DocumentDefskipCB(FL_OBJECT * obj, long)
2860 // "Synchronize" the choice and the input field, so that it
2861 // is impossible to commit senseless data.
2862 FD_form_document const * fd = fd_form_document;
2864 if (obj == fd->choice_default_skip) {
2865 if (fl_get_choice (fd->choice_default_skip) != 4) {
2866 fl_set_input (fd->input_default_skip, "");
2867 ActivateDocumentButtons();
2869 } else if (obj == fd->input_default_skip) {
2871 char const * input = fl_get_input (fd->input_default_skip);
2874 fl_set_choice (fd->choice_default_skip, 2);
2875 ActivateDocumentButtons();
2876 } else if (isValidGlueLength (input)) {
2877 fl_set_choice (fd->choice_default_skip, 4);
2878 ActivateDocumentButtons();
2880 fl_set_choice (fd->choice_default_skip, 4);
2881 DeactivateDocumentButtons();
2887 extern "C" void DocumentSpacingCB(FL_OBJECT * obj, long)
2889 // "Synchronize" the choice and the input field, so that it
2890 // is impossible to commit senseless data.
2891 FD_form_document const * fd = fd_form_document;
2893 if (obj == fd->choice_spacing
2894 && fl_get_choice (fd->choice_spacing) != 4) {
2895 fl_set_input(fd->input_spacing, "");
2896 } else if (obj == fd->input_spacing) {
2898 const char* input = fl_get_input (fd->input_spacing);
2901 fl_set_choice (fd->choice_spacing, 1);
2903 fl_set_choice (fd->choice_spacing, 4);
2909 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2912 BufferParams *params = &(current_view->buffer()->params);
2913 current_view->buffer()->params.language =
2914 combo_language->getline();
2916 // If default skip is a "Length" but there's no text in the
2917 // input field, reset the kind to "Medskip", which is the default.
2918 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2919 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2920 fl_set_choice (fd_form_document->choice_default_skip, 2);
2923 /* this shouldn't be done automatically IMO. For example I write german
2924 * documents with an american keyboard very often. Matthias */
2926 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2927 fl_get_choice(fd_form_document->choice_language)); */
2929 fl_get_choice_text(fd_form_document->choice_fonts);
2931 fl_get_choice_text(fd_form_document->choice_inputenc);
2933 fl_get_choice_text(fd_form_document->choice_fontsize);
2935 fl_get_choice_text(fd_form_document->choice_pagestyle);
2936 params->graphicsDriver =
2937 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2938 params->use_amsmath =
2939 fl_get_button(fd_form_document->check_use_amsmath);
2941 if (!current_view->available())
2944 if (lyxrc->rtl_support) {
2945 current_view->text->SetCursor(current_view->text->cursor.par,
2946 current_view->text->cursor.pos);
2947 current_view->SetState();
2948 //minibuffer->Set(CurrentState());
2951 LyXTextClassList::ClassList::size_type new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2952 if (params->textclass != new_class) {
2953 // try to load new_class
2954 if (textclasslist.Load(new_class)) {
2955 // successfully loaded
2957 current_view->owner()->getMiniBuffer()->Set(_("Converting document to new document class..."));
2958 int ret = current_view->text->
2959 SwitchLayoutsBetweenClasses(current_view->buffer()->
2962 current_view->buffer()->
2968 s = _("One paragraph couldn't be converted");
2971 s += _(" paragraphs couldn't be converted");
2973 WriteAlert(_("Conversion Errors!"), s,
2974 _("into chosen document class"));
2977 params->textclass = new_class;
2979 // problem changing class -- warn user and retain old style
2980 WriteAlert(_("Conversion Errors!"),
2981 _("Unable to switch to new document class."),
2982 _("Reverting to original document class."));
2983 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2987 char tmpsep = params->paragraph_separation;
2988 if (fl_get_button(fd_form_document->radio_indent))
2989 params->paragraph_separation = BufferParams::PARSEP_INDENT;
2991 params->paragraph_separation = BufferParams::PARSEP_SKIP;
2992 if (tmpsep != params->paragraph_separation)
2995 VSpace tmpdefskip = params->getDefSkip();
2996 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2997 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2998 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2999 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
3000 case 4: params->setDefSkip(
3001 VSpace (LyXGlueLength (fl_get_input
3002 (fd_form_document->input_default_skip))));
3004 // DocumentDefskipCB assures that this never happens
3005 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
3007 if (!(tmpdefskip == params->getDefSkip()))
3010 if (fl_get_button(fd_form_document->radio_columns_two))
3011 params->columns = 2;
3013 params->columns = 1;
3014 if (fl_get_button(fd_form_document->radio_sides_two))
3015 params->sides = LyXTextClass::TwoSides;
3017 params->sides = LyXTextClass::OneSide;
3019 Spacing tmpSpacing = params->spacing;
3020 switch(fl_get_choice(fd_form_document->choice_spacing)) {
3022 lyxerr.debug() << "Spacing: SINGLE" << endl;
3023 params->spacing.set(Spacing::Single);
3026 lyxerr.debug() << "Spacing: ONEHALF" << endl;
3027 params->spacing.set(Spacing::Onehalf);
3030 lyxerr.debug() << "Spacing: DOUBLE" << endl;
3031 params->spacing.set(Spacing::Double);
3034 lyxerr.debug() << "Spacing: OTHER" << endl;
3035 params->spacing.set(Spacing::Other,
3036 fl_get_input(fd_form_document->input_spacing));
3039 if (tmpSpacing != params->spacing)
3042 signed char tmpchar =
3043 static_cast<signed char>(fl_get_counter_value(fd_form_document->slider_secnumdepth));
3044 if (params->secnumdepth != tmpchar)
3046 params->secnumdepth = tmpchar;
3049 static_cast<int>(fl_get_counter_value(fd_form_document->slider_tocdepth));
3051 params->float_placement =
3052 fl_get_input(fd_form_document->input_float_placement);
3054 // More checking should be done to ensure the string doesn't have
3055 // spaces or illegal placement characters in it. (thornley)
3058 current_view->redoCurrentBuffer();
3060 current_view->owner()->getMiniBuffer()->Set(_("Document layout set"));
3061 current_view->buffer()->markDirty();
3064 fl_get_input(fd_form_document->input_extra);
3069 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
3071 fl_hide_form(fd_form_document->form_document);
3075 extern "C" void DocumentOKCB(FL_OBJECT * ob, long data)
3077 DocumentCancelCB(ob, data);
3078 DocumentApplyCB(ob, data);
3082 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
3085 // bullet callbacks etc. in bullet_panel.C -- ARRae
3089 void BufferView::gotoNote()
3091 if (!getScreen()) return;
3093 getScreen()->HideCursor();
3098 if (!text->GotoNextNote()) {
3099 if (text->cursor.pos
3100 || text->cursor.par != text->FirstParagraph()) {
3102 text->cursor.par = text->FirstParagraph();
3103 text->cursor.pos = 0;
3104 if (!text->GotoNextNote()) {
3106 owner()->getMiniBuffer()->Set(_("No more notes"));
3110 owner()->getMiniBuffer()->Set(_("No more notes"));
3115 text->sel_cursor = text->cursor;
3119 void BufferView::insertCorrectQuote()
3123 if (text->cursor.pos)
3124 c = text->cursor.par->GetChar(text->cursor.pos - 1);
3128 insertInset(new InsetQuotes(c, buffer()->params));
3132 /* callbacks for form form_quotes */
3134 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
3136 if (!current_view->available())
3139 current_view->owner()->getMiniBuffer()->Set(_("Quotes type set"));
3140 //current_view->buffer()->params.quotes_language =
3141 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3142 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3143 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3145 lga = InsetQuotes::EnglishQ;
3148 lga = InsetQuotes::SwedishQ;
3151 lga = InsetQuotes::GermanQ;
3154 lga = InsetQuotes::PolishQ;
3157 lga = InsetQuotes::FrenchQ;
3160 lga = InsetQuotes::DanishQ;
3163 current_view->buffer()->params.quotes_language = lga;
3164 if (fl_get_button(fd_form_quotes->radio_single))
3165 current_view->buffer()->
3166 params.quotes_times = InsetQuotes::SingleQ;
3168 current_view->buffer()->
3169 params.quotes_times = InsetQuotes::DoubleQ;
3173 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
3175 fl_hide_form(fd_form_quotes->form_quotes);
3179 extern "C" void QuotesOKCB(FL_OBJECT * ob, long data)
3181 QuotesApplyCB(ob, data);
3182 QuotesCancelCB(ob, data);
3187 /* callbacks for form form_preamble */
3189 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
3191 fl_hide_form(fd_form_preamble->form_preamble);
3195 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
3197 if (!current_view->available())
3200 current_view->buffer()->params.preamble =
3201 fl_get_input(fd_form_preamble->input_preamble);
3202 current_view->buffer()->markDirty();
3203 current_view->owner()->getMiniBuffer()->Set(_("LaTeX preamble set"));
3207 extern "C" void PreambleOKCB(FL_OBJECT * ob, long data)
3209 PreambleApplyCB(ob, data);
3210 PreambleCancelCB(ob, data);
3214 /* callbacks for form form_table */
3216 extern "C" void TableApplyCB(FL_OBJECT *, long)
3218 if (!current_view->getScreen())
3221 // check for tables in tables
3222 if (current_view->text->cursor.par->table){
3223 WriteAlert(_("Impossible Operation!"),
3224 _("Cannot insert table in table."),
3229 current_view->owner()->getMiniBuffer()->Set(_("Inserting table..."));
3231 int ysize = int(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3232 int xsize = int(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3235 current_view->getScreen()->HideCursor();
3236 current_view->beforeChange();
3237 current_view->update(-2);
3239 current_view->text->SetCursorParUndo();
3240 current_view->text->FreezeUndo();
3242 current_view->text->BreakParagraph();
3243 current_view->update(-1);
3245 if (current_view->text->cursor.par->Last()) {
3246 current_view->text->CursorLeft();
3248 current_view->text->BreakParagraph();
3249 current_view->update(-1);
3252 current_view->text->current_font.setLatex(LyXFont::OFF);
3253 //if (!fl_get_button(fd_form_table->check_latex)){
3254 // insert the new wysiwy table
3255 current_view->text->SetLayout(0); // standard layout
3256 if (current_view->text->cursor.par->footnoteflag ==
3257 LyXParagraph::NO_FOOTNOTE) {
3259 ->SetParagraph(0, 0,
3261 VSpace (0.3 * current_view->buffer()->
3262 params.spacing.getValue(),
3264 VSpace (0.3 * current_view->buffer()->
3265 params.spacing.getValue(),
3273 ->SetParagraph(0, 0,
3275 VSpace(VSpace::NONE),
3276 VSpace(VSpace::NONE),
3281 current_view->text->cursor.par->table =
3282 new LyXTable(xsize, ysize);
3284 for (int i = 0; i < xsize * ysize - 1; ++i)
3285 current_view->text->cursor.par->InsertChar(0, LyXParagraph::META_NEWLINE);
3286 current_view->text->RedoParagraph();
3288 current_view->text->UnFreezeUndo();
3290 current_view->update(1);
3291 current_view->owner()->getMiniBuffer()->Set(_("Table inserted"));
3292 current_view->SetState();
3296 extern "C" void TableCancelCB(FL_OBJECT *, long)
3298 fl_hide_form(fd_form_table->form_table);
3302 extern "C" void TableOKCB(FL_OBJECT * ob, long data)
3304 TableApplyCB(ob, data);
3305 TableCancelCB(ob, data);
3309 /* callbacks for form form_print */
3311 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3313 fl_hide_form(fd_form_print->form_print);
3316 static bool stringOnlyContains (string const & LStr, char const * cset)
3318 char const * cstr = LStr.c_str() ;
3320 return strspn(cstr, cset) == strlen(cstr) ;
3323 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3325 if (!current_view->available())
3327 Buffer * buffer = current_view->buffer();
3328 string path = OnlyPath(buffer->fileName());
3331 if (fl_get_button(fd_form_print->radio_even_pages))
3332 pageflag = lyxrc->print_evenpage_flag + ' ';
3333 else if (fl_get_button(fd_form_print->radio_odd_pages))
3334 pageflag = lyxrc->print_oddpage_flag + ' ';
3336 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3337 // User may give a page (range) list
3338 // User may print multiple (unsorted) copies
3339 string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
3340 pages = subst(pages, '+',',');
3341 pages = frontStrip(strip(pages)) ;
3342 while (!pages.empty()) { // a page range was given
3344 pages = split (pages, piece, ',') ;
3345 piece = strip(piece) ;
3346 piece = frontStrip(piece) ;
3347 if ( !stringOnlyContains (piece, "0123456789-") ) {
3348 WriteAlert(_("ERROR! Unable to print!"),
3349 _("Check 'range of pages'!"));
3352 if (piece.find('-') == string::npos) { // not found
3353 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3354 } else if (suffixIs(piece, "-") ) { // missing last page
3355 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3356 } else if (prefixIs(piece, "-") ) { // missing first page
3357 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3359 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3363 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3364 if (!copies.empty()) { // a number of copies was given
3365 if ( !stringOnlyContains (copies, "0123456789") ) {
3366 WriteAlert(_("ERROR! Unable to print!"),
3367 _("Check 'number of copies'!"));
3370 if (fl_get_button(fd_form_print->do_unsorted))
3371 pageflag += lyxrc->print_copies_flag;
3373 pageflag += lyxrc->print_collcopies_flag;
3374 pageflag += " " + copies + ' ' ;
3378 if (fl_get_button(fd_form_print->radio_order_reverse))
3379 reverseflag = lyxrc->print_reverse_flag + ' ';
3381 string orientationflag;
3382 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
3383 orientationflag = lyxrc->print_landscape_flag + ' ';
3385 string ps_file = fl_get_input(fd_form_print->input_file);
3386 string printer = strip(fl_get_input(fd_form_print->input_printer));
3389 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3390 && ! printer.empty()) // a printer name has been given
3391 printerflag = lyxrc->print_to_printer + printer + ' ';
3394 if (!lyxrc->print_extra_options.empty())
3395 extraflags = lyxrc->print_extra_options + ' ';
3397 string command = lyxrc->print_command + ' '
3398 + printerflag + pageflag + reverseflag
3399 + orientationflag + extraflags;
3401 char real_papersize = buffer->params.papersize;
3402 if (real_papersize == BufferParams::PAPER_DEFAULT)
3403 real_papersize = lyxrc->default_papersize;
3406 switch (real_papersize) {
3407 case BufferParams::PAPER_USLETTER:
3410 case BufferParams::PAPER_A3PAPER:
3413 case BufferParams::PAPER_A4PAPER:
3416 case BufferParams::PAPER_A5PAPER:
3419 case BufferParams::PAPER_B5PAPER:
3422 case BufferParams::PAPER_EXECUTIVEPAPER:
3425 case BufferParams::PAPER_LEGALPAPER:
3428 default: /* If nothing else fits, keep an empty value... */
3432 if (buffer->params.use_geometry
3433 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
3434 && !lyxrc->print_paper_dimension_flag.empty()
3435 && !buffer->params.paperwidth.empty()
3436 && !buffer->params.paperheight.empty()) {
3437 // using a custom papersize
3439 command += lyxrc->print_paper_dimension_flag + ' ';
3440 command += buffer->params.paperwidth + ',';
3441 command += buffer->params.paperheight + ' ';
3442 } else if (!lyxrc->print_paper_flag.empty()
3444 && (real_papersize != BufferParams::PAPER_USLETTER ||
3445 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
3446 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3448 if (fl_get_button(fd_form_print->radio_file))
3449 command += lyxrc->print_to_file
3450 + QuoteName(MakeAbsPath(ps_file, path));
3451 else if (!lyxrc->print_spool_command.empty())
3452 command += lyxrc->print_to_file
3453 + QuoteName(ps_file);
3455 // push directorypath, if necessary
3456 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3457 path = buffer->tmppath;
3462 if (!lyxrc->print_spool_command.empty() &&
3463 !fl_get_button(fd_form_print->radio_file)) {
3464 string command2 = lyxrc->print_spool_command + ' ';
3465 if (!printer.empty())
3466 command2 += lyxrc->print_spool_printerprefix
3468 // First run dvips and, if succesful, then spool command
3469 if ((result = RunScript(buffer, true, command))) {
3470 result = RunScript(buffer, false, command2, ps_file);
3473 result = RunScript(buffer, false, command);
3476 WriteAlert(_("Error:"),
3477 _("Unable to print"),
3478 _("Check that your parameters are correct"));
3482 extern "C" void PrintOKCB(FL_OBJECT * ob, long data)
3484 PrintCancelCB(ob, data);
3485 PrintApplyCB(ob, data);
3489 /* callbacks for form form_figure */
3490 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3492 if (!current_view->available())
3495 Buffer * buffer = current_view->buffer();
3496 if(buffer->isReadonly()) // paranoia
3499 current_view->owner()->getMiniBuffer()->Set(_("Inserting figure..."));
3500 if (fl_get_button(fd_form_figure->radio_inline)
3501 || current_view->text->cursor.par->table) {
3502 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3503 current_view->insertInset(new_inset);
3504 current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
3505 new_inset->Edit(0, 0);
3509 current_view->getScreen()->HideCursor();
3510 current_view->update(-2);
3511 current_view->beforeChange();
3513 current_view->text->SetCursorParUndo();
3514 current_view->text->FreezeUndo();
3516 current_view->text->BreakParagraph();
3517 current_view->update(-1);
3519 if (current_view->text->cursor.par->Last()) {
3520 current_view->text->CursorLeft();
3522 current_view->text->BreakParagraph();
3523 current_view->update(-1);
3526 // The standard layout should always be numer 0;
3527 current_view->text->SetLayout(0);
3529 if (current_view->text->cursor.par->footnoteflag ==
3530 LyXParagraph::NO_FOOTNOTE) {
3531 current_view->text->
3534 VSpace (0.3 * buffer->params.spacing.getValue(),
3537 buffer->params.spacing.getValue(),
3539 LYX_ALIGN_CENTER, string(), 0);
3541 current_view->text->SetParagraph(0, 0,
3543 VSpace(VSpace::NONE),
3544 VSpace(VSpace::NONE),
3549 current_view->update(-1);
3551 Inset * new_inset = new InsetFig(100, 100, buffer);
3552 current_view->insertInset(new_inset);
3553 new_inset->Edit(0, 0);
3554 current_view->update(0);
3555 current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
3556 current_view->text->UnFreezeUndo();
3557 current_view->SetState();
3561 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3563 fl_hide_form(fd_form_figure->form_figure);
3567 extern "C" void FigureOKCB(FL_OBJECT * ob, long data)
3569 FigureApplyCB(ob, data);
3570 FigureCancelCB(ob, data);
3574 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3576 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3577 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3578 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3579 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3580 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3581 fontloader.update();
3583 // All buffers will need resize
3584 bufferlist.resize();
3586 current_view->owner()->getMiniBuffer()->Set(_("Screen options set"));
3590 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3592 fl_hide_form(fd_form_screen->form_screen);
3596 extern "C" void ScreenOKCB(FL_OBJECT * ob, long data)
3598 ScreenCancelCB(ob, data);
3599 ScreenApplyCB(ob, data);
3605 if (!current_view->available())
3608 fl_set_button(fd_latex_options->accents,
3609 int(current_view->buffer()->params.allowAccents));
3611 if (fd_latex_options->LaTeXOptions->visible) {
3612 fl_raise_form(fd_latex_options->LaTeXOptions);
3614 fl_show_form(fd_latex_options->LaTeXOptions,
3615 FL_PLACE_MOUSE, FL_FULLBORDER,
3616 _("LaTeX Options"));
3621 // This function runs "configure" and then rereads lyx.defaults to
3622 // reconfigure the automatic settings.
3625 current_view->owner()->getMiniBuffer()->Set(_("Running configure..."));
3627 // Run configure in user lyx directory
3628 Path p(user_lyxdir);
3629 Systemcalls one(Systemcalls::System,
3630 AddName(system_lyxdir, "configure"));
3632 current_view->owner()->getMiniBuffer()->Set(_("Reloading configuration..."));
3633 lyxrc->read(LibFileSearch(string(), "lyxrc.defaults"));
3634 WriteAlert(_("The system has been reconfigured."),
3635 _("You need to restart LyX to make use of any"),
3636 _("updated document class specifications."));
3640 /* these functions are for the spellchecker */
3641 char * BufferView::nextWord(float & value)
3648 char * string = text->SelectNextWord(value);
3654 void BufferView::selectLastWord()
3656 if (!available()) return;
3658 getScreen()->HideCursor();
3660 text->SelectSelectedWord();
3661 getScreen()->ToggleSelection(false);
3666 void BufferView::endOfSpellCheck()
3668 if (!available()) return;
3670 getScreen()->HideCursor();
3672 text->SelectSelectedWord();
3673 text->ClearSelection();
3678 void BufferView::replaceWord(string const & replacestring)
3680 if (!getScreen()) return;
3682 getScreen()->HideCursor();
3685 /* clear the selection (if there is any) */
3686 getScreen()->ToggleSelection(false);
3689 /* clear the selection (if there is any) */
3690 getScreen()->ToggleSelection(false);
3691 text->ReplaceSelectionWithString(replacestring.c_str());
3693 text->SetSelectionOverString(replacestring.c_str());
3695 // Go back so that replacement string is also spellchecked
3696 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3697 text->CursorLeftIntern();
3701 // End of spellchecker stuff
3706 // Table of Contents
3716 static TocList * toclist = 0;
3719 extern "C" void TocSelectCB(FL_OBJECT * ob, long)
3721 if (!current_view->available())
3724 TocList * tmptoclist = toclist;
3725 int i = fl_get_browser(ob);
3726 for (int a = 1; a < i && tmptoclist->next; ++a) {
3727 tmptoclist = tmptoclist->next;
3734 LyXParagraph * par = current_view->buffer()->paragraph;
3735 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3736 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3737 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3738 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3739 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3740 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3741 par->appendix != tmptoclist->appendix)) {
3742 par = par->LastPhysicalPar()->Next();
3746 current_view->beforeChange();
3747 current_view->text->SetCursor(par, 0);
3748 current_view->text->sel_cursor =
3749 current_view->text->cursor;
3750 current_view->update(0);
3753 WriteAlert(_("Error"),
3754 _("Couldn't find this label"),
3755 _("in current document."));
3761 extern "C" void TocCancelCB(FL_OBJECT *, long)
3763 fl_hide_form(fd_form_toc->form_toc);
3767 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3769 static LyXParagraph * stapar = 0;
3770 TocList * tmptoclist = 0;
3772 /* deleted the toclist */
3775 tmptoclist = toclist->next;
3777 toclist = tmptoclist;
3781 tmptoclist = toclist;
3784 fl_clear_browser(fd_form_toc->browser_toc);
3785 if (!current_view->available()) {
3786 fl_add_browser_line(fd_form_toc->browser_toc,
3787 _("*** No Document ***"));
3790 fl_hide_object(fd_form_toc->browser_toc);
3791 /* get the table of contents */
3792 LyXParagraph * par = current_view->buffer()->paragraph;
3794 char * line = new char[200];
3800 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3804 labeltype = textclasslist.Style(current_view->buffer()->params.textclass,
3805 par->GetLayout()).labeltype;
3807 if (labeltype >= LABEL_COUNTER_CHAPTER
3808 && labeltype <= LABEL_COUNTER_CHAPTER +
3809 current_view->buffer()->params.tocdepth) {
3810 /* insert this into the table of contents */
3811 /* first indent a little bit */
3815 textclasslist.TextClass(current_view->buffer()->
3816 params.textclass).maxcounter()) * 4 + 2;
3820 // Then the labestring
3821 if (!par->labelstring.empty()) {
3822 string::size_type i = 0;
3823 while (pos < 199 && i < par->labelstring.length()) {
3824 line[pos] = par->labelstring[i];
3833 /* now the contents */
3834 LyXParagraph::size_type i = 0;
3835 while (pos < 199 && i < par->size()) {
3836 c = par->GetChar(i);
3837 if (isprint(c) || c >= 128) {
3844 fl_add_browser_line(fd_form_toc->browser_toc, line);
3846 /* make a toclist entry */
3848 tmptoclist = new TocList;
3849 toclist = tmptoclist;
3851 tmptoclist->next = new TocList;
3852 tmptoclist = tmptoclist->next;
3855 tmptoclist->next = 0;
3857 for (a = 0; a < 6; ++a) {
3858 tmptoclist->counter[a] = par->GetFirstCounter(a);
3860 tmptoclist->appendix = par->appendix;
3862 par = par->LastPhysicalPar()->Next();
3866 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3867 fl_show_object(fd_form_toc->browser_toc);
3871 /* callbacks for form form_ref */
3872 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3874 if (!current_view->available())
3878 fl_get_browser_line(fd_form_ref->browser_ref,
3879 fl_get_browser(fd_form_ref->browser_ref));
3880 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3886 current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3896 if(current_view->buffer()->isSGML())
3897 t += "[" + u + "]" + "{" + s + "}";
3902 new InsetRef(t, current_view->buffer());
3903 current_view->insertInset(new_inset);
3907 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3909 if (!current_view->available()) {
3910 fl_clear_browser(fd_form_ref->browser_ref);
3914 FL_OBJECT * brow = fd_form_ref->browser_ref;
3916 // Get the current line, in order to restore it later
3917 char const * const btmp = fl_get_browser_line(brow,
3918 fl_get_browser(brow));
3919 string currentstr = btmp ? btmp : "";
3921 fl_clear_browser(brow);
3923 string refs = current_view->buffer()->getReferenceList('\n');
3926 #if FL_REVISION > 85
3927 fl_addto_browser_chars(brow, refs.c_str());
3928 int total_lines = fl_get_browser_maxline(brow);
3929 for (int i = 1; i <= total_lines ; ++i) {
3930 if (fl_get_browser_line(brow, i) == currentstr) {
3935 fl_set_browser_topline(brow, topline);
3937 // Keep the old ugly code for xforms 0.81 compatibility
3942 curr_ref = refs.token('\n', ref_num);
3943 if (curr_ref.empty())
3945 fl_add_browser_line(brow, curr_ref.c_str());
3950 if (!fl_get_browser_maxline(brow)) {
3951 fl_add_browser_line(brow,
3952 _("*** No labels found in document ***"));
3953 fl_deactivate_object(brow);
3955 fl_select_browser_line(brow, topline);
3956 fl_activate_object(brow);
3958 if (current_view->buffer()->isReadonly()) {
3959 // would be better to de/activate insert buttons
3960 // but that's more work... besides this works. ARRae
3961 fl_hide_form(fd_form_ref->form_ref);
3963 if (!current_view->buffer()->isSGML()) {
3964 fl_deactivate_object(fd_form_ref->ref_name);
3965 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3968 fl_activate_object(fd_form_ref->ref_name);
3969 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3974 extern "C" void RefHideCB(FL_OBJECT *, long)
3976 fl_hide_form(fd_form_ref->form_ref);
3980 // candidate for move to BufferView
3981 void UpdateInset(Inset * inset, bool mark_dirty)
3986 /* very first check for locking insets*/
3987 if (current_view->the_locking_inset == inset) {
3988 if (current_view->text->UpdateInset(inset)){
3989 current_view->update();
3991 if (current_view->buffer()->isLyxClean())
3992 current_view->owner()->getMiniBuffer()->setTimer(4);
3993 current_view->buffer()->markDirty();
3995 current_view->updateScrollbar();
4000 /* first check the current buffer */
4001 if (current_view->available()){
4002 current_view->getScreen()->HideCursor();
4003 current_view->update(-3);
4004 if (current_view->text->UpdateInset(inset)){
4006 current_view->update(1);
4008 current_view->update(3);
4013 // check all buffers
4014 bufferlist.updateInset(inset, mark_dirty);
4019 /* these functions return 1 if an error occured,
4021 int BufferView::lockInset(UpdatableInset * inset)
4023 if (!the_locking_inset && inset){
4024 the_locking_inset = inset;
4031 void BufferView::showLockedInsetCursor(long x, long y, int asc, int desc)
4033 if (the_locking_inset && getScreen()) {
4034 y += text->cursor.y;
4035 getScreen()->ShowManualCursor(x, y,
4041 void BufferView::hideLockedInsetCursor(long x, long y, int asc, int desc)
4043 if (the_locking_inset && getScreen()) {
4044 y += text->cursor.y;
4045 getScreen()->HideManualCursor(x, y,
4051 void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc)
4053 if (the_locking_inset && getScreen()){
4054 y += text->cursor.y;
4055 if (getScreen()->FitManualCursor(x, y, asc, desc))
4061 int BufferView::unlockInset(UpdatableInset * inset)
4063 if (inset && the_locking_inset == inset) {
4064 inset->InsetUnlock();
4065 the_locking_inset = 0;
4069 return bufferlist.unlockInset(inset);
4073 void BufferView::lockedInsetStoreUndo(Undo::undo_kind kind)
4075 if (!the_locking_inset)
4076 return; // shouldn't happen
4077 if (kind == Undo::EDIT) // in this case insets would not be stored!
4078 kind = Undo::FINISH;
4081 ParFromPos(text->cursor.pos)->previous,
4083 ParFromPos(text->cursor.pos)->next);
4087 void PutInsetIntoInsetUpdateList(Inset * inset)
4090 InsetUpdateStruct * tmp = new InsetUpdateStruct();
4092 tmp->next = InsetUpdateList;
4093 InsetUpdateList = tmp;
4097 void UpdateInsetUpdateList()
4099 InsetUpdateStruct * tmp = InsetUpdateList;
4101 UpdateInset(tmp->inset, false); // "false" because no document change
4105 // delete the update list
4106 while (InsetUpdateList) {
4107 tmp = InsetUpdateList;
4108 InsetUpdateList = InsetUpdateList->next;
4111 InsetUpdateList = 0;
4115 #ifdef WITH_WARNINGS
4118 // I know we shouldn't put anything in here but this seems the fastest
4119 // way to do this (and the cleanest for now). This function just inserts
4120 // a newline in the string and the inserts 'depth'-spaces so that the
4121 // code is indented in the right way!!!
4122 void addNewlineAndDepth(string & file, int const depth)
4125 file.append(depth, ' ');