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 * ====================================================== */
20 #include "support/lstrings.h"
22 #include FORMS_H_LOCATION
24 #include "layout_forms.h"
25 #include "bullet_forms.h"
26 #include "print_form.h"
28 #include "spellchecker.h"
32 #include "insets/insetref.h"
33 #include "insets/insetquotes.h"
35 #include "insets/insetlatex.h"
37 #include "insets/insetlabel.h"
38 #include "insets/insetinfo.h"
39 #include "insets/insetspecialchar.h"
40 #include "insets/figinset.h"
42 #include "latexoptions.h"
44 #include "minibuffer.h"
46 #include "bufferlist.h"
47 #include "support/filetools.h"
48 #include "support/path.h"
50 #include "lyx_gui_misc.h"
51 #include "LyXView.h" // only because of form_main
52 #include "lastfiles.h"
53 #include "support/FileInfo.h"
54 #include "lyxscreen.h"
56 #include "support/syscall.h"
57 #include "support/lyxlib.h"
58 #include "lyxserver.h"
59 #include "FontLoader.h"
65 extern MiniBuffer *minibuffer;
66 extern Combox *combo_language;
67 extern BufferList bufferlist;
68 extern void show_symbols_form();
69 extern FD_form_main *fd_form_main;
70 extern FD_form_title *fd_form_title;
71 extern FD_form_paragraph *fd_form_paragraph;
72 extern FD_form_character *fd_form_character;
73 extern FD_form_document *fd_form_document;
74 extern FD_form_quotes *fd_form_quotes;
75 extern FD_form_preamble *fd_form_preamble;
76 extern FD_form_table *fd_form_table;
77 extern FD_form_print *fd_form_print;
78 extern FD_form_figure *fd_form_figure;
79 extern FD_form_screen *fd_form_screen;
80 extern FD_form_toc *fd_form_toc;
81 extern FD_form_ref *fd_form_ref;
82 extern FD_LaTeXOptions *fd_latex_options;
83 extern FD_form_bullet *fd_form_bullet;
85 extern BufferView *current_view; // called too many times in this file...
87 extern void DeleteSimpleCutBuffer(); /* for the cleanup when exiting */
89 extern bool send_fax(string const &fname, string const &sendcmd);
91 extern LyXServer *lyxserver;
92 extern FontLoader fontloader;
94 // this should be static, but I need it in buffer.C
95 bool quitting; // flag, that we are quitting the program
96 extern bool finished; // all cleanup done just let it run through now.
98 char ascii_type; /* for selection notify callbacks */
100 bool scrolling = false;
102 char updatetimer = 0;
104 /* whether the work area should get callbacks */
105 bool input_prohibited = false;
107 /* the selection possible is needed, that only motion events are
108 * used, where the bottom press event was on the drawing area too */
109 bool selection_possible = false;
111 // This is used to make the dreaded font toggle problem hopefully go
112 // away. Definitely not the best solution, but I think it sorta works.
113 bool toggleall = true;
115 void InsertCorrectQuote();
119 This is the inset locking stuff needed for mathed --------------------
121 an inset can simple call LockInset in it's edit call and *ONLY* in it's
123 Inset::Edit() can only be called by the main lyx module.
125 Then the inset may modify the menu's and/or iconbars.
127 Unlocking is either done by LyX or the inset itself with a UnlockInset-call
129 During the lock, all button and keyboard events will be modified
130 and send to the inset through the following inset-features. Note that
131 Inset::InsetUnlock will be called from inside UnlockInset. It is meant
132 to contain the code for restoring the menus and things like this.
135 virtual void InsetButtonPress(int x, int y, int button);
136 virtual void InsetButtonRelease(int x, int y, int button);
137 virtual void InsetKeyPress(XKeyEvent *ev);
138 virtual void InsetMotionNotify(int x, int y, int state);
139 virtual void InsetUnlock();
141 If a inset wishes any redraw and/or update it just has to call
143 It's is completly irrelevant, where the inset is. UpdateInset will
144 find it in any paragraph in any buffer.
145 Of course the_locking_inset and the insets in the current paragraph/buffer
146 are checked first, so no performance problem should occur.
148 Hope that's ok for the beginning, Alejandro,
149 sorry that I needed so much time,
154 void UpdateInset(Inset* inset, bool mark_dirty = true);
155 /* these functions return 1 if an error occured,
157 // Now they work only for updatable insets. [Alejandro 080596]
158 int LockInset(UpdatableInset* inset);
159 void ToggleLockedInsetCursor(long x, long y, int asc, int desc);
160 void FitLockedInsetCursor(long x, long y, int asc, int desc);
161 int UnlockInset(UpdatableInset* inset);
162 void LockedInsetStoreUndo(Undo::undo_kind kind);
164 /* this is for asyncron updating. UpdateInsetUpdateList will be called
165 automatically from LyX. Just insert the Inset into the Updatelist */
166 void UpdateInsetUpdateList();
167 void PutInsetIntoInsetUpdateList(Inset* inset);
169 InsetUpdateStruct *InsetUpdateList = 0;
173 -----------------------------------------------------------------------
176 /* some function prototypes */
183 void HyphenationPoint();
184 void MenuSeparator();
187 void ProtectedBlank();
189 int RunLinuxDoc(int, string const &);
190 int RunDocBook(int, string const &);
191 void MenuWrite(Buffer* buf);
192 void MenuWriteAs(Buffer *buffer);
193 void MenuReload(Buffer *buf);
194 void MenuLayoutSave();
196 unsigned char GetCurrentTextClass()
197 // Who are we asking?
198 // Shouldn't this question be directed to the buffer?
199 // Indeed it should. Asger.
201 return current_view->buffer()->params.textclass;
205 // How should this actually work? Should it prohibit input in all BufferViews,
206 // or just in the current one? If "just the current one", then it should be
207 // placed in BufferView. If "all BufferViews" then LyXGUI (I think) should
208 // run "ProhibitInput" on all LyXViews which will run prohibitInput on all
209 // BufferViews. Or is it perhaps just the (input in) BufferViews in the
210 // current LyxView that should be prohibited (Lgb) (This applies to
211 // "AllowInput" as well.)
214 input_prohibited = true;
215 if (current_view->getScreen())
216 current_view->getScreen()->HideCursor();
218 static Cursor cursor;
219 static bool cursor_undefined = true;
221 if (cursor_undefined){
222 cursor = XCreateFontCursor(fl_display, XC_watch);
224 cursor_undefined = false;
227 /* set the cursor to the watch for all forms and the canvas */
228 XDefineCursor(fl_display, fd_form_main->form_main->window, cursor);
229 if (fd_form_paragraph->form_paragraph->visible)
230 XDefineCursor(fl_display,
231 fd_form_paragraph->form_paragraph->window,
233 if (fd_form_character->form_character->visible)
234 XDefineCursor(fl_display,
235 fd_form_character->form_character->window,
239 fl_deactivate_all_forms();
243 // Should find a way to move this into BufferView.C
244 void SetXtermCursor(Window win)
246 static Cursor cursor;
247 static char cursor_undefined = 1;
248 if (cursor_undefined){
249 cursor = XCreateFontCursor(fl_display, XC_xterm);
251 cursor_undefined = 0;
253 XDefineCursor(fl_display, win, cursor);
260 input_prohibited = false;
262 /* reset the cursor from the watch for all forms and the canvas */
264 XUndefineCursor(fl_display, fd_form_main->form_main->window);
265 if (fd_form_paragraph->form_paragraph->visible)
266 XUndefineCursor(fl_display,
267 fd_form_paragraph->form_paragraph->window);
268 if (fd_form_character->form_character->visible)
269 XUndefineCursor(fl_display,
270 fd_form_character->form_character->window);
271 if (current_view->getWorkArea()->belowmouse)
272 SetXtermCursor(fd_form_main->form_main->window);
275 fl_activate_all_forms();
279 void FreeUpdateTimer()
281 /* a real free timer would be better but I don't know
282 * how to do this with xforms */
287 void SetUpdateTimer(float time)
289 fl_set_timer(fd_form_main->timer_update, time);
296 current_view->getScreen()->ToggleSelection();
297 current_view->buffer()->text->ClearSelection();
302 void SmallUpdate(signed char f)
304 current_view->getScreen()->SmallUpdate();
305 if (current_view->getScreen()->TopCursorVisible()
306 != current_view->getScreen()->first){
307 current_view->buffer()->update(f);
311 current_view->fitCursor();
312 current_view->updateScrollbar();
314 if (!current_view->buffer()->text->selection)
315 current_view->buffer()->text->sel_cursor =
316 current_view->buffer()->text->cursor;
318 if (f == 1 || f == -1) {
319 if (current_view->buffer()->isLyxClean()) {
320 current_view->buffer()->markDirty();
321 minibuffer->setTimer(4);
324 current_view->buffer()->markDirty();
338 // should be moved to lyxfunc.C
339 void MenuWrite(Buffer* buf)
342 if (!bufferlist.write(buf)) {
343 string fname = buf->getFileName();
344 string s = MakeAbsPath(fname);
345 if (AskQuestion(_("Save failed. Rename and try again?"),
346 MakeDisplayPath(s, 50),
347 _("(If not, document is not saved.)"))) {
351 lastfiles->newFile(buf->getFileName());
356 // should be moved to BufferView.C
357 void MenuWriteAs(Buffer *buffer)
359 if (!buffer->text) return;
361 string fname = buffer->getFileName();
362 string oldname = fname;
366 fileDlg.SetButton(0, _("Documents"), lyxrc->document_path);
367 fileDlg.SetButton(1, _("Templates"), lyxrc->template_path);
369 if (!IsLyXFilename(fname))
372 fname = fileDlg.Select(_("Enter Filename to Save Document as"),
375 OnlyFilename(fname));
379 minibuffer->Set(_("Canceled."));
383 // Make sure the absolute filename ends with appropriate suffix
384 string s = MakeAbsPath(fname);
385 if (!IsLyXFilename(s))
388 // Same name as we have already?
390 if (!AskQuestion(_("Same name as document already has:"),
391 MakeDisplayPath(s, 50),
394 // Falls through to name change and save
396 // No, but do we have another file with this name open?
397 else if (bufferlist.exists(s)) {
398 if (AskQuestion(_("Another document with same name open!"),
399 MakeDisplayPath(s, 50),
400 _("Replace with current document?")))
402 bufferlist.close(bufferlist.getBuffer(s));
404 // Ok, change the name of the buffer, but don't save!
405 buffer->setFileName(s);
408 minibuffer->Set(_("Document renamed to '"),
410 _("', but not saved..."));
413 } // Check whether the file exists
416 if (myfile.isOK() && !AskQuestion(_("Document already exists:"),
417 MakeDisplayPath(s, 50),
422 // Ok, change the name of the buffer
423 buffer->setFileName(s);
426 // Small bug: If the save fails, we have irreversible changed the name
432 int MenuRunLaTeX(Buffer *buffer)
436 if (buffer->isLinuxDoc())
437 ret = RunLinuxDoc(1, buffer->getFileName());
438 else if (buffer->isLiterate())
439 ret = buffer->runLiterate();
440 else if (buffer->isDocBook())
441 ret = RunDocBook(1, buffer->getFileName());
443 ret = buffer->runLaTeX();
449 s = _("One error detected");
450 t = _("You should try to fix it.");
453 s += _(" errors detected.");
454 t = _("You should try to fix them.");
456 WriteAlert(_("There were errors during the LaTeX run."), s, t);
462 int MenuBuildProg(Buffer *buffer)
466 if (buffer->isLiterate())
467 ret = buffer->buildProgram();
471 s = _("Wrong type of document");
472 t = _("The Build operation is not allowed in this document");
473 WriteAlert(_("There were errors during the Build process."), s, t);
481 s = _("One error detected");
482 t = _("You should try to fix it.");
485 s += _(" errors detected.");
486 t = _("You should try to fix them.");
488 WriteAlert(_("There were errors during the Build process."), s, t);
494 int MenuRunChktex(Buffer *buffer)
498 if (buffer->isSGML()) {
499 WriteAlert(_("Chktex does not work with SGML derived documents."));
502 ret = buffer->runChktex();
508 s = _("No warnings found.");
509 } else if (ret == 1) {
510 s = _("One warning found.");
511 t = _("Use 'Edit->Go to Error' to find it.");
514 s += _(" warnings found.");
515 t = _("Use 'Edit->Go to Error' to find them.");
517 WriteAlert(_("Chktex run successfully"), s, t);
519 WriteAlert(_("Error!"), _("It seems chktex does not work."));
525 int MakeDVIOutput(Buffer *buffer)
532 string path = OnlyPath(buffer->getFileName());
533 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
534 path = buffer->tmppath;
536 if (!buffer->isDviClean()) {
538 ret = MenuRunLaTeX(buffer);
544 /* wait == false means don't wait for termination */
545 /* wait == true means wait for termination */
546 // The bool should be placed last on the argument line. (Lgb)
547 // Returns false if we fail.
548 bool RunScript(Buffer * buffer, bool wait,
549 string const & command, string const & orgname = string(),
550 bool need_shell = true)
554 string name = orgname;
557 if (MakeDVIOutput(buffer) > 0)
559 /* get DVI-Filename */
561 name = ChangeExtension(buffer->getFileName(),
564 path = OnlyPath(name);
565 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
566 path = buffer->tmppath;
570 cmd = command + ' ' + SpaceLess(name);
578 // OS/2 cmd.exe has another use for '&'
580 // This is not NLS safe, but it's OK, I think.
581 string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
583 // COMSPEC is set, unless user unsets
584 sh = OnlyFilename(GetEnvPath("COMSPEC"));
589 if (contains(sh, "cmd.exe")
590 || contains(sh, "4os2.exe"))
591 cmd = "start /min/n " + cmd;
596 // It seems that, if wait is false, we never get back
597 // the return code of the command. This means that all
598 // the code I added in PrintApplyCB is currently
601 #warning What should we do here?
603 minibuffer->Set(_("Executing command:"), cmd);
604 result = one.startscript(Systemcalls::System, cmd);
606 minibuffer->Set(_("Executing command:"), cmd);
607 result = one.startscript(wait ? Systemcalls::Wait
608 : Systemcalls::DontWait, cmd);
610 return (result == 0);
614 // Returns false if we fail
615 bool MenuRunDvips(Buffer *buffer, bool wait = false)
623 if (MakeDVIOutput(buffer) > 0) {
627 // Generate postscript file
628 string ps = ChangeExtension (buffer->getFileName(),
633 char real_papersize = buffer->params.papersize;
634 if (real_papersize == BufferParams::PAPER_DEFAULT)
635 real_papersize = lyxrc->default_papersize;
637 switch (real_papersize) {
638 case BufferParams::PAPER_USLETTER:
641 case BufferParams::PAPER_A3PAPER:
644 case BufferParams::PAPER_A4PAPER:
647 case BufferParams::PAPER_A5PAPER:
650 case BufferParams::PAPER_B5PAPER:
653 case BufferParams::PAPER_EXECUTIVEPAPER:
656 case BufferParams::PAPER_LEGALPAPER:
659 default: /* If nothing else fits, keep an empty value... */
663 // Make postscript file.
664 string command = "dvips " + lyxrc->print_to_file + ' ';
665 command += SpaceLess(ps);
666 if (buffer->params.use_geometry
667 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
668 && !lyxrc->print_paper_dimension_flag.empty()
669 && !buffer->params.paperwidth.empty()
670 && !buffer->params.paperheight.empty()) {
671 // using a custom papersize
673 command += lyxrc->print_paper_dimension_flag + ' ';
674 command += buffer->params.paperwidth + ',';
675 command += buffer->params.paperheight;
676 } else if (!paper.empty()
677 && (real_papersize != BufferParams::PAPER_USLETTER ||
678 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
679 // dvips won't accept -t letter -t landscape. In all other
680 // cases, include the paper size explicitly.
682 command += lyxrc->print_paper_flag + ' ' + paper;
684 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE) {
686 command += lyxrc->print_landscape_flag;
688 // push directorypath, if necessary
689 string path = OnlyPath(buffer->getFileName());
690 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
691 path = buffer->tmppath;
694 bool ret = RunScript(buffer, wait, command);
700 // Returns false if we fail
701 bool MenuPreviewPS(Buffer *buffer)
706 // Generate postscript file
707 if (!MenuRunDvips(buffer, true)) {
711 // Start postscript viewer
713 string ps = ChangeExtension (buffer->getFileName(),
715 // push directorypath, if necessary
716 string path = OnlyPath(buffer->getFileName());
717 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
718 path = buffer->tmppath;
721 bool ret = RunScript(buffer, false, lyxrc->view_ps_command, ps);
727 void MenuFax(Buffer *buffer)
732 // Generate postscript file
733 if (!MenuRunDvips(buffer, true)) {
738 string ps = ChangeExtension (buffer->getFileName(), ".ps_tmp", true);
739 string path = OnlyPath (buffer->getFileName());
740 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
741 path = buffer->tmppath;
744 if (!lyxrc->fax_program.empty()) {
745 string help2 = subst(lyxrc->fax_program, "$$FName", ps);
747 Systemcalls one(Systemcalls::System, help2);
749 send_fax(ps, lyxrc->fax_command);
753 // Returns false if we fail
754 bool MenuPreview(Buffer *buffer)
761 char real_papersize = buffer->params.papersize;
762 if (real_papersize == BufferParams::PAPER_DEFAULT)
763 real_papersize = lyxrc->default_papersize;
765 switch (real_papersize) {
766 case BufferParams::PAPER_USLETTER:
769 case BufferParams::PAPER_A3PAPER:
772 case BufferParams::PAPER_A4PAPER:
775 case BufferParams::PAPER_A5PAPER:
778 case BufferParams::PAPER_B5PAPER:
781 case BufferParams::PAPER_EXECUTIVEPAPER:
784 case BufferParams::PAPER_LEGALPAPER:
787 default: /* If nothing else fits, keep the empty value */
792 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
793 // we HAVE to give a size when the page is in
794 // landscape, so use USletter.
795 paper = " -paper usr";
797 paper = " -paper " + paper;
798 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
802 // push directorypath, if necessary
803 string path = OnlyPath(buffer->getFileName());
804 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
805 path = buffer->tmppath;
809 string command = lyxrc->view_dvi_command + paper ;
810 bool ret = RunScript(buffer, false, command);
815 void MenuMakeLaTeX(Buffer * buffer)
818 // Get LaTeX-Filename
819 string s = SpaceLess(ChangeExtension(
820 buffer->getFileName(),
823 FilePtr myfile(s, FilePtr::read);
825 !AskQuestion(_("File already exists:"),
826 MakeDisplayPath(s, 50),
827 _("Do you want to overwrite the file?"))) {
828 minibuffer->Set(_("Canceled"));
832 if (buffer->isDocBook())
833 minibuffer->Set(_("DocBook does not have a latex backend"));
835 if (buffer->isLinuxDoc())
836 RunLinuxDoc(0, buffer->getFileName());
838 buffer->makeLaTeXFile(s, string(), true);
839 minibuffer->Set(_("Nice LaTeX file saved as"),
841 buffer->markDviDirty();
847 void MenuMakeLinuxDoc(Buffer *buffer)
851 if (!buffer->isLinuxDoc()) {
852 WriteAlert(_("Error!"), _("Document class must be linuxdoc."));
856 // Get LinuxDoc-Filename
857 string s = ChangeExtension (buffer->getFileName(),
860 FilePtr myfile(s, FilePtr::read);
862 !AskQuestion(_("File already exists:"),
863 MakeDisplayPath(s, 50),
864 _("Do you want to overwrite the file?"))) {
865 minibuffer->Set(_("Canceled"));
869 minibuffer->Set(_("Building LinuxDoc SGML file `"),
870 MakeDisplayPath(s), "'...");
872 buffer->makeLinuxDocFile(s, 65);
874 minibuffer->Set(_("LinuxDoc SGML file save as"),
880 void MenuMakeDocBook(Buffer *buffer)
884 if (!buffer->isDocBook()) {
885 WriteAlert(_("Error!"), _("Document class must be docbook."));
889 // Get DocBook-Filename
890 string s = ChangeExtension (buffer->getFileName(),
893 FilePtr myfile(s, FilePtr::read);
895 !AskQuestion(_("File already exists:"),
896 MakeDisplayPath(s, 50),
897 _("Do you want to overwrite the file?"))) {
898 minibuffer->Set(_("Canceled"));
902 minibuffer->Set(_("Building DocBook SGML file `"),
903 MakeDisplayPath(s), "'...");
905 buffer->makeDocBookFile(s, 65);
907 minibuffer->Set(_("DocBook SGML file save as"),
913 void MenuMakeAscii(Buffer *buffer)
916 /* get LaTeX-Filename */
917 string s = ChangeExtension (buffer->getFileName(),
920 FilePtr myfile(s, FilePtr::read);
922 !AskQuestion(_("File already exists:"),
923 MakeDisplayPath(s, 50),
924 _("Do you want to overwrite the file?"))) {
925 minibuffer->Set(_("Canceled"));
929 buffer->writeFileAscii(s, lyxrc->ascii_linelen);
931 minibuffer->Set(_("Ascii file saved as"), MakeDisplayPath(s));
936 void MenuPrint(Buffer *buffer)
943 input_file = ChangeExtension(buffer->getFileName(),
944 lyxrc->print_file_extension,
946 fl_set_input(fd_form_print->input_file, input_file.c_str());
948 if (fd_form_print->form_print->visible) {
949 fl_raise_form(fd_form_print->form_print);
952 fl_show_form(fd_form_print->form_print,
953 FL_PLACE_MOUSE, FL_FULLBORDER,
961 lyxerr.debug() << "Running QuitLyX." << endl;
963 if (!bufferlist.QwriteAll())
966 lastfiles->writeFile(lyxrc->lastfiles);
968 // Set a flag that we do quitting from the program,
969 // so no refreshes are necessary.
972 // close buffers first
973 bufferlist.closeAll();
975 // do any other cleanup procedures now
976 lyxerr.debug() << "Deleting tmp dir " << system_tempdir << endl;
978 DestroyLyXTmpDir(system_tempdir);
986 // should probably be moved into BufferList (Lgb)
987 // Perfect target for a thread...
989 if (!current_view->getScreen() || !current_view->available())
992 if (current_view->buffer()->isBakClean()
993 || current_view->buffer()->isReadonly()) {
994 // We don't save now, but we'll try again later
995 current_view->owner()->resetAutosaveTimer();
999 minibuffer->Set(_("Autosaving current document..."));
1001 // create autosave filename
1002 string fname = OnlyPath(current_view->buffer()->getFileName());
1004 fname += OnlyFilename(current_view->buffer()->getFileName());
1007 // tmp_ret will be located (usually) in /tmp
1008 // will that be a problem?
1009 string tmp_ret = tmpnam(0);
1011 pid_t pid = fork(); // If you want to debug the autosave
1012 // you should set pid to -1, and comment out the
1014 if (pid == 0 || pid == -1) {
1015 // pid = -1 signifies that lyx was unable
1016 // to fork. But we will do the save
1018 bool failed = false;
1019 if (!tmp_ret.empty()) {
1020 current_view->buffer()->writeFile(tmp_ret, 1);
1021 // assume successful write of tmp_ret
1022 if (rename(tmp_ret.c_str(), fname.c_str()) == -1) {
1024 // most likely couldn't move between filesystems
1025 // unless write of tmp_ret failed
1026 // so remove tmp file (if it exists)
1027 remove(tmp_ret.c_str());
1034 // failed to write/rename tmp_ret so try writing direct
1035 if (!current_view->buffer()->writeFile(fname, 1)) {
1036 // It is dangerous to do this in the child,
1037 // but safe in the parent, so...
1039 minibuffer->Set(_("Autosave Failed!"));
1042 if (pid == 0) { // we are the child so...
1047 current_view->buffer()->markBakClean();
1048 current_view->owner()->resetAutosaveTimer();
1053 // (c) CHT Software Service GmbH
1056 // create new file with template
1059 Buffer * NewLyxFile(string const & filename)
1061 // Split argument by :
1063 string tmpname = split(filename, name, ':');
1064 #ifdef __EMX__ // Fix me! lyx_cb.C may not be low level enough to allow this.
1065 if (name.length() == 1
1066 && isalpha(static_cast<unsigned char>(name[0]))
1067 && (prefixIs(tmpname, "/") || prefixIs(tmpname, "\\"))) {
1069 name += token(tmpname, ':', 0);
1070 tmpname = split(tmpname, ':');
1073 lyxerr.debug() << "Arg is " << filename
1074 << "\nName is " << name
1075 << "\nTemplate is " << tmpname << endl;
1077 // find a free buffer
1078 Buffer *tmpbuf = bufferlist.newFile(name, tmpname);
1080 lastfiles->newFile(tmpbuf->getFileName());
1085 // Insert ascii file (if filename is empty, prompt for one)
1086 void InsertAsciiFile(string const & f, bool asParagraph)
1089 LyXParagraph *tmppar;
1092 if (!current_view->getScreen()) return;
1094 if (fname.empty()) {
1096 fname = fileDlg.Select(_("File to Insert"),
1097 current_view->owner()->buffer()->filepath,
1100 if (fname.empty()) return;
1104 FilePtr myfile(fname, FilePtr::read);
1106 if (!fi.exist() || !fi.readable() || !myfile()) {
1107 WriteFSAlert(_("Error! Cannot open specified file:"),
1108 MakeDisplayPath(fname, 50));
1112 tmppar = new LyXParagraph;
1113 tmppar->readSimpleWholeFile(myfile);
1115 // set the end of the string
1116 #warning why do we do this?
1117 // I don't think this is needed. Actually it might be plain wrong.
1118 tmppar->InsertChar(tmppar->text.size() - 1,'\0');
1120 // insert the string
1121 current_view->getScreen()->HideCursor();
1123 // clear the selection
1126 current_view->buffer()->text->InsertStringA(tmppar->text);
1128 current_view->buffer()->text->InsertStringB(tmppar->text);
1130 current_view->buffer()->update(1);
1134 void MenuShowTableOfContents()
1136 static int ow = -1, oh;
1139 if (fd_form_toc->form_toc->visible) {
1140 fl_raise_form(fd_form_toc->form_toc);
1142 fl_show_form(fd_form_toc->form_toc,
1143 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1144 _("Table Of Contents"));
1146 ow = fd_form_toc->form_toc->w;
1147 oh = fd_form_toc->form_toc->h;
1149 fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
1154 void MenuInsertLabel(char const *arg)
1158 //string label = fl_show_input(_("Enter new label to insert:"), "");
1160 label = frontStrip(strip(askForText(_("Enter new label to insert:"))));
1161 if (!label.empty()) {
1162 InsetLabel *new_inset = new InsetLabel;
1163 new_inset->setContents(label);
1164 current_view->buffer()->insertInset(new_inset);
1170 void MenuInsertRef()
1172 static int ow = -1, oh;
1175 if (fd_form_ref->form_ref->visible) {
1176 fl_raise_form(fd_form_ref->form_ref);
1178 fl_show_form(fd_form_ref->form_ref,
1179 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1180 _("Insert Reference"));
1182 ow = fd_form_ref->form_ref->w;
1183 oh = fd_form_ref->form_ref->h;
1185 fl_set_form_minsize(fd_form_ref->form_ref, ow, oh);
1190 void MenuPasteSelection(char at)
1192 if (!current_view->getScreen())
1197 Atom data_prop = XInternAtom(fl_display,
1200 if (data_prop == None)
1202 XConvertSelection(fl_display,
1203 XA_PRIMARY, XA_STRING, data_prop,
1204 fd_form_main->form_main->window, 0);
1209 extern "C" void FootCB(FL_OBJECT*, long)
1211 if (!current_view->available())
1214 minibuffer->Set(_("Inserting Footnote..."));
1215 current_view->getScreen()->HideCursor();
1216 current_view->buffer()->update(-2);
1217 current_view->buffer()->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1218 current_view->buffer()->update(1);
1222 void LayoutsCB(int sel, void *)
1224 string tmp = tostr(sel);
1225 current_view->owner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1231 * SGML Linuxdoc support:
1232 * (flag == -1) import SGML file
1233 * (flag == 0) make TeX output
1234 * (flag == 1) make dvi output
1236 int RunLinuxDoc(int flag, string const & filename)
1245 /* generate a path-less extension name */
1246 name = ChangeExtension (filename, ".sgml", true);
1247 path = OnlyPath (filename);
1248 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1249 path = current_view->buffer()->tmppath;
1254 if (!current_view->available())
1256 current_view->buffer()->makeLinuxDocFile(name, 0);
1257 #ifdef WITH_WARNINGS
1258 #warning remove this once we have a proper geometry class
1260 BufferParams::PAPER_SIZE ps = static_cast<BufferParams::PAPER_SIZE>(current_view->buffer()->params.papersize);
1262 case BufferParams::PAPER_A4PAPER: add_flags = "-p a4"; break;
1263 case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
1264 default: /* nothing to be done yet ;-) */ break;
1272 case -1: /* Import file */
1273 minibuffer->Set(_("Importing LinuxDoc SGML file `"),
1274 MakeDisplayPath(filename), "'...");
1275 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1277 if (one.startscript(Systemcalls::System, s2))
1280 case 0: /* TeX output asked */
1281 minibuffer->Set(_("Converting LinuxDoc SGML to TeX file..."));
1282 s2 = "sgml2latex " + add_flags + " -o tex "
1283 + lyxrc->sgml_extra_options + ' ' + name;
1284 if (one.startscript(Systemcalls::System, s2))
1287 case 1: /* dvi output asked */
1288 minibuffer->Set(_("Converting LinuxDoc SGML to dvi file..."));
1289 s2 = "sgml2latex " + add_flags + " -o dvi "
1290 + lyxrc->sgml_extra_options + ' ' + name;
1291 if (one.startscript(Systemcalls::System, s2)) {
1294 current_view->buffer()->markDviClean();
1296 default: /* unknown output */
1302 current_view->buffer()->redraw();
1308 * SGML DocBook support:
1309 * (flag == 1) make dvi output
1311 int RunDocBook(int flag, string const & filename)
1319 /* generate a path-less extension name */
1320 name = ChangeExtension (filename, ".sgml", true);
1321 path = OnlyPath (filename);
1322 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1323 path = current_view->buffer()->tmppath;
1327 if (!current_view->available())
1330 current_view->buffer()->makeDocBookFile(name, 0);
1332 // Shall this code go or should it stay? (Lgb)
1333 // string add_flags;
1334 // LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->buffer()->params.papersize;
1336 // case BufferParams::PAPER_A4PAPER: add_flags = "-p a4"; break;
1337 // case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
1338 // default: /* nothing to be done yet ;-) */ break;
1344 case 1: /* dvi output asked */
1345 minibuffer->Set(_("Converting DocBook SGML to dvi file..."));
1346 s2 = "sgmltools --backend dvi " + name;
1347 if (one.startscript(Systemcalls::System, s2)) {
1350 current_view->buffer()->markDviClean();
1352 default: /* unknown output */
1358 current_view->buffer()->redraw();
1363 void AllFloats(char flag, char figmar)
1365 if (!current_view->available())
1368 LyXCursor cursor = current_view->buffer()->text->cursor;
1370 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1372 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1373 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1375 && cursor.par->footnotekind != LyXParagraph::FIG
1376 && cursor.par->footnotekind != LyXParagraph::TAB
1377 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1378 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1379 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1384 LyXCursor tmpcursor = cursor;
1385 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1386 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1388 LyXParagraph *par = current_view->buffer()->paragraph;
1391 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1395 par->footnotekind != LyXParagraph::FOOTNOTE
1397 par->footnotekind != LyXParagraph::MARGIN
1402 par->footnotekind != LyXParagraph::FIG
1404 par->footnotekind != LyXParagraph::TAB
1406 par->footnotekind != LyXParagraph::WIDE_FIG
1408 par->footnotekind != LyXParagraph::WIDE_TAB
1410 par->footnotekind != LyXParagraph::ALGORITHM
1415 && par->previous->footnoteflag !=
1416 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1417 current_view->buffer()->text->SetCursorIntern(par->previous,
1419 current_view->buffer()->text->OpenFootnote();
1424 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1428 par->footnotekind != LyXParagraph::FOOTNOTE
1430 par->footnotekind != LyXParagraph::MARGIN
1435 par->footnotekind != LyXParagraph::FIG
1437 par->footnotekind != LyXParagraph::TAB
1439 par->footnotekind != LyXParagraph::WIDE_FIG
1441 par->footnotekind != LyXParagraph::WIDE_TAB
1443 par->footnotekind != LyXParagraph::ALGORITHM
1447 current_view->buffer()->text->SetCursorIntern(par, 0);
1448 current_view->buffer()->text->CloseFootnote();
1454 current_view->buffer()->text->SetCursorIntern(cursor.par, cursor.pos);
1455 current_view->redraw();
1456 current_view->fitCursor();
1457 current_view->updateScrollbar();
1461 void MenuLayoutCharacter()
1463 static int ow = -1, oh;
1465 if (fd_form_character->form_character->visible) {
1466 fl_raise_form(fd_form_character->form_character);
1468 fl_show_form(fd_form_character->form_character,
1469 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1470 _("Character Style"));
1472 ow = fd_form_character->form_character->w;
1473 oh = fd_form_character->form_character->h;
1475 fl_set_form_minsize(fd_form_character->form_character, ow, oh);
1480 inline void DeactivateParagraphButtons ()
1482 fl_deactivate_object (fd_form_paragraph->button_ok);
1483 fl_deactivate_object (fd_form_paragraph->button_apply);
1484 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1485 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1488 inline void ActivateParagraphButtons ()
1490 fl_activate_object (fd_form_paragraph->button_ok);
1491 fl_activate_object (fd_form_paragraph->button_apply);
1492 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1493 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1496 inline void DisableParagraphLayout ()
1498 DeactivateParagraphButtons();
1499 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1500 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1501 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1502 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1503 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1504 fl_deactivate_object (fd_form_paragraph->check_noindent);
1505 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1506 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1507 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1508 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1509 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1510 fl_deactivate_object (fd_form_paragraph->input_space_above);
1511 fl_deactivate_object (fd_form_paragraph->input_space_below);
1512 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1513 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1514 fl_deactivate_object (fd_form_paragraph->check_space_above);
1515 fl_deactivate_object (fd_form_paragraph->check_space_below);
1518 inline void EnableParagraphLayout ()
1520 ActivateParagraphButtons();
1521 fl_activate_object (fd_form_paragraph->input_labelwidth);
1522 fl_activate_object (fd_form_paragraph->check_lines_top);
1523 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1524 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1525 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1526 fl_activate_object (fd_form_paragraph->check_noindent);
1527 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1528 fl_activate_object (fd_form_paragraph->radio_align_right);
1529 fl_activate_object (fd_form_paragraph->radio_align_left);
1530 fl_activate_object (fd_form_paragraph->radio_align_block);
1531 fl_activate_object (fd_form_paragraph->radio_align_center);
1532 fl_activate_object (fd_form_paragraph->input_space_above);
1533 fl_activate_object (fd_form_paragraph->input_space_below);
1534 fl_activate_object (fd_form_paragraph->choice_space_above);
1535 fl_activate_object (fd_form_paragraph->choice_space_below);
1536 fl_activate_object (fd_form_paragraph->check_space_above);
1537 fl_activate_object (fd_form_paragraph->check_space_below);
1540 bool UpdateLayoutParagraph()
1542 if (!current_view->getScreen() || !current_view->available()) {
1543 if (fd_form_paragraph->form_paragraph->visible)
1544 fl_hide_form(fd_form_paragraph->form_paragraph);
1548 Buffer * buf = current_view->buffer();
1550 fl_set_input(fd_form_paragraph->input_labelwidth,
1551 buf->text->cursor.par->GetLabelWidthString().c_str());
1552 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1553 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1554 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1555 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1557 int align = buf->text->cursor.par->GetAlign();
1558 if (align == LYX_ALIGN_LAYOUT)
1559 align = textclasslist.Style(buf->params.textclass,
1560 buf->text->cursor.par->GetLayout()).align;
1563 case LYX_ALIGN_RIGHT:
1564 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1566 case LYX_ALIGN_LEFT:
1567 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1569 case LYX_ALIGN_CENTER:
1570 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1573 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1577 fl_set_button(fd_form_paragraph->check_lines_top,
1578 buf->text->cursor.par->FirstPhysicalPar()->line_top);
1579 fl_set_button(fd_form_paragraph->check_lines_bottom,
1580 buf->text->cursor.par->FirstPhysicalPar()->line_bottom);
1581 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1582 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1583 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1584 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1585 fl_set_button(fd_form_paragraph->check_noindent,
1586 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1587 fl_set_input (fd_form_paragraph->input_space_above, "");
1589 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1591 fl_set_choice (fd_form_paragraph->choice_space_above,
1594 case VSpace::DEFSKIP:
1595 fl_set_choice (fd_form_paragraph->choice_space_above,
1598 case VSpace::SMALLSKIP:
1599 fl_set_choice (fd_form_paragraph->choice_space_above,
1602 case VSpace::MEDSKIP:
1603 fl_set_choice (fd_form_paragraph->choice_space_above,
1606 case VSpace::BIGSKIP:
1607 fl_set_choice (fd_form_paragraph->choice_space_above,
1611 fl_set_choice (fd_form_paragraph->choice_space_above,
1614 case VSpace::LENGTH:
1615 fl_set_choice (fd_form_paragraph->choice_space_above,
1617 fl_set_input (fd_form_paragraph->input_space_above,
1618 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1621 fl_set_button (fd_form_paragraph->check_space_above,
1622 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1623 fl_set_input (fd_form_paragraph->input_space_below, "");
1624 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1626 fl_set_choice (fd_form_paragraph->choice_space_below,
1629 case VSpace::DEFSKIP:
1630 fl_set_choice (fd_form_paragraph->choice_space_below,
1633 case VSpace::SMALLSKIP:
1634 fl_set_choice (fd_form_paragraph->choice_space_below,
1637 case VSpace::MEDSKIP:
1638 fl_set_choice (fd_form_paragraph->choice_space_below,
1641 case VSpace::BIGSKIP:
1642 fl_set_choice (fd_form_paragraph->choice_space_below,
1646 fl_set_choice (fd_form_paragraph->choice_space_below,
1649 case VSpace::LENGTH:
1650 fl_set_choice (fd_form_paragraph->choice_space_below,
1652 fl_set_input (fd_form_paragraph->input_space_below,
1653 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1656 fl_set_button (fd_form_paragraph->check_space_below,
1657 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1659 fl_set_button(fd_form_paragraph->check_noindent,
1660 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1662 if (current_view->buffer()->isReadonly()) {
1663 DisableParagraphLayout();
1665 EnableParagraphLayout();
1670 void MenuLayoutParagraph()
1672 if (UpdateLayoutParagraph()) {
1673 if (fd_form_paragraph->form_paragraph->visible) {
1674 fl_raise_form(fd_form_paragraph->form_paragraph);
1676 fl_show_form(fd_form_paragraph->form_paragraph,
1677 FL_PLACE_MOUSE, FL_FULLBORDER,
1678 _("Paragraph Environment"));
1685 void DeactivateDocumentButtons ()
1687 fl_deactivate_object (fd_form_document->button_ok);
1688 fl_deactivate_object (fd_form_document->button_apply);
1689 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1690 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1695 void ActivateDocumentButtons ()
1697 fl_activate_object (fd_form_document->button_ok);
1698 fl_activate_object (fd_form_document->button_apply);
1699 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1700 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1704 void DisableDocumentLayout ()
1706 DeactivateDocumentButtons ();
1707 fl_deactivate_object (fd_form_document->group_radio_separation);
1708 fl_deactivate_object (fd_form_document->radio_indent);
1709 fl_deactivate_object (fd_form_document->radio_skip);
1710 fl_deactivate_object (fd_form_document->choice_class);
1711 fl_deactivate_object (fd_form_document->choice_pagestyle);
1712 fl_deactivate_object (fd_form_document->choice_fonts);
1713 fl_deactivate_object (fd_form_document->choice_fontsize);
1714 fl_deactivate_object (fd_form_document->input_float_placement);
1715 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1716 fl_deactivate_object (fd_form_document->choice_inputenc);
1717 fl_deactivate_object (fd_form_document->group_radio_sides);
1718 fl_deactivate_object (fd_form_document->radio_sides_one);
1719 fl_deactivate_object (fd_form_document->radio_sides_two);
1720 fl_deactivate_object (fd_form_document->group_radio_columns);
1721 fl_deactivate_object (fd_form_document->radio_columns_one);
1722 fl_deactivate_object (fd_form_document->radio_columns_two);
1723 fl_deactivate_object (fd_form_document->input_extra);
1724 fl_deactivate_object (fd_form_document->choice_language);
1725 combo_language->deactivate();
1726 fl_deactivate_object (fd_form_document->input_default_skip);
1727 fl_deactivate_object (fd_form_document->choice_default_skip);
1728 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1729 fl_deactivate_object (fd_form_document->slider_tocdepth);
1730 fl_deactivate_object (fd_form_document->choice_spacing);
1731 fl_deactivate_object (fd_form_document->input_spacing);
1732 fl_deactivate_object (fd_form_document->check_use_amsmath);
1736 void EnableDocumentLayout ()
1738 ActivateDocumentButtons ();
1739 fl_activate_object (fd_form_document->group_radio_separation);
1740 fl_activate_object (fd_form_document->radio_indent);
1741 fl_activate_object (fd_form_document->radio_skip);
1742 fl_activate_object (fd_form_document->choice_class);
1743 fl_activate_object (fd_form_document->choice_pagestyle);
1744 fl_activate_object (fd_form_document->choice_fonts);
1745 fl_activate_object (fd_form_document->choice_fontsize);
1746 fl_activate_object (fd_form_document->input_float_placement);
1747 fl_activate_object (fd_form_document->choice_postscript_driver);
1748 fl_activate_object (fd_form_document->choice_inputenc);
1749 fl_activate_object (fd_form_document->group_radio_sides);
1750 fl_activate_object (fd_form_document->radio_sides_one);
1751 fl_activate_object (fd_form_document->radio_sides_two);
1752 fl_activate_object (fd_form_document->group_radio_columns);
1753 fl_activate_object (fd_form_document->radio_columns_one);
1754 fl_activate_object (fd_form_document->radio_columns_two);
1755 fl_activate_object (fd_form_document->input_extra);
1756 fl_activate_object (fd_form_document->choice_language);
1757 combo_language->activate();
1758 fl_activate_object (fd_form_document->input_default_skip);
1759 fl_activate_object (fd_form_document->choice_default_skip);
1760 fl_activate_object (fd_form_document->slider_secnumdepth);
1761 fl_activate_object (fd_form_document->slider_tocdepth);
1762 fl_activate_object (fd_form_document->choice_spacing);
1763 fl_activate_object (fd_form_document->input_spacing);
1764 fl_activate_object (fd_form_document->check_use_amsmath);
1767 bool UpdateLayoutDocument(BufferParams *params)
1769 if (!current_view->getScreen() || !current_view->available()) {
1770 if (fd_form_document->form_document->visible)
1771 fl_hide_form(fd_form_document->form_document);
1776 params = ¤t_view->buffer()->params;
1777 LyXTextClass const & tclass = textclasslist.TextClass(params->textclass);
1779 fl_set_choice_text(fd_form_document->choice_class,
1780 textclasslist.DescOfClass(params->textclass).c_str());
1781 combo_language->select_text(params->language.c_str());
1783 fl_set_choice_text(fd_form_document->choice_fonts,
1784 params->fonts.c_str());
1785 fl_set_choice_text(fd_form_document->choice_inputenc,
1786 params->inputenc.c_str());
1787 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1788 params->graphicsDriver.c_str());
1790 // ale970405+lasgoutt970513
1791 fl_clear_choice(fd_form_document->choice_fontsize);
1792 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1793 fl_addto_choice(fd_form_document->choice_fontsize,
1794 tclass.opt_fontsize().c_str());
1795 fl_set_choice(fd_form_document->choice_fontsize,
1796 tokenPos(tclass.opt_fontsize(), '|', params->fontsize) + 2);
1798 // ale970405+lasgoutt970513
1799 fl_clear_choice(fd_form_document->choice_pagestyle);
1800 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1801 fl_addto_choice(fd_form_document->choice_pagestyle,
1802 tclass.opt_pagestyle().c_str());
1804 fl_set_choice(fd_form_document->choice_pagestyle,
1805 tokenPos(tclass.opt_pagestyle(), '|', params->pagestyle) + 2);
1807 fl_set_button(fd_form_document->radio_indent, 0);
1808 fl_set_button(fd_form_document->radio_skip, 0);
1811 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1813 if (params->paragraph_separation == BufferParams::PARSEP_INDENT)
1814 fl_set_button(fd_form_document->radio_indent, 1);
1816 fl_set_button(fd_form_document->radio_skip, 1);
1818 switch (params->getDefSkip().kind()) {
1819 case VSpace::SMALLSKIP:
1820 fl_set_choice (fd_form_document->choice_default_skip, 1);
1822 case VSpace::MEDSKIP:
1823 fl_set_choice (fd_form_document->choice_default_skip, 2);
1825 case VSpace::BIGSKIP:
1826 fl_set_choice (fd_form_document->choice_default_skip, 3);
1828 case VSpace::LENGTH:
1829 fl_set_choice (fd_form_document->choice_default_skip, 4);
1830 fl_set_input (fd_form_document->input_default_skip,
1831 params->getDefSkip().asLyXCommand().c_str());
1834 fl_set_choice (fd_form_document->choice_default_skip, 2);
1838 fl_set_button(fd_form_document->radio_sides_one, 0);
1839 fl_set_button(fd_form_document->radio_sides_two, 0);
1841 if (params->sides == 2)
1842 fl_set_button(fd_form_document->radio_sides_two, 1);
1844 fl_set_button(fd_form_document->radio_sides_one, 1);
1846 fl_set_button(fd_form_document->radio_columns_one, 0);
1847 fl_set_button(fd_form_document->radio_columns_two, 0);
1849 if (params->columns == 2)
1850 fl_set_button(fd_form_document->radio_columns_two, 1);
1852 fl_set_button(fd_form_document->radio_columns_one, 1);
1854 fl_set_input(fd_form_document->input_spacing, "");
1855 switch (params->spacing.getSpace()) {
1856 case Spacing::Single:
1859 fl_set_choice(fd_form_document->choice_spacing, 1);
1862 case Spacing::Onehalf:
1865 fl_set_choice(fd_form_document->choice_spacing, 2);
1868 case Spacing::Double:
1871 fl_set_choice(fd_form_document->choice_spacing, 3);
1874 case Spacing::Other:
1876 fl_set_choice(fd_form_document->choice_spacing, 4);
1878 sprintf(sval, "%g", params->spacing.getValue());
1879 fl_set_input(fd_form_document->input_spacing, sval);
1885 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1886 params->secnumdepth);
1887 fl_set_counter_value(fd_form_document->slider_tocdepth,
1889 if (!params->float_placement.empty()) { // buffer local (Lgb)
1890 fl_set_input(fd_form_document->input_float_placement,
1891 params->float_placement.c_str());
1893 fl_set_input(fd_form_document->input_float_placement, "");
1895 if (!params->options.empty())
1896 fl_set_input(fd_form_document->input_extra,
1897 params->options.c_str());
1899 fl_set_input(fd_form_document->input_extra, "");
1901 if (current_view->buffer()->isSGML()) {
1902 // bullets not used in SGML derived documents
1903 fl_deactivate_object(fd_form_document->button_bullets);
1904 fl_set_object_lcol(fd_form_document->button_bullets,
1907 fl_activate_object(fd_form_document->button_bullets);
1908 fl_set_object_lcol(fd_form_document->button_bullets,
1912 if (current_view->buffer()->isReadonly()) {
1913 DisableDocumentLayout();
1915 EnableDocumentLayout();
1921 void MenuLayoutDocument()
1923 if (UpdateLayoutDocument()) {
1924 if (fd_form_document->form_document->visible) {
1925 fl_raise_form(fd_form_document->form_document);
1927 fl_show_form(fd_form_document->form_document,
1928 FL_PLACE_MOUSE, FL_FULLBORDER,
1929 _("Document Layout"));
1935 bool UpdateLayoutQuotes()
1938 if (!current_view->getScreen()
1939 || !current_view->available()
1940 || current_view->buffer()->isReadonly())
1944 fl_set_choice(fd_form_quotes->choice_quotes_language,
1945 current_view->buffer()->params.quotes_language + 1);
1946 fl_set_button(fd_form_quotes->radio_single, 0);
1947 fl_set_button(fd_form_quotes->radio_double, 0);
1949 if (current_view->buffer()->params.quotes_times == InsetQuotes::SingleQ)
1950 fl_set_button(fd_form_quotes->radio_single, 1);
1952 fl_set_button(fd_form_quotes->radio_double, 1);
1953 } else if (fd_form_quotes->form_quotes->visible) {
1954 fl_hide_form(fd_form_quotes->form_quotes);
1959 void MenuLayoutQuotes()
1961 if (UpdateLayoutQuotes()) {
1962 if (fd_form_quotes->form_quotes->visible) {
1963 fl_raise_form(fd_form_quotes->form_quotes);
1965 fl_show_form(fd_form_quotes->form_quotes,
1966 FL_PLACE_MOUSE, FL_FULLBORDER,
1973 bool UpdateLayoutPreamble()
1976 if (!current_view->getScreen() || ! current_view->available())
1980 fl_set_input(fd_form_preamble->input_preamble,
1981 current_view->buffer()->params.preamble.c_str());
1983 if (current_view->buffer()->isReadonly()) {
1984 fl_deactivate_object(fd_form_preamble->input_preamble);
1985 fl_deactivate_object(fd_form_preamble->button_ok);
1986 fl_deactivate_object(fd_form_preamble->button_apply);
1987 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
1988 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
1991 fl_activate_object(fd_form_preamble->input_preamble);
1992 fl_activate_object(fd_form_preamble->button_ok);
1993 fl_activate_object(fd_form_preamble->button_apply);
1994 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
1995 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
1997 } else if (fd_form_preamble->form_preamble->visible) {
1998 fl_hide_form(fd_form_preamble->form_preamble);
2003 void MenuLayoutPreamble()
2005 static int ow = -1, oh;
2007 if (UpdateLayoutPreamble()) {
2008 if (fd_form_preamble->form_preamble->visible) {
2009 fl_raise_form(fd_form_preamble->form_preamble);
2011 fl_show_form(fd_form_preamble->form_preamble,
2012 FL_PLACE_MOUSE | FL_FREE_SIZE,
2014 _("LaTeX Preamble"));
2016 ow = fd_form_preamble->form_preamble->w;
2017 oh = fd_form_preamble->form_preamble->h;
2019 fl_set_form_minsize(fd_form_preamble->form_preamble,
2025 void MenuLayoutSave()
2027 if (!current_view->getScreen() || ! current_view->available())
2030 if (AskQuestion(_("Do you want to save the current settings"),
2031 _("for Character, Document, Paper and Quotes"),
2032 _("as default for new documents?")))
2033 current_view->buffer()->saveParamsAsDefaults();
2039 InsetInfo *new_inset = new InsetInfo();
2040 current_view->buffer()->insertInset(new_inset);
2041 new_inset->Edit(0, 0);
2042 //current_view->buffer()->update(-1);
2048 if (current_view->available()) {
2049 minibuffer->Set(_("Open/Close..."));
2050 current_view->getScreen()->HideCursor();
2052 current_view->buffer()->update(-2);
2053 current_view->buffer()->text->OpenStuff();
2054 current_view->buffer()->update(0);
2060 if (current_view->available()) {
2061 minibuffer->Set(_("Open/Close..."));
2062 current_view->getScreen()->HideCursor();
2064 current_view->buffer()->update(-2);
2065 current_view->buffer()->text->ToggleFootnote();
2066 current_view->buffer()->update(0);
2073 /* if (current_view->buffer()->the_locking_inset) {
2074 minibuffer->Set(_("Undo not yet supported in math mode"));
2078 if (current_view->available()) {
2079 minibuffer->Set(_("Undo"));
2080 current_view->getScreen()->HideCursor();
2082 current_view->buffer()->update(-2);
2083 if (!current_view->buffer()->text->TextUndo())
2084 minibuffer->Set(_("No further undo information"));
2086 current_view->buffer()->update(-1);
2093 if (current_view->buffer()->the_locking_inset) {
2094 minibuffer->Set(_("Redo not yet supported in math mode"));
2098 if (current_view->available()) {
2099 minibuffer->Set(_("Redo"));
2100 current_view->getScreen()->HideCursor();
2102 current_view->buffer()->update(-2);
2103 if (!current_view->buffer()->text->TextRedo())
2104 minibuffer->Set(_("No further redo information"));
2106 current_view->buffer()->update(-1);
2111 void HyphenationPoint()
2113 if (current_view->available()) {
2114 current_view->getScreen()->HideCursor();
2115 current_view->buffer()->update(-2);
2116 InsetSpecialChar *new_inset =
2117 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2118 current_view->buffer()->insertInset(new_inset);
2119 //current_view->buffer()->update(-1);
2126 if (current_view->available()) {
2127 current_view->getScreen()->HideCursor();
2128 current_view->buffer()->update(-2);
2129 InsetSpecialChar *new_inset =
2130 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2131 current_view->buffer()->insertInset(new_inset);
2136 void EndOfSentenceDot()
2138 if (current_view->available()) {
2139 current_view->getScreen()->HideCursor();
2140 current_view->buffer()->update(-2);
2141 InsetSpecialChar *new_inset =
2142 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2143 current_view->buffer()->insertInset(new_inset);
2148 void MenuSeparator()
2150 if (current_view->available()) {
2151 current_view->getScreen()->HideCursor();
2152 current_view->buffer()->update(-2);
2153 InsetSpecialChar *new_inset =
2154 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2155 current_view->buffer()->insertInset(new_inset);
2156 //current_view->buffer()->update(-1);
2163 if (current_view->available()) {
2164 current_view->getScreen()->HideCursor();
2165 current_view->buffer()->update(-2);
2166 current_view->buffer()->text->InsertChar(LyXParagraph::META_NEWLINE);
2167 current_view->buffer()->update(-1);
2172 void ProtectedBlank()
2174 if (current_view->available()) {
2175 current_view->getScreen()->HideCursor();
2176 current_view->buffer()->update(-2);
2177 current_view->buffer()->text->InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR);
2178 current_view->buffer()->update(-1);
2185 if (current_view->available()) {
2186 current_view->getScreen()->HideCursor();
2187 current_view->buffer()->update(-2);
2188 current_view->buffer()->text->InsertChar(LyXParagraph::META_HFILL);
2189 current_view->buffer()->update(-1);
2194 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2195 They also show the current font state. */
2198 void ToggleAndShow(LyXFont const &);
2201 void FontSizeCB(string const & size)
2203 LyXFont font(LyXFont::ALL_IGNORE);
2204 font.setGUISize(size);
2205 ToggleAndShow(font);
2211 LyXFont font(LyXFont::ALL_IGNORE);
2212 font.setEmph(LyXFont::TOGGLE);
2213 ToggleAndShow(font);
2219 LyXFont font(LyXFont::ALL_IGNORE);
2220 font.setNoun(LyXFont::TOGGLE);
2221 ToggleAndShow(font);
2227 LyXFont font(LyXFont::ALL_IGNORE);
2228 font.setSeries(LyXFont::BOLD_SERIES);
2229 ToggleAndShow(font);
2235 LyXFont font(LyXFont::ALL_IGNORE);
2236 font.setUnderbar(LyXFont::TOGGLE);
2237 ToggleAndShow(font);
2243 LyXFont font(LyXFont::ALL_IGNORE);
2244 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2245 ToggleAndShow(font);
2251 LyXFont font(LyXFont::ALL_IGNORE);
2252 font.setFamily(LyXFont::SANS_FAMILY);
2253 ToggleAndShow(font);
2259 LyXFont font(LyXFont::ALL_IGNORE);
2260 font.setFamily(LyXFont::ROMAN_FAMILY);
2261 ToggleAndShow(font);
2267 LyXFont font(LyXFont::ALL_IGNORE);
2268 font.setLatex (LyXFont::TOGGLE);
2269 ToggleAndShow(font);
2275 LyXFont font(LyXFont::ALL_INHERIT);
2276 ToggleAndShow(font);
2280 /* -------> Returns the current font and depth by printing a message. In the
2281 * future perhaps we could try to implement a callback to the button-bar.
2282 * That is, `light' the bold button when the font is currently bold, etc.
2284 string CurrentState()
2287 if (current_view->available()) {
2288 // I think we should only show changes from the default
2290 Buffer * buffer = current_view->buffer();
2291 LyXFont font = buffer->text->real_current_font;
2292 LyXFont defaultfont = textclasslist.TextClass(buffer->
2293 params.textclass).defaultfont();
2294 font.reduce(defaultfont);
2295 state = _("Font: ") + font.stateText();
2297 int depth = buffer->text->GetDepth();
2299 state += string(_(", Depth: ")) + tostr(depth);
2305 /* -------> Does the actual toggle job of the XxxCB() calls above.
2306 * Also shows the current font state.
2309 void ToggleAndShow(LyXFont const & font)
2311 if (current_view->available()) {
2312 current_view->getScreen()->HideCursor();
2313 current_view->buffer()->update(-2);
2314 current_view->buffer()->text->ToggleFree(font, toggleall);
2315 current_view->buffer()->update(1);
2317 // removed since it overrides the ToggleFree Message about the style
2318 // Since Styles are more "High Level" than raw fonts I think the user
2319 // prefers it like this Matthias
2320 // FontStateShowCB( 0, 0 );
2324 extern "C" void MarginCB(FL_OBJECT *, long)
2326 if (current_view->available()) {
2327 minibuffer->Set(_("Inserting margin note..."));
2328 current_view->getScreen()->HideCursor();
2329 current_view->buffer()->update(-2);
2330 current_view->buffer()->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2331 current_view->buffer()->update(1);
2336 extern "C" void FigureCB(FL_OBJECT *, long)
2338 if (fd_form_figure->form_figure->visible) {
2339 fl_raise_form(fd_form_figure->form_figure);
2341 fl_show_form(fd_form_figure->form_figure,
2342 FL_PLACE_MOUSE, FL_FULLBORDER,
2343 _("Insert Figure"));
2348 extern "C" void TableCB(FL_OBJECT *, long)
2350 if (fd_form_table->form_table->visible) {
2351 fl_raise_form(fd_form_table->form_table);
2353 fl_show_form(fd_form_table->form_table,
2354 FL_PLACE_MOUSE, FL_FULLBORDER,
2360 void CopyEnvironmentCB()
2362 if (current_view->available()) {
2363 current_view->buffer()->text->copyEnvironmentType();
2364 /* clear the selection, even if mark_set */
2365 current_view->getScreen()->ToggleSelection();
2366 current_view->buffer()->text->ClearSelection();
2367 current_view->buffer()->update(-2);
2368 minibuffer->Set(_("Paragraph environment type copied"));
2373 void PasteEnvironmentCB()
2375 if (current_view->available()) {
2376 current_view->buffer()->text->pasteEnvironmentType();
2377 minibuffer->Set(_("Paragraph environment type set"));
2378 current_view->buffer()->update(1);
2385 if (current_view->available()) {
2386 current_view->buffer()->text->CopySelection();
2387 /* clear the selection, even if mark_set */
2388 current_view->getScreen()->ToggleSelection();
2389 current_view->buffer()->text->ClearSelection();
2390 current_view->buffer()->update(-2);
2391 minibuffer->Set(_("Copy"));
2398 if (current_view->available()) {
2399 current_view->getScreen()->HideCursor();
2400 current_view->buffer()->update(-2);
2401 current_view->buffer()->text->CutSelection();
2402 current_view->buffer()->update(1);
2403 minibuffer->Set(_("Cut"));
2410 if (!current_view->available()) return;
2412 minibuffer->Set(_("Paste"));
2413 current_view->getScreen()->HideCursor();
2414 /* clear the selection */
2415 current_view->getScreen()->ToggleSelection();
2416 current_view->buffer()->text->ClearSelection();
2417 current_view->buffer()->update(-2);
2420 current_view->buffer()->text->PasteSelection();
2421 current_view->buffer()->update(1);
2423 /* clear the selection */
2424 current_view->getScreen()->ToggleSelection();
2425 current_view->buffer()->text->ClearSelection();
2426 current_view->buffer()->update(-2);
2430 extern "C" void MeltCB(FL_OBJECT *, long)
2432 if (!current_view->available()) return;
2434 minibuffer->Set(_("Melt"));
2435 current_view->getScreen()->HideCursor();
2437 current_view->buffer()->update(-2);
2438 current_view->buffer()->text->MeltFootnoteEnvironment();
2439 current_view->buffer()->update(1);
2443 // Change environment depth.
2444 // if decInc == 0, depth change taking mouse button number into account
2445 // if decInc == 1, increment depth
2446 // if decInc == -1, decrement depth
2447 extern "C" void DepthCB(FL_OBJECT *ob, long decInc)
2451 /* When decInc != 0, fake a mouse button. This allows us to
2452 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2453 /* check out wether ob is defined, too (Matthias) */
2456 else if (!decInc && ob) {
2457 button = fl_get_button_numb(ob);
2460 if (current_view->available()) {
2461 current_view->getScreen()->HideCursor();
2462 current_view->buffer()->update(-2);
2464 current_view->buffer()->text->IncDepth();
2466 current_view->buffer()->text->DecDepth();
2467 current_view->buffer()->update(1);
2468 minibuffer->Set(_("Changed environment depth"
2469 " (in possible range, maybe not)"));
2474 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2475 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2476 LyXFont UserFreeFont()
2478 LyXFont font(LyXFont::ALL_IGNORE);
2481 pos = fl_get_choice(fd_form_character->choice_family);
2483 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2484 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2485 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2486 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2487 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2490 pos = fl_get_choice(fd_form_character->choice_series);
2492 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2493 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2494 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2495 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2498 pos = fl_get_choice(fd_form_character->choice_shape);
2500 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2501 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2502 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2503 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2504 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2505 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2508 pos = fl_get_choice(fd_form_character->choice_size);
2510 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2511 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2512 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2513 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2514 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2515 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2516 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2517 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2518 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2519 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2520 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2521 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2522 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2523 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2526 pos = fl_get_choice(fd_form_character->choice_bar);
2528 case 1: font.setEmph(LyXFont::IGNORE);
2529 font.setUnderbar(LyXFont::IGNORE);
2530 font.setNoun(LyXFont::IGNORE);
2531 font.setLatex(LyXFont::IGNORE);
2533 case 2: font.setEmph(LyXFont::TOGGLE); break;
2534 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2535 case 4: font.setNoun(LyXFont::TOGGLE); break;
2536 case 5: font.setLatex(LyXFont::TOGGLE); break;
2537 case 6: font.setEmph(LyXFont::INHERIT);
2538 font.setUnderbar(LyXFont::INHERIT);
2539 font.setNoun(LyXFont::INHERIT);
2540 font.setLatex(LyXFont::INHERIT);
2544 pos = fl_get_choice(fd_form_character->choice_color);
2546 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2547 case 2: font.setColor(LyXFont::NONE); break;
2548 case 3: font.setColor(LyXFont::BLACK); break;
2549 case 4: font.setColor(LyXFont::WHITE); break;
2550 case 5: font.setColor(LyXFont::RED); break;
2551 case 6: font.setColor(LyXFont::GREEN); break;
2552 case 7: font.setColor(LyXFont::BLUE); break;
2553 case 8: font.setColor(LyXFont::CYAN); break;
2554 case 9: font.setColor(LyXFont::MAGENTA); break;
2555 case 10: font.setColor(LyXFont::YELLOW); break;
2556 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2565 ToggleAndShow(UserFreeFont());
2569 /* callbacks for form form_title */
2570 extern "C" void TimerCB(FL_OBJECT *, long)
2572 // only if the form still exists
2573 if (fd_form_title->form_title != 0) {
2574 if (fd_form_title->form_title->visible) {
2575 fl_hide_form(fd_form_title->form_title);
2577 fl_free_form(fd_form_title->form_title);
2578 fd_form_title->form_title = 0;
2583 /* callbacks for form form_paragraph */
2585 extern "C" void ParagraphVSpaceCB(FL_OBJECT* obj, long )
2587 // "Synchronize" the choices and input fields, making it
2588 // impossible to commit senseless data.
2590 const FD_form_paragraph* fp = fd_form_paragraph;
2592 if (obj == fp->choice_space_above) {
2593 if (fl_get_choice (fp->choice_space_above) != 7) {
2594 fl_set_input (fp->input_space_above, "");
2595 ActivateParagraphButtons();
2597 } else if (obj == fp->choice_space_below) {
2598 if (fl_get_choice (fp->choice_space_below) != 7) {
2599 fl_set_input (fp->input_space_below, "");
2600 ActivateParagraphButtons();
2602 } else if (obj == fp->input_space_above) {
2603 string input = fl_get_input (fp->input_space_above);
2605 if (input.empty()) {
2606 fl_set_choice (fp->choice_space_above, 1);
2607 ActivateParagraphButtons();
2609 else if (isValidGlueLength (input)) {
2610 fl_set_choice (fp->choice_space_above, 7);
2611 ActivateParagraphButtons();
2614 fl_set_choice (fp->choice_space_above, 7);
2615 DeactivateParagraphButtons();
2617 } else if (obj == fp->input_space_below) {
2618 string input = fl_get_input (fp->input_space_below);
2620 if (input.empty()) {
2621 fl_set_choice (fp->choice_space_below, 1);
2622 ActivateParagraphButtons();
2624 else if (isValidGlueLength (input)) {
2625 fl_set_choice (fp->choice_space_below, 7);
2626 ActivateParagraphButtons();
2629 fl_set_choice (fp->choice_space_below, 7);
2630 DeactivateParagraphButtons();
2636 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2638 if (!current_view->available())
2641 VSpace space_top, space_bottom;
2643 string labelwidthstring;
2646 // If a vspace kind is "Length" but there's no text in
2647 // the input field, reset the kind to "None".
2648 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2649 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2650 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2652 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2653 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2654 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2657 bool line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2658 bool line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2659 bool pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2660 bool pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2661 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2662 case 1: space_top = VSpace(VSpace::NONE); break;
2663 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2664 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2665 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2666 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2667 case 6: space_top = VSpace(VSpace::VFILL); break;
2668 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2670 if (fl_get_button (fd_form_paragraph->check_space_above))
2671 space_top.setKeep (true);
2672 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2673 case 1: space_bottom = VSpace(VSpace::NONE); break;
2674 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2675 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2676 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2677 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2678 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2679 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2681 if (fl_get_button (fd_form_paragraph->check_space_below))
2682 space_bottom.setKeep (true);
2684 if (fl_get_button(fd_form_paragraph->radio_align_left))
2685 align = LYX_ALIGN_LEFT;
2686 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2687 align = LYX_ALIGN_RIGHT;
2688 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2689 align = LYX_ALIGN_CENTER;
2691 align = LYX_ALIGN_BLOCK;
2693 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2694 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2696 current_view->buffer()->text->SetParagraph(line_top,
2705 current_view->buffer()->update(1);
2706 minibuffer->Set(_("Paragraph layout set"));
2710 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2712 fl_hide_form(fd_form_paragraph->form_paragraph);
2716 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2718 ParagraphApplyCB(ob, data);
2719 ParagraphCancelCB(ob, data);
2723 /* callbacks for form form_character */
2725 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2727 // we set toggleall locally here, since it should be true for
2728 // all other uses of ToggleAndShow() (JMarc)
2729 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2730 ToggleAndShow( UserFreeFont());
2735 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2737 fl_hide_form(fd_form_character->form_character);
2741 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2743 CharacterApplyCB(ob, data);
2744 CharacterCloseCB(ob, data);
2748 /* callbacks for form form_document */
2750 void UpdateDocumentButtons(BufferParams const ¶ms)
2752 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2754 if (params.sides == 2)
2755 fl_set_button(fd_form_document->radio_sides_two, 1);
2757 fl_set_button(fd_form_document->radio_sides_one, 1);
2759 if (params.columns == 2)
2760 fl_set_button(fd_form_document->radio_columns_two, 1);
2762 fl_set_button(fd_form_document->radio_columns_one, 1);
2764 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2765 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2766 params.secnumdepth);
2767 fl_set_counter_value(fd_form_document->slider_tocdepth,
2772 extern "C" void ChoiceClassCB(FL_OBJECT *ob, long)
2775 if (textclasslist.Load(fl_get_choice(ob)-1)) {
2776 if (AskQuestion(_("Should I set some parameters to"),
2777 fl_get_choice_text(ob),
2778 _("the defaults of this document class?"))) {
2779 BufferParams params = BufferParams();
2780 params.textclass = fl_get_choice(ob)-1;
2781 params.useClassDefaults();
2782 UpdateLayoutDocument(¶ms);
2783 UpdateDocumentButtons(params);
2786 // unable to load new style
2787 WriteAlert(_("Conversion Errors!"),
2788 _("Unable to switch to new document class."),
2789 _("Reverting to original document class."));
2790 fl_set_choice(fd_form_document->choice_class,
2791 GetCurrentTextClass() + 1);
2797 extern "C" void DocumentDefskipCB(FL_OBJECT *obj, long)
2799 // "Synchronize" the choice and the input field, so that it
2800 // is impossible to commit senseless data.
2801 const FD_form_document* fd = fd_form_document;
2803 if (obj == fd->choice_default_skip) {
2804 if (fl_get_choice (fd->choice_default_skip) != 4) {
2805 fl_set_input (fd->input_default_skip, "");
2806 ActivateDocumentButtons();
2808 } else if (obj == fd->input_default_skip) {
2810 const char* input = fl_get_input (fd->input_default_skip);
2813 fl_set_choice (fd->choice_default_skip, 2);
2814 ActivateDocumentButtons();
2815 } else if (isValidGlueLength (input)) {
2816 fl_set_choice (fd->choice_default_skip, 4);
2817 ActivateDocumentButtons();
2819 fl_set_choice (fd->choice_default_skip, 4);
2820 DeactivateDocumentButtons();
2826 extern "C" void DocumentSpacingCB(FL_OBJECT *obj, long)
2828 // "Synchronize" the choice and the input field, so that it
2829 // is impossible to commit senseless data.
2830 const FD_form_document* fd = fd_form_document;
2832 if (obj == fd->choice_spacing
2833 && fl_get_choice (fd->choice_spacing) != 4) {
2834 fl_set_input(fd->input_spacing, "");
2835 } else if (obj == fd->input_spacing) {
2837 const char* input = fl_get_input (fd->input_spacing);
2840 fl_set_choice (fd->choice_spacing, 1);
2842 fl_set_choice (fd->choice_spacing, 4);
2848 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2851 BufferParams *params = &(current_view->buffer()->params);
2852 current_view->buffer()->params.language =
2853 combo_language->getline();
2855 // If default skip is a "Length" but there's no text in the
2856 // input field, reset the kind to "Medskip", which is the default.
2857 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2858 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2859 fl_set_choice (fd_form_document->choice_default_skip, 2);
2862 /* this shouldn't be done automatically IMO. For example I write german
2863 * documents with an american keyboard very often. Matthias */
2865 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2866 fl_get_choice(fd_form_document->choice_language)); */
2868 fl_get_choice_text(fd_form_document->choice_fonts);
2870 fl_get_choice_text(fd_form_document->choice_inputenc);
2872 fl_get_choice_text(fd_form_document->choice_fontsize);
2874 fl_get_choice_text(fd_form_document->choice_pagestyle);
2875 params->graphicsDriver =
2876 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2877 params->use_amsmath =
2878 fl_get_button(fd_form_document->check_use_amsmath);
2880 if (!current_view->available())
2883 LyXTextClassList::ClassList::size_type new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2884 if (params->textclass != new_class) {
2885 // try to load new_class
2886 if (textclasslist.Load(new_class)) {
2887 // successfully loaded
2889 minibuffer->Set(_("Converting document to new document class..."));
2890 int ret = current_view->buffer()->
2892 SwitchLayoutsBetweenClasses(current_view->buffer()->
2895 current_view->buffer()->
2901 s = _("One paragraph couldn't be converted");
2904 s += _(" paragraphs couldn't be converted");
2906 WriteAlert(_("Conversion Errors!"), s,
2907 _("into chosen document class"));
2910 params->textclass = new_class;
2912 // problem changing class -- warn user and retain old style
2913 WriteAlert(_("Conversion Errors!"),
2914 _("Unable to switch to new document class."),
2915 _("Reverting to original document class."));
2916 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2920 char tmpsep = params->paragraph_separation;
2921 if (fl_get_button(fd_form_document->radio_indent))
2922 params->paragraph_separation = BufferParams::PARSEP_INDENT;
2924 params->paragraph_separation = BufferParams::PARSEP_SKIP;
2925 if (tmpsep != params->paragraph_separation)
2928 VSpace tmpdefskip = params->getDefSkip();
2929 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2930 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2931 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2932 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2933 case 4: params->setDefSkip(
2934 VSpace (LyXGlueLength (fl_get_input
2935 (fd_form_document->input_default_skip))));
2937 // DocumentDefskipCB assures that this never happens
2938 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2940 if (!(tmpdefskip == params->getDefSkip()))
2943 if (fl_get_button(fd_form_document->radio_columns_two))
2944 params->columns = 2;
2946 params->columns = 1;
2947 if (fl_get_button(fd_form_document->radio_sides_two))
2948 params->sides = LyXTextClass::TwoSides;
2950 params->sides = LyXTextClass::OneSide;
2952 Spacing tmpSpacing = params->spacing;
2953 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2955 lyxerr.debug() << "Spacing: SINGLE" << endl;
2956 params->spacing.set(Spacing::Single);
2959 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2960 params->spacing.set(Spacing::Onehalf);
2963 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2964 params->spacing.set(Spacing::Double);
2967 lyxerr.debug() << "Spacing: OTHER" << endl;
2968 params->spacing.set(Spacing::Other,
2969 fl_get_input(fd_form_document->input_spacing));
2972 if (tmpSpacing != params->spacing)
2975 signed char tmpchar =
2976 static_cast<signed char>(fl_get_counter_value(fd_form_document->slider_secnumdepth));
2977 if (params->secnumdepth != tmpchar)
2979 params->secnumdepth = tmpchar;
2982 static_cast<int>(fl_get_counter_value(fd_form_document->slider_tocdepth));
2984 params->float_placement =
2985 fl_get_input(fd_form_document->input_float_placement);
2987 // More checking should be done to ensure the string doesn't have
2988 // spaces or illegal placement characters in it. (thornley)
2991 current_view->redoCurrentBuffer();
2993 minibuffer->Set(_("Document layout set"));
2994 current_view->buffer()->markDirty();
2997 fl_get_input(fd_form_document->input_extra);
3002 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
3004 fl_hide_form(fd_form_document->form_document);
3008 extern "C" void DocumentOKCB(FL_OBJECT *ob, long data)
3010 DocumentCancelCB(ob, data);
3011 DocumentApplyCB(ob, data);
3015 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
3018 // bullet callbacks etc. in bullet_panel.C -- ARRae
3024 if (!current_view->getScreen())
3027 current_view->getScreen()->HideCursor();
3029 current_view->buffer()->update(-2);
3032 if (!current_view->buffer()->text->GotoNextNote()) {
3033 if (current_view->buffer()->text->cursor.pos
3034 || current_view->buffer()->text->cursor.par !=
3035 current_view->buffer()->text->FirstParagraph())
3037 tmp = current_view->buffer()->text->cursor;
3038 current_view->buffer()->text->cursor.par =
3039 current_view->buffer()->text->FirstParagraph();
3040 current_view->buffer()->text->cursor.pos = 0;
3041 if (!current_view->buffer()->text->GotoNextNote()) {
3042 current_view->buffer()->text->cursor = tmp;
3043 minibuffer->Set(_("No more notes"));
3047 minibuffer->Set(_("No more notes"));
3051 current_view->buffer()->update(0);
3052 current_view->buffer()->text->sel_cursor =
3053 current_view->buffer()->text->cursor;
3057 void InsertCorrectQuote()
3059 Buffer *cbuffer = current_view->buffer();
3062 if (cbuffer->text->cursor.pos )
3063 c = cbuffer->text->cursor.par->GetChar(cbuffer->text->cursor.pos - 1);
3067 cbuffer->insertInset(new InsetQuotes(c, cbuffer->params));
3071 /* callbacks for form form_quotes */
3073 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
3075 if (!current_view->available())
3078 minibuffer->Set(_("Quotes type set"));
3079 //current_view->buffer()->params.quotes_language =
3080 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3081 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3082 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3084 lga = InsetQuotes::EnglishQ;
3087 lga = InsetQuotes::SwedishQ;
3090 lga = InsetQuotes::GermanQ;
3093 lga = InsetQuotes::PolishQ;
3096 lga = InsetQuotes::FrenchQ;
3099 lga = InsetQuotes::DanishQ;
3102 current_view->buffer()->params.quotes_language = lga;
3103 if (fl_get_button(fd_form_quotes->radio_single))
3104 current_view->buffer()->
3105 params.quotes_times = InsetQuotes::SingleQ;
3107 current_view->buffer()->
3108 params.quotes_times = InsetQuotes::DoubleQ;
3112 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
3114 fl_hide_form(fd_form_quotes->form_quotes);
3118 extern "C" void QuotesOKCB(FL_OBJECT *ob, long data)
3120 QuotesApplyCB(ob, data);
3121 QuotesCancelCB(ob, data);
3126 /* callbacks for form form_preamble */
3128 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
3130 fl_hide_form(fd_form_preamble->form_preamble);
3134 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
3136 if (!current_view->available())
3139 current_view->buffer()->params.preamble =
3140 fl_get_input(fd_form_preamble->input_preamble);
3141 current_view->buffer()->markDirty();
3142 minibuffer->Set(_("LaTeX preamble set"));
3146 extern "C" void PreambleOKCB(FL_OBJECT *ob, long data)
3148 PreambleApplyCB(ob, data);
3149 PreambleCancelCB(ob, data);
3153 /* callbacks for form form_table */
3155 extern "C" void TableApplyCB(FL_OBJECT *, long)
3158 if (!current_view->getScreen())
3161 // check for tables in tables
3162 if (current_view->buffer()->text->cursor.par->table){
3163 WriteAlert(_("Impossible Operation!"),
3164 _("Cannot insert table in table."),
3169 minibuffer->Set(_("Inserting table..."));
3171 ysize = (int)(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3172 xsize = (int)(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3175 current_view->getScreen()->HideCursor();
3177 current_view->buffer()->update(-2);
3179 current_view->buffer()->text->SetCursorParUndo();
3180 current_view->buffer()->text->FreezeUndo();
3182 current_view->buffer()->text->BreakParagraph();
3183 current_view->buffer()->update(-1);
3185 if (current_view->buffer()->text->cursor.par->Last()) {
3186 current_view->buffer()->text->CursorLeft();
3188 current_view->buffer()->text->BreakParagraph();
3189 current_view->buffer()->update(-1);
3192 current_view->buffer()->text->current_font.setLatex(LyXFont::OFF);
3193 //if (!fl_get_button(fd_form_table->check_latex)){
3194 // insert the new wysiwy table
3195 current_view->buffer()->text->SetLayout(0); // standard layout
3196 if (current_view->buffer()->text->cursor.par->footnoteflag ==
3197 LyXParagraph::NO_FOOTNOTE) {
3198 current_view->buffer()->
3199 text->SetParagraph(0, 0,
3201 VSpace (0.3 * current_view->buffer()->
3202 params.spacing.getValue(),
3204 VSpace (0.3 * current_view->buffer()->
3205 params.spacing.getValue(),
3212 current_view->buffer()->text->SetParagraph(0, 0,
3214 VSpace(VSpace::NONE),
3215 VSpace(VSpace::NONE),
3220 current_view->buffer()->text->cursor.par->table = new LyXTable(xsize, ysize);
3222 for (i = 0; i<xsize * ysize - 1; i++)
3223 current_view->buffer()->text->cursor.par->InsertChar(0, LyXParagraph::META_NEWLINE);
3224 current_view->buffer()->text->RedoParagraph();
3226 current_view->buffer()->text->UnFreezeUndo();
3228 current_view->buffer()->update(1);
3229 minibuffer->Set(_("Table inserted"));
3233 extern "C" void TableCancelCB(FL_OBJECT *, long)
3235 fl_hide_form(fd_form_table->form_table);
3239 extern "C" void TableOKCB(FL_OBJECT *ob, long data)
3241 TableApplyCB(ob, data);
3242 TableCancelCB(ob, data);
3246 /* callbacks for form form_print */
3248 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3250 fl_hide_form(fd_form_print->form_print);
3253 static bool stringOnlyContains (string const & LStr, char const * cset)
3255 char const * cstr = LStr.c_str() ;
3257 return strspn(cstr, cset) == strlen(cstr) ;
3260 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3262 if (!current_view->available())
3264 Buffer *buffer = current_view->buffer();
3265 string path = OnlyPath(buffer->getFileName());
3268 if (fl_get_button(fd_form_print->radio_even_pages))
3269 pageflag = lyxrc->print_evenpage_flag + ' ';
3270 else if (fl_get_button(fd_form_print->radio_odd_pages))
3271 pageflag = lyxrc->print_oddpage_flag + ' ';
3273 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3274 // User may give a page (range) list
3275 // User may print multiple (unsorted) copies
3276 string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
3277 pages = subst(pages, '+',',');
3278 pages = frontStrip(strip(pages)) ;
3279 while (!pages.empty()) { // a page range was given
3281 pages = split (pages, piece, ',') ;
3282 piece = strip(piece) ;
3283 piece = frontStrip(piece) ;
3284 if ( !stringOnlyContains (piece, "0123456789-") ) {
3285 WriteAlert(_("ERROR! Unable to print!"),
3286 _("Check 'range of pages'!"));
3289 if (piece.find('-') == string::npos) { // not found
3290 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3291 } else if (suffixIs(piece, "-") ) { // missing last page
3292 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3293 } else if (prefixIs(piece, "-") ) { // missing first page
3294 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3296 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3300 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3301 if (!copies.empty()) { // a number of copies was given
3302 if ( !stringOnlyContains (copies, "0123456789") ) {
3303 WriteAlert(_("ERROR! Unable to print!"),
3304 _("Check 'number of copies'!"));
3307 if (fl_get_button(fd_form_print->do_unsorted))
3308 pageflag += lyxrc->print_copies_flag;
3310 pageflag += lyxrc->print_collcopies_flag;
3311 pageflag += " " + copies + ' ' ;
3315 if (fl_get_button(fd_form_print->radio_order_reverse))
3316 reverseflag = lyxrc->print_reverse_flag + ' ';
3318 string orientationflag;
3319 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
3320 orientationflag = lyxrc->print_landscape_flag + ' ';
3322 string ps_file = SpaceLess(fl_get_input(fd_form_print->input_file));
3323 string printer = strip(fl_get_input(fd_form_print->input_printer));
3326 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3327 && ! printer.empty()) // a printer name has been given
3328 printerflag = lyxrc->print_to_printer + printer + ' ';
3331 if (!lyxrc->print_extra_options.empty())
3332 extraflags = lyxrc->print_extra_options + ' ';
3334 string command = lyxrc->print_command + ' '
3335 + printerflag + pageflag + reverseflag
3336 + orientationflag + extraflags;
3338 char real_papersize = buffer->params.papersize;
3339 if (real_papersize == BufferParams::PAPER_DEFAULT)
3340 real_papersize = lyxrc->default_papersize;
3344 switch (real_papersize) {
3345 case BufferParams::PAPER_USLETTER:
3348 case BufferParams::PAPER_A3PAPER:
3351 case BufferParams::PAPER_A4PAPER:
3354 case BufferParams::PAPER_A5PAPER:
3357 case BufferParams::PAPER_B5PAPER:
3360 case BufferParams::PAPER_EXECUTIVEPAPER:
3363 case BufferParams::PAPER_LEGALPAPER:
3366 default: /* If nothing else fits, keep an empty value... */
3370 if (buffer->params.use_geometry
3371 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
3372 && !lyxrc->print_paper_dimension_flag.empty()
3373 && !buffer->params.paperwidth.empty()
3374 && !buffer->params.paperheight.empty()) {
3375 // using a custom papersize
3377 command += lyxrc->print_paper_dimension_flag + ' ';
3378 command += buffer->params.paperwidth + ',';
3379 command += buffer->params.paperheight + ' ';
3380 } else if (!lyxrc->print_paper_flag.empty()
3382 && (real_papersize != BufferParams::PAPER_USLETTER ||
3383 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
3384 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3386 if (fl_get_button(fd_form_print->radio_file))
3387 command += lyxrc->print_to_file + '\"'
3388 + MakeAbsPath(ps_file, path)
3390 else if (!lyxrc->print_spool_command.empty())
3391 command += lyxrc->print_to_file
3392 + '\"' + ps_file + '\"';
3394 // push directorypath, if necessary
3395 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3396 path = buffer->tmppath;
3401 if (!lyxrc->print_spool_command.empty() &&
3402 !fl_get_button(fd_form_print->radio_file)) {
3403 string command2 = lyxrc->print_spool_command + ' ';
3404 if (!printer.empty())
3405 command2 += lyxrc->print_spool_printerprefix
3407 // First run dvips and, if succesful, then spool command
3408 if ((result = RunScript(buffer, true, command))) {
3409 result = RunScript(buffer, false, command2, ps_file);
3412 result = RunScript(buffer, false, command);
3415 WriteAlert(_("Error:"),
3416 _("Unable to print"),
3417 _("Check that your parameters are correct"));
3421 extern "C" void PrintOKCB(FL_OBJECT *ob, long data)
3423 PrintCancelCB(ob, data);
3424 PrintApplyCB(ob, data);
3428 /* callbacks for form form_figure */
3430 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3432 if (!current_view->available())
3435 Buffer * buffer = current_view->buffer();
3436 if(buffer->isReadonly()) // paranoia
3439 minibuffer->Set(_("Inserting figure..."));
3440 if (fl_get_button(fd_form_figure->radio_inline)
3441 || buffer->text->cursor.par->table) {
3442 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3443 buffer->insertInset(new_inset);
3444 minibuffer->Set(_("Figure inserted"));
3445 new_inset->Edit(0, 0);
3449 current_view->getScreen()->HideCursor();
3453 buffer->text->SetCursorParUndo();
3454 buffer->text->FreezeUndo();
3456 buffer->text->BreakParagraph();
3459 if (buffer->text->cursor.par->Last()) {
3460 buffer->text->CursorLeft();
3462 buffer->text->BreakParagraph();
3466 // The standard layout should always be numer 0;
3467 buffer->text->SetLayout(0);
3469 if (buffer->text->cursor.par->footnoteflag ==
3470 LyXParagraph::NO_FOOTNOTE) {
3471 buffer->text->SetParagraph(0, 0,
3473 VSpace (0.3 * buffer->params.spacing.getValue(),
3476 buffer->params.spacing.getValue(),
3478 LYX_ALIGN_CENTER, string(), 0);
3480 buffer->text->SetParagraph(0, 0,
3482 VSpace(VSpace::NONE),
3483 VSpace(VSpace::NONE),
3490 Inset *new_inset = 0;
3492 new_inset = new InsetFig(100, 100, buffer);
3493 buffer->insertInset(new_inset);
3494 new_inset->Edit(0, 0);
3496 minibuffer->Set(_("Figure inserted"));
3497 buffer->text->UnFreezeUndo();
3501 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3503 fl_hide_form(fd_form_figure->form_figure);
3507 extern "C" void FigureOKCB(FL_OBJECT *ob, long data)
3509 FigureApplyCB(ob, data);
3510 FigureCancelCB(ob, data);
3513 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3515 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3516 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3517 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3518 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3519 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3520 fontloader.update();
3522 // All buffers will need resize
3523 bufferlist.resize();
3525 minibuffer->Set(_("Screen options set"));
3529 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3531 fl_hide_form(fd_form_screen->form_screen);
3535 extern "C" void ScreenOKCB(FL_OBJECT *ob, long data)
3537 ScreenCancelCB(ob, data);
3538 ScreenApplyCB(ob, data);
3544 if (!current_view->available())
3547 fl_set_button(fd_latex_options->accents,
3548 (int)current_view->buffer()->params.allowAccents);
3550 if (fd_latex_options->LaTeXOptions->visible) {
3551 fl_raise_form(fd_latex_options->LaTeXOptions);
3553 fl_show_form(fd_latex_options->LaTeXOptions,
3554 FL_PLACE_MOUSE, FL_FULLBORDER,
3555 _("LaTeX Options"));
3560 // This function runs "configure" and then rereads lyx.defaults to
3561 // reconfigure the automatic settings.
3564 minibuffer->Set(_("Running configure..."));
3566 // Run configure in user lyx directory
3567 Path p(user_lyxdir);
3568 Systemcalls one(Systemcalls::System,
3569 AddName(system_lyxdir, "configure"));
3571 minibuffer->Set(_("Reloading configuration..."));
3572 lyxrc->Read(LibFileSearch(string(), "lyxrc.defaults"));
3573 WriteAlert(_("The system has been reconfigured."),
3574 _("You need to restart LyX to make use of any"),
3575 _("updated document class specifications."));
3579 /* these functions are for the spellchecker */
3580 char* NextWord(float &value)
3582 if (!current_view->available()){
3587 char* string = current_view->buffer()->text->SelectNextWord(value);
3593 void SelectLastWord()
3595 if (!current_view->available())
3598 current_view->getScreen()->HideCursor();
3600 current_view->buffer()->text->SelectSelectedWord();
3601 current_view->getScreen()->ToggleSelection(false);
3602 current_view->buffer()->update(0);
3606 void EndOfSpellCheck()
3608 if (!current_view->available())
3611 current_view->getScreen()->HideCursor();
3613 current_view->buffer()->text->SelectSelectedWord();
3614 current_view->buffer()->text->ClearSelection();
3615 current_view->buffer()->update(0);
3619 void ReplaceWord(string const & replacestring)
3621 if (!current_view->getScreen())
3624 current_view->getScreen()->HideCursor();
3625 current_view->buffer()->update(-2);
3627 /* clear the selection (if there is any) */
3628 current_view->getScreen()->ToggleSelection(false);
3629 current_view->buffer()->text->
3630 ReplaceSelectionWithString(replacestring.c_str());
3632 current_view->buffer()->text->SetSelectionOverString(replacestring.c_str());
3634 // Go back so that replacement string is also spellchecked
3635 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3636 current_view->buffer()->text->CursorLeftIntern();
3638 current_view->buffer()->update(1);
3640 // End of spellchecker stuff
3645 // Table of Contents
3655 static TocList* toclist = 0;
3658 extern "C" void TocSelectCB(FL_OBJECT *ob, long)
3660 if (!current_view->available())
3663 TocList* tmptoclist = toclist;
3664 int i = fl_get_browser(ob);
3667 for (a = 1; a<i && tmptoclist->next; a++){
3668 tmptoclist = tmptoclist->next;
3675 LyXParagraph *par = current_view->buffer()->paragraph;
3676 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3677 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3678 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3679 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3680 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3681 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3682 par->appendix != tmptoclist->appendix)) {
3683 par = par->LastPhysicalPar()->Next();
3688 current_view->buffer()->text->SetCursor(par, 0);
3689 current_view->buffer()->text->sel_cursor =
3690 current_view->buffer()->text->cursor;
3691 current_view->buffer()->update(0);
3694 WriteAlert(_("Error"),
3695 _("Couldn't find this label"),
3696 _("in current document."));
3702 extern "C" void TocCancelCB(FL_OBJECT *, long)
3704 fl_hide_form(fd_form_toc->form_toc);
3708 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3710 static LyXParagraph * stapar = 0;
3711 TocList * tmptoclist = 0;
3713 /* deleted the toclist */
3716 tmptoclist = toclist->next;
3718 toclist = tmptoclist;
3722 tmptoclist = toclist;
3725 fl_clear_browser(fd_form_toc->browser_toc);
3726 if (!current_view->available()) {
3727 fl_add_browser_line(fd_form_toc->browser_toc, _("*** No Document ***"));
3730 fl_hide_object(fd_form_toc->browser_toc);
3731 /* get the table of contents */
3732 LyXParagraph * par = current_view->buffer()->paragraph;
3734 char * line = new char[200];
3740 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3744 labeltype = textclasslist.Style(current_view->buffer()->params.textclass,
3745 par->GetLayout()).labeltype;
3747 if (labeltype >= LABEL_COUNTER_CHAPTER
3748 && labeltype <= LABEL_COUNTER_CHAPTER +
3749 current_view->buffer()->params.tocdepth) {
3750 /* insert this into the table of contents */
3751 /* first indent a little bit */
3755 textclasslist.TextClass(current_view->buffer()->
3756 params.textclass).maxcounter()) * 4 + 2;
3760 // Then the labestring
3761 if (!par->labelstring.empty()) {
3762 string::size_type i = 0;
3763 while (pos < 199 && i < par->labelstring.length()) {
3764 line[pos] = par->labelstring[i];
3773 /* now the contents */
3774 LyXParagraph::size_type i = 0;
3775 while (pos < 199 && i < par->size()) {
3776 c = par->GetChar(i);
3777 if (isprint(c) || c >= 128) {
3784 fl_add_browser_line(fd_form_toc->browser_toc, line);
3786 /* make a toclist entry */
3788 tmptoclist = new TocList;
3789 toclist = tmptoclist;
3791 tmptoclist->next = new TocList;
3792 tmptoclist = tmptoclist->next;
3795 tmptoclist->next = 0;
3797 for (a = 0; a<6; a++){
3798 tmptoclist->counter[a] = par->GetFirstCounter(a);
3800 tmptoclist->appendix = par->appendix;
3802 par = par->LastPhysicalPar()->Next();
3806 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3807 fl_show_object(fd_form_toc->browser_toc);
3811 /* callbacks for form form_ref */
3812 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3814 if (!current_view->available())
3818 fl_get_browser_line(fd_form_ref->browser_ref,
3819 fl_get_browser(fd_form_ref->browser_ref));
3820 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3826 current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3836 if(current_view->buffer()->isSGML())
3837 t += "[" + u + "]" + "{" + s + "}";
3842 new InsetRef(t, current_view->buffer());
3843 current_view->buffer()->insertInset(new_inset);
3847 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3849 if (!current_view->available()) {
3850 fl_clear_browser(fd_form_ref->browser_ref);
3854 FL_OBJECT * brow = fd_form_ref->browser_ref;
3856 // Get the current line, in order to restore it later
3857 char const * const btmp = fl_get_browser_line(brow,
3858 fl_get_browser(brow));
3859 string currentstr = btmp ? btmp : "";
3860 //string currentstr = fl_get_browser_line(brow,
3861 // fl_get_browser(brow));
3863 fl_clear_browser(brow);
3865 string refs = current_view->buffer()->getReferenceList('\n');
3868 #if FL_REVISION > 85
3869 fl_addto_browser_chars(brow, refs.c_str());
3870 int total_lines = fl_get_browser_maxline(brow);
3871 for (int i = 1; i <= total_lines ; i++) {
3872 if (fl_get_browser_line(brow, i) == currentstr) {
3877 fl_set_browser_topline(brow, topline);
3879 // Keep the old ugly code for xforms 0.81 compatibility
3884 curr_ref = refs.token('\n', ref_num);
3885 if (curr_ref.empty())
3887 fl_add_browser_line(brow, curr_ref.c_str());
3892 if (!fl_get_browser_maxline(brow)) {
3893 fl_add_browser_line(brow,
3894 _("*** No labels found in document ***"));
3895 fl_deactivate_object(brow);
3897 fl_select_browser_line(brow, topline);
3898 fl_activate_object(brow);
3900 if (current_view->buffer()->isReadonly()) {
3901 // would be better to de/activate insert buttons
3902 // but that's more work... besides this works. ARRae
3903 fl_hide_form(fd_form_ref->form_ref);
3905 if (!current_view->buffer()->isSGML()) {
3906 fl_deactivate_object(fd_form_ref->ref_name);
3907 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3910 fl_activate_object(fd_form_ref->ref_name);
3911 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3916 extern "C" void RefHideCB(FL_OBJECT *, long)
3918 fl_hide_form(fd_form_ref->form_ref);
3922 void UpdateInset(Inset* inset, bool mark_dirty)
3927 /* very first check for locking insets*/
3928 if (current_view->buffer()->the_locking_inset == inset){
3929 if (current_view->buffer()->text->UpdateInset(inset)){
3930 current_view->update();
3932 if (current_view->buffer()->isLyxClean())
3933 minibuffer->setTimer(4);
3934 current_view->buffer()->markDirty();
3936 current_view->updateScrollbar();
3941 /* first check the current buffer */
3942 if (current_view->available()){
3943 current_view->getScreen()->HideCursor();
3944 current_view->buffer()->update(-3);
3945 if (current_view->buffer()->text->UpdateInset(inset)){
3947 current_view->buffer()->update(1);
3949 current_view->buffer()->update(3);
3954 // check all buffers
3955 bufferlist.updateInset(inset, mark_dirty);
3960 /* these functions return 1 if an error occured,
3962 int LockInset(UpdatableInset* inset)
3964 if (!current_view->buffer()->the_locking_inset && inset){
3965 current_view->buffer()->the_locking_inset = inset;
3972 void ShowLockedInsetCursor(long x, long y, int asc, int desc)
3974 if (current_view->buffer()->the_locking_inset &&
3975 current_view->getScreen()){
3976 y += current_view->buffer()->text->cursor.y;
3977 current_view->getScreen()->ShowManualCursor(x, y,
3983 void HideLockedInsetCursor(long x, long y, int asc, int desc)
3985 if (current_view->buffer()->the_locking_inset &&
3986 current_view->getScreen()){
3987 y += current_view->buffer()->text->cursor.y;
3988 current_view->getScreen()->HideManualCursor(x, y,
3994 void FitLockedInsetCursor(long x, long y, int asc, int desc)
3996 if (current_view->buffer()->the_locking_inset &&
3997 current_view->getScreen()){
3998 y += current_view->buffer()->text->cursor.y;
3999 if (current_view->getScreen()->FitManualCursor(x, y, asc, desc))
4000 current_view->updateScrollbar();
4005 int UnlockInset(UpdatableInset* inset)
4008 current_view->buffer()->the_locking_inset == inset){
4009 inset->InsetUnlock();
4010 current_view->buffer()->the_locking_inset = 0;
4011 current_view->buffer()->text->FinishUndo();
4014 return bufferlist.unlockInset(inset);
4018 void LockedInsetStoreUndo(Undo::undo_kind kind)
4020 if (!current_view->buffer()->the_locking_inset)
4021 return; // shouldn't happen
4022 if (kind == Undo::EDIT) // in this case insets would not be stored!
4023 kind = Undo::FINISH;
4024 current_view->buffer()->text->SetUndo(kind,
4025 current_view->buffer()->text->cursor.par->
4026 ParFromPos(current_view->buffer()->text->cursor.pos)->previous,
4027 current_view->buffer()->text->cursor.par->
4028 ParFromPos(current_view->buffer()->text->cursor.pos)->next);
4032 void PutInsetIntoInsetUpdateList(Inset* inset)
4035 InsetUpdateStruct* tmp = new InsetUpdateStruct();
4037 tmp->next = InsetUpdateList;
4038 InsetUpdateList = tmp;
4043 void UpdateInsetUpdateList()
4045 InsetUpdateStruct *tmp = InsetUpdateList;
4047 UpdateInset(tmp->inset, false); // "false" because no document change
4051 // delete the update list
4052 while (InsetUpdateList) {
4053 tmp = InsetUpdateList;
4054 InsetUpdateList = InsetUpdateList->next;
4057 InsetUpdateList = 0;
4060 #ifdef WITH_WARNINGS
4063 // I know we shouldn't put anything in here but this seems the fastest
4064 // way to do this (and the cleanest for now). This function just inserts
4065 // a newline in the string and the inserts 'depth'-spaces so that the
4066 // code is indented in the right way!!!
4067 void addNewlineAndDepth(string & file, int const depth)
4070 file.append(depth, ' ');