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(),
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(),
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(),
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(),
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)
1091 if (!current_view->getScreen()) return;
1093 if (fname.empty()) {
1095 fname = fileDlg.Select(_("File to Insert"),
1096 current_view->owner()->buffer()->filepath,
1099 if (fname.empty()) return;
1104 if (!fi.readable()) {
1105 WriteFSAlert(_("Error! Specified file is unreadable: "),
1106 MakeDisplayPath(fname, 50));
1110 FilePtr myfile(fname, FilePtr::read);
1112 WriteFSAlert(_("Error! Cannot open specified file: "),
1113 MakeDisplayPath(fname, 50));
1116 LyXParagraph * tmppar = new LyXParagraph;
1117 tmppar->readSimpleWholeFile(myfile);
1119 // set the end of the string
1120 #warning why do we do this?
1121 // I don't think this is needed. Actually it might be plain wrong.
1122 tmppar->InsertChar(tmppar->text.size() - 1,'\0');
1124 // insert the string
1125 current_view->getScreen()->HideCursor();
1127 // clear the selection
1130 current_view->buffer()->text->InsertStringA(tmppar->text);
1132 current_view->buffer()->text->InsertStringB(tmppar->text);
1134 current_view->buffer()->update(1);
1138 void MenuShowTableOfContents()
1140 static int ow = -1, oh;
1143 if (fd_form_toc->form_toc->visible) {
1144 fl_raise_form(fd_form_toc->form_toc);
1146 fl_show_form(fd_form_toc->form_toc,
1147 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1148 _("Table Of Contents"));
1150 ow = fd_form_toc->form_toc->w;
1151 oh = fd_form_toc->form_toc->h;
1153 fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
1158 void MenuInsertLabel(char const *arg)
1162 //string label = fl_show_input(_("Enter new label to insert:"), "");
1164 label = frontStrip(strip(askForText(_("Enter new label to insert:"))));
1165 if (!label.empty()) {
1166 InsetLabel * new_inset = new InsetLabel;
1167 new_inset->setContents(label);
1168 current_view->buffer()->insertInset(new_inset);
1174 void MenuInsertRef()
1176 static int ow = -1, oh;
1179 if (fd_form_ref->form_ref->visible) {
1180 fl_raise_form(fd_form_ref->form_ref);
1182 fl_show_form(fd_form_ref->form_ref,
1183 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1184 _("Insert Reference"));
1186 ow = fd_form_ref->form_ref->w;
1187 oh = fd_form_ref->form_ref->h;
1189 fl_set_form_minsize(fd_form_ref->form_ref, ow, oh);
1194 void MenuPasteSelection(char at)
1196 if (!current_view->getScreen())
1201 Atom data_prop = XInternAtom(fl_display,
1204 if (data_prop == None)
1206 XConvertSelection(fl_display,
1207 XA_PRIMARY, XA_STRING, data_prop,
1208 fd_form_main->form_main->window, 0);
1213 extern "C" void FootCB(FL_OBJECT*, long)
1215 if (!current_view->available())
1218 minibuffer->Set(_("Inserting Footnote..."));
1219 current_view->getScreen()->HideCursor();
1220 current_view->buffer()->update(-2);
1221 current_view->buffer()->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1222 current_view->buffer()->update(1);
1226 void LayoutsCB(int sel, void *)
1228 string tmp = tostr(sel);
1229 current_view->owner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1235 * SGML Linuxdoc support:
1236 * (flag == -1) import SGML file
1237 * (flag == 0) make TeX output
1238 * (flag == 1) make dvi output
1240 int RunLinuxDoc(int flag, string const & filename)
1249 /* generate a path-less extension name */
1250 name = ChangeExtension (filename, ".sgml", true);
1251 path = OnlyPath (filename);
1252 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1253 path = current_view->buffer()->tmppath;
1258 if (!current_view->available())
1260 current_view->buffer()->makeLinuxDocFile(name, 0);
1261 #ifdef WITH_WARNINGS
1262 #warning remove this once we have a proper geometry class
1264 BufferParams::PAPER_SIZE ps = static_cast<BufferParams::PAPER_SIZE>(current_view->buffer()->params.papersize);
1266 case BufferParams::PAPER_A4PAPER:
1267 add_flags = "-p a4";
1269 case BufferParams::PAPER_USLETTER:
1270 add_flags = "-p letter";
1272 default: /* nothing to be done yet ;-) */ break;
1280 case -1: /* Import file */
1281 minibuffer->Set(_("Importing LinuxDoc SGML file `"),
1282 MakeDisplayPath(filename), "'...");
1283 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1285 if (one.startscript(Systemcalls::System, s2))
1288 case 0: /* TeX output asked */
1289 minibuffer->Set(_("Converting LinuxDoc SGML to TeX file..."));
1290 s2 = "sgml2latex " + add_flags + " -o tex "
1291 + lyxrc->sgml_extra_options + ' ' + name;
1292 if (one.startscript(Systemcalls::System, s2))
1295 case 1: /* dvi output asked */
1296 minibuffer->Set(_("Converting LinuxDoc SGML to dvi file..."));
1297 s2 = "sgml2latex " + add_flags + " -o dvi "
1298 + lyxrc->sgml_extra_options + ' ' + name;
1299 if (one.startscript(Systemcalls::System, s2)) {
1302 current_view->buffer()->markDviClean();
1304 default: /* unknown output */
1310 current_view->buffer()->redraw();
1316 * SGML DocBook support:
1317 * (flag == 1) make dvi output
1319 int RunDocBook(int flag, string const & filename)
1327 /* generate a path-less extension name */
1328 name = ChangeExtension (filename, ".sgml", true);
1329 path = OnlyPath (filename);
1330 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1331 path = current_view->buffer()->tmppath;
1335 if (!current_view->available())
1338 current_view->buffer()->makeDocBookFile(name, 0);
1340 // Shall this code go or should it stay? (Lgb)
1341 // string add_flags;
1342 // LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->buffer()->params.papersize;
1344 // case BufferParams::PAPER_A4PAPER: add_flags = "-p a4"; break;
1345 // case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
1346 // default: /* nothing to be done yet ;-) */ break;
1352 case 1: /* dvi output asked */
1353 minibuffer->Set(_("Converting DocBook SGML to dvi file..."));
1354 s2 = "sgmltools --backend dvi " + name;
1355 if (one.startscript(Systemcalls::System, s2)) {
1358 current_view->buffer()->markDviClean();
1360 default: /* unknown output */
1366 current_view->buffer()->redraw();
1371 void AllFloats(char flag, char figmar)
1373 if (!current_view->available())
1376 LyXCursor cursor = current_view->buffer()->text->cursor;
1378 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1380 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1381 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1383 && cursor.par->footnotekind != LyXParagraph::FIG
1384 && cursor.par->footnotekind != LyXParagraph::TAB
1385 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1386 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1387 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1392 LyXCursor tmpcursor = cursor;
1393 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1394 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1396 LyXParagraph *par = current_view->buffer()->paragraph;
1399 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1403 par->footnotekind != LyXParagraph::FOOTNOTE
1405 par->footnotekind != LyXParagraph::MARGIN
1410 par->footnotekind != LyXParagraph::FIG
1412 par->footnotekind != LyXParagraph::TAB
1414 par->footnotekind != LyXParagraph::WIDE_FIG
1416 par->footnotekind != LyXParagraph::WIDE_TAB
1418 par->footnotekind != LyXParagraph::ALGORITHM
1423 && par->previous->footnoteflag !=
1424 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1425 current_view->buffer()->text->SetCursorIntern(par->previous,
1427 current_view->buffer()->text->OpenFootnote();
1432 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1436 par->footnotekind != LyXParagraph::FOOTNOTE
1438 par->footnotekind != LyXParagraph::MARGIN
1443 par->footnotekind != LyXParagraph::FIG
1445 par->footnotekind != LyXParagraph::TAB
1447 par->footnotekind != LyXParagraph::WIDE_FIG
1449 par->footnotekind != LyXParagraph::WIDE_TAB
1451 par->footnotekind != LyXParagraph::ALGORITHM
1455 current_view->buffer()->text->SetCursorIntern(par, 0);
1456 current_view->buffer()->text->CloseFootnote();
1462 current_view->buffer()->text->SetCursorIntern(cursor.par, cursor.pos);
1463 current_view->redraw();
1464 current_view->fitCursor();
1465 current_view->updateScrollbar();
1469 void MenuLayoutCharacter()
1471 static int ow = -1, oh;
1473 if (fd_form_character->form_character->visible) {
1474 fl_raise_form(fd_form_character->form_character);
1476 fl_show_form(fd_form_character->form_character,
1477 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1478 _("Character Style"));
1480 ow = fd_form_character->form_character->w;
1481 oh = fd_form_character->form_character->h;
1483 fl_set_form_minsize(fd_form_character->form_character, ow, oh);
1488 inline void DeactivateParagraphButtons ()
1490 fl_deactivate_object (fd_form_paragraph->button_ok);
1491 fl_deactivate_object (fd_form_paragraph->button_apply);
1492 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1493 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1496 inline void ActivateParagraphButtons ()
1498 fl_activate_object (fd_form_paragraph->button_ok);
1499 fl_activate_object (fd_form_paragraph->button_apply);
1500 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1501 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1504 inline void DisableParagraphLayout ()
1506 DeactivateParagraphButtons();
1507 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1508 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1509 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1510 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1511 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1512 fl_deactivate_object (fd_form_paragraph->check_noindent);
1513 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1514 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1515 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1516 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1517 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1518 fl_deactivate_object (fd_form_paragraph->input_space_above);
1519 fl_deactivate_object (fd_form_paragraph->input_space_below);
1520 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1521 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1522 fl_deactivate_object (fd_form_paragraph->check_space_above);
1523 fl_deactivate_object (fd_form_paragraph->check_space_below);
1526 inline void EnableParagraphLayout ()
1528 ActivateParagraphButtons();
1529 fl_activate_object (fd_form_paragraph->input_labelwidth);
1530 fl_activate_object (fd_form_paragraph->check_lines_top);
1531 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1532 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1533 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1534 fl_activate_object (fd_form_paragraph->check_noindent);
1535 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1536 fl_activate_object (fd_form_paragraph->radio_align_right);
1537 fl_activate_object (fd_form_paragraph->radio_align_left);
1538 fl_activate_object (fd_form_paragraph->radio_align_block);
1539 fl_activate_object (fd_form_paragraph->radio_align_center);
1540 fl_activate_object (fd_form_paragraph->input_space_above);
1541 fl_activate_object (fd_form_paragraph->input_space_below);
1542 fl_activate_object (fd_form_paragraph->choice_space_above);
1543 fl_activate_object (fd_form_paragraph->choice_space_below);
1544 fl_activate_object (fd_form_paragraph->check_space_above);
1545 fl_activate_object (fd_form_paragraph->check_space_below);
1548 bool UpdateLayoutParagraph()
1550 if (!current_view->getScreen() || !current_view->available()) {
1551 if (fd_form_paragraph->form_paragraph->visible)
1552 fl_hide_form(fd_form_paragraph->form_paragraph);
1556 Buffer * buf = current_view->buffer();
1558 fl_set_input(fd_form_paragraph->input_labelwidth,
1559 buf->text->cursor.par->GetLabelWidthString().c_str());
1560 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1561 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1562 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1563 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1565 int align = buf->text->cursor.par->GetAlign();
1566 if (align == LYX_ALIGN_LAYOUT)
1567 align = textclasslist.Style(buf->params.textclass,
1568 buf->text->cursor.par->GetLayout()).align;
1571 case LYX_ALIGN_RIGHT:
1572 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1574 case LYX_ALIGN_LEFT:
1575 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1577 case LYX_ALIGN_CENTER:
1578 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1581 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1585 fl_set_button(fd_form_paragraph->check_lines_top,
1586 buf->text->cursor.par->FirstPhysicalPar()->line_top);
1587 fl_set_button(fd_form_paragraph->check_lines_bottom,
1588 buf->text->cursor.par->FirstPhysicalPar()->line_bottom);
1589 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1590 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1591 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1592 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1593 fl_set_button(fd_form_paragraph->check_noindent,
1594 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1595 fl_set_input (fd_form_paragraph->input_space_above, "");
1597 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1599 fl_set_choice (fd_form_paragraph->choice_space_above,
1602 case VSpace::DEFSKIP:
1603 fl_set_choice (fd_form_paragraph->choice_space_above,
1606 case VSpace::SMALLSKIP:
1607 fl_set_choice (fd_form_paragraph->choice_space_above,
1610 case VSpace::MEDSKIP:
1611 fl_set_choice (fd_form_paragraph->choice_space_above,
1614 case VSpace::BIGSKIP:
1615 fl_set_choice (fd_form_paragraph->choice_space_above,
1619 fl_set_choice (fd_form_paragraph->choice_space_above,
1622 case VSpace::LENGTH:
1623 fl_set_choice (fd_form_paragraph->choice_space_above,
1625 fl_set_input (fd_form_paragraph->input_space_above,
1626 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1629 fl_set_button (fd_form_paragraph->check_space_above,
1630 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1631 fl_set_input (fd_form_paragraph->input_space_below, "");
1632 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1634 fl_set_choice (fd_form_paragraph->choice_space_below,
1637 case VSpace::DEFSKIP:
1638 fl_set_choice (fd_form_paragraph->choice_space_below,
1641 case VSpace::SMALLSKIP:
1642 fl_set_choice (fd_form_paragraph->choice_space_below,
1645 case VSpace::MEDSKIP:
1646 fl_set_choice (fd_form_paragraph->choice_space_below,
1649 case VSpace::BIGSKIP:
1650 fl_set_choice (fd_form_paragraph->choice_space_below,
1654 fl_set_choice (fd_form_paragraph->choice_space_below,
1657 case VSpace::LENGTH:
1658 fl_set_choice (fd_form_paragraph->choice_space_below,
1660 fl_set_input (fd_form_paragraph->input_space_below,
1661 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1664 fl_set_button (fd_form_paragraph->check_space_below,
1665 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1667 fl_set_button(fd_form_paragraph->check_noindent,
1668 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1670 if (current_view->buffer()->isReadonly()) {
1671 DisableParagraphLayout();
1673 EnableParagraphLayout();
1678 void MenuLayoutParagraph()
1680 if (UpdateLayoutParagraph()) {
1681 if (fd_form_paragraph->form_paragraph->visible) {
1682 fl_raise_form(fd_form_paragraph->form_paragraph);
1684 fl_show_form(fd_form_paragraph->form_paragraph,
1685 FL_PLACE_MOUSE, FL_FULLBORDER,
1686 _("Paragraph Environment"));
1693 void DeactivateDocumentButtons ()
1695 fl_deactivate_object (fd_form_document->button_ok);
1696 fl_deactivate_object (fd_form_document->button_apply);
1697 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1698 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1703 void ActivateDocumentButtons ()
1705 fl_activate_object (fd_form_document->button_ok);
1706 fl_activate_object (fd_form_document->button_apply);
1707 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1708 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1712 void DisableDocumentLayout ()
1714 DeactivateDocumentButtons ();
1715 fl_deactivate_object (fd_form_document->group_radio_separation);
1716 fl_deactivate_object (fd_form_document->radio_indent);
1717 fl_deactivate_object (fd_form_document->radio_skip);
1718 fl_deactivate_object (fd_form_document->choice_class);
1719 fl_deactivate_object (fd_form_document->choice_pagestyle);
1720 fl_deactivate_object (fd_form_document->choice_fonts);
1721 fl_deactivate_object (fd_form_document->choice_fontsize);
1722 fl_deactivate_object (fd_form_document->input_float_placement);
1723 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1724 fl_deactivate_object (fd_form_document->choice_inputenc);
1725 fl_deactivate_object (fd_form_document->group_radio_sides);
1726 fl_deactivate_object (fd_form_document->radio_sides_one);
1727 fl_deactivate_object (fd_form_document->radio_sides_two);
1728 fl_deactivate_object (fd_form_document->group_radio_columns);
1729 fl_deactivate_object (fd_form_document->radio_columns_one);
1730 fl_deactivate_object (fd_form_document->radio_columns_two);
1731 fl_deactivate_object (fd_form_document->input_extra);
1732 fl_deactivate_object (fd_form_document->choice_language);
1733 combo_language->deactivate();
1734 fl_deactivate_object (fd_form_document->input_default_skip);
1735 fl_deactivate_object (fd_form_document->choice_default_skip);
1736 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1737 fl_deactivate_object (fd_form_document->slider_tocdepth);
1738 fl_deactivate_object (fd_form_document->choice_spacing);
1739 fl_deactivate_object (fd_form_document->input_spacing);
1740 fl_deactivate_object (fd_form_document->check_use_amsmath);
1744 void EnableDocumentLayout ()
1746 ActivateDocumentButtons ();
1747 fl_activate_object (fd_form_document->group_radio_separation);
1748 fl_activate_object (fd_form_document->radio_indent);
1749 fl_activate_object (fd_form_document->radio_skip);
1750 fl_activate_object (fd_form_document->choice_class);
1751 fl_activate_object (fd_form_document->choice_pagestyle);
1752 fl_activate_object (fd_form_document->choice_fonts);
1753 fl_activate_object (fd_form_document->choice_fontsize);
1754 fl_activate_object (fd_form_document->input_float_placement);
1755 fl_activate_object (fd_form_document->choice_postscript_driver);
1756 fl_activate_object (fd_form_document->choice_inputenc);
1757 fl_activate_object (fd_form_document->group_radio_sides);
1758 fl_activate_object (fd_form_document->radio_sides_one);
1759 fl_activate_object (fd_form_document->radio_sides_two);
1760 fl_activate_object (fd_form_document->group_radio_columns);
1761 fl_activate_object (fd_form_document->radio_columns_one);
1762 fl_activate_object (fd_form_document->radio_columns_two);
1763 fl_activate_object (fd_form_document->input_extra);
1764 fl_activate_object (fd_form_document->choice_language);
1765 combo_language->activate();
1766 fl_activate_object (fd_form_document->input_default_skip);
1767 fl_activate_object (fd_form_document->choice_default_skip);
1768 fl_activate_object (fd_form_document->slider_secnumdepth);
1769 fl_activate_object (fd_form_document->slider_tocdepth);
1770 fl_activate_object (fd_form_document->choice_spacing);
1771 fl_activate_object (fd_form_document->input_spacing);
1772 fl_activate_object (fd_form_document->check_use_amsmath);
1775 bool UpdateLayoutDocument(BufferParams *params)
1777 if (!current_view->getScreen() || !current_view->available()) {
1778 if (fd_form_document->form_document->visible)
1779 fl_hide_form(fd_form_document->form_document);
1784 params = ¤t_view->buffer()->params;
1785 LyXTextClass const & tclass = textclasslist.TextClass(params->textclass);
1787 fl_set_choice_text(fd_form_document->choice_class,
1788 textclasslist.DescOfClass(params->textclass).c_str());
1789 combo_language->select_text(params->language.c_str());
1791 fl_set_choice_text(fd_form_document->choice_fonts,
1792 params->fonts.c_str());
1793 fl_set_choice_text(fd_form_document->choice_inputenc,
1794 params->inputenc.c_str());
1795 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1796 params->graphicsDriver.c_str());
1798 // ale970405+lasgoutt970513
1799 fl_clear_choice(fd_form_document->choice_fontsize);
1800 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1801 fl_addto_choice(fd_form_document->choice_fontsize,
1802 tclass.opt_fontsize().c_str());
1803 fl_set_choice(fd_form_document->choice_fontsize,
1804 tokenPos(tclass.opt_fontsize(), '|', params->fontsize) + 2);
1806 // ale970405+lasgoutt970513
1807 fl_clear_choice(fd_form_document->choice_pagestyle);
1808 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1809 fl_addto_choice(fd_form_document->choice_pagestyle,
1810 tclass.opt_pagestyle().c_str());
1812 fl_set_choice(fd_form_document->choice_pagestyle,
1813 tokenPos(tclass.opt_pagestyle(), '|', params->pagestyle) + 2);
1815 fl_set_button(fd_form_document->radio_indent, 0);
1816 fl_set_button(fd_form_document->radio_skip, 0);
1819 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1821 if (params->paragraph_separation == BufferParams::PARSEP_INDENT)
1822 fl_set_button(fd_form_document->radio_indent, 1);
1824 fl_set_button(fd_form_document->radio_skip, 1);
1826 switch (params->getDefSkip().kind()) {
1827 case VSpace::SMALLSKIP:
1828 fl_set_choice (fd_form_document->choice_default_skip, 1);
1830 case VSpace::MEDSKIP:
1831 fl_set_choice (fd_form_document->choice_default_skip, 2);
1833 case VSpace::BIGSKIP:
1834 fl_set_choice (fd_form_document->choice_default_skip, 3);
1836 case VSpace::LENGTH:
1837 fl_set_choice (fd_form_document->choice_default_skip, 4);
1838 fl_set_input (fd_form_document->input_default_skip,
1839 params->getDefSkip().asLyXCommand().c_str());
1842 fl_set_choice (fd_form_document->choice_default_skip, 2);
1846 fl_set_button(fd_form_document->radio_sides_one, 0);
1847 fl_set_button(fd_form_document->radio_sides_two, 0);
1849 if (params->sides == 2)
1850 fl_set_button(fd_form_document->radio_sides_two, 1);
1852 fl_set_button(fd_form_document->radio_sides_one, 1);
1854 fl_set_button(fd_form_document->radio_columns_one, 0);
1855 fl_set_button(fd_form_document->radio_columns_two, 0);
1857 if (params->columns == 2)
1858 fl_set_button(fd_form_document->radio_columns_two, 1);
1860 fl_set_button(fd_form_document->radio_columns_one, 1);
1862 fl_set_input(fd_form_document->input_spacing, "");
1863 switch (params->spacing.getSpace()) {
1864 case Spacing::Single:
1867 fl_set_choice(fd_form_document->choice_spacing, 1);
1870 case Spacing::Onehalf:
1873 fl_set_choice(fd_form_document->choice_spacing, 2);
1876 case Spacing::Double:
1879 fl_set_choice(fd_form_document->choice_spacing, 3);
1882 case Spacing::Other:
1884 fl_set_choice(fd_form_document->choice_spacing, 4);
1886 sprintf(sval, "%g", params->spacing.getValue());
1887 fl_set_input(fd_form_document->input_spacing, sval);
1893 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1894 params->secnumdepth);
1895 fl_set_counter_value(fd_form_document->slider_tocdepth,
1897 if (!params->float_placement.empty()) { // buffer local (Lgb)
1898 fl_set_input(fd_form_document->input_float_placement,
1899 params->float_placement.c_str());
1901 fl_set_input(fd_form_document->input_float_placement, "");
1903 if (!params->options.empty())
1904 fl_set_input(fd_form_document->input_extra,
1905 params->options.c_str());
1907 fl_set_input(fd_form_document->input_extra, "");
1909 if (current_view->buffer()->isSGML()) {
1910 // bullets not used in SGML derived documents
1911 fl_deactivate_object(fd_form_document->button_bullets);
1912 fl_set_object_lcol(fd_form_document->button_bullets,
1915 fl_activate_object(fd_form_document->button_bullets);
1916 fl_set_object_lcol(fd_form_document->button_bullets,
1920 if (current_view->buffer()->isReadonly()) {
1921 DisableDocumentLayout();
1923 EnableDocumentLayout();
1929 void MenuLayoutDocument()
1931 if (UpdateLayoutDocument()) {
1932 if (fd_form_document->form_document->visible) {
1933 fl_raise_form(fd_form_document->form_document);
1935 fl_show_form(fd_form_document->form_document,
1936 FL_PLACE_MOUSE, FL_FULLBORDER,
1937 _("Document Layout"));
1943 bool UpdateLayoutQuotes()
1946 if (!current_view->getScreen()
1947 || !current_view->available()
1948 || current_view->buffer()->isReadonly())
1952 fl_set_choice(fd_form_quotes->choice_quotes_language,
1953 current_view->buffer()->params.quotes_language + 1);
1954 fl_set_button(fd_form_quotes->radio_single, 0);
1955 fl_set_button(fd_form_quotes->radio_double, 0);
1957 if (current_view->buffer()->params.quotes_times == InsetQuotes::SingleQ)
1958 fl_set_button(fd_form_quotes->radio_single, 1);
1960 fl_set_button(fd_form_quotes->radio_double, 1);
1961 } else if (fd_form_quotes->form_quotes->visible) {
1962 fl_hide_form(fd_form_quotes->form_quotes);
1967 void MenuLayoutQuotes()
1969 if (UpdateLayoutQuotes()) {
1970 if (fd_form_quotes->form_quotes->visible) {
1971 fl_raise_form(fd_form_quotes->form_quotes);
1973 fl_show_form(fd_form_quotes->form_quotes,
1974 FL_PLACE_MOUSE, FL_FULLBORDER,
1981 bool UpdateLayoutPreamble()
1984 if (!current_view->getScreen() || ! current_view->available())
1988 fl_set_input(fd_form_preamble->input_preamble,
1989 current_view->buffer()->params.preamble.c_str());
1991 if (current_view->buffer()->isReadonly()) {
1992 fl_deactivate_object(fd_form_preamble->input_preamble);
1993 fl_deactivate_object(fd_form_preamble->button_ok);
1994 fl_deactivate_object(fd_form_preamble->button_apply);
1995 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
1996 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
1999 fl_activate_object(fd_form_preamble->input_preamble);
2000 fl_activate_object(fd_form_preamble->button_ok);
2001 fl_activate_object(fd_form_preamble->button_apply);
2002 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
2003 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
2005 } else if (fd_form_preamble->form_preamble->visible) {
2006 fl_hide_form(fd_form_preamble->form_preamble);
2011 void MenuLayoutPreamble()
2013 static int ow = -1, oh;
2015 if (UpdateLayoutPreamble()) {
2016 if (fd_form_preamble->form_preamble->visible) {
2017 fl_raise_form(fd_form_preamble->form_preamble);
2019 fl_show_form(fd_form_preamble->form_preamble,
2020 FL_PLACE_MOUSE | FL_FREE_SIZE,
2022 _("LaTeX Preamble"));
2024 ow = fd_form_preamble->form_preamble->w;
2025 oh = fd_form_preamble->form_preamble->h;
2027 fl_set_form_minsize(fd_form_preamble->form_preamble,
2033 void MenuLayoutSave()
2035 if (!current_view->getScreen() || ! current_view->available())
2038 if (AskQuestion(_("Do you want to save the current settings"),
2039 _("for Character, Document, Paper and Quotes"),
2040 _("as default for new documents?")))
2041 current_view->buffer()->saveParamsAsDefaults();
2047 InsetInfo * new_inset = new InsetInfo();
2048 current_view->buffer()->insertInset(new_inset);
2049 new_inset->Edit(0, 0);
2055 if (current_view->available()) {
2056 minibuffer->Set(_("Open/Close..."));
2057 current_view->getScreen()->HideCursor();
2059 current_view->buffer()->update(-2);
2060 current_view->buffer()->text->OpenStuff();
2061 current_view->buffer()->update(0);
2067 if (current_view->available()) {
2068 minibuffer->Set(_("Open/Close..."));
2069 current_view->getScreen()->HideCursor();
2071 current_view->buffer()->update(-2);
2072 current_view->buffer()->text->ToggleFootnote();
2073 current_view->buffer()->update(0);
2080 /* if (current_view->buffer()->the_locking_inset) {
2081 minibuffer->Set(_("Undo not yet supported in math mode"));
2085 if (current_view->available()) {
2086 minibuffer->Set(_("Undo"));
2087 current_view->getScreen()->HideCursor();
2089 current_view->buffer()->update(-2);
2090 if (!current_view->buffer()->text->TextUndo())
2091 minibuffer->Set(_("No further undo information"));
2093 current_view->buffer()->update(-1);
2100 if (current_view->buffer()->the_locking_inset) {
2101 minibuffer->Set(_("Redo not yet supported in math mode"));
2105 if (current_view->available()) {
2106 minibuffer->Set(_("Redo"));
2107 current_view->getScreen()->HideCursor();
2109 current_view->buffer()->update(-2);
2110 if (!current_view->buffer()->text->TextRedo())
2111 minibuffer->Set(_("No further redo information"));
2113 current_view->buffer()->update(-1);
2118 void HyphenationPoint()
2120 if (current_view->available()) {
2121 current_view->getScreen()->HideCursor();
2122 current_view->buffer()->update(-2);
2123 InsetSpecialChar * new_inset =
2124 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2125 current_view->buffer()->insertInset(new_inset);
2132 if (current_view->available()) {
2133 current_view->getScreen()->HideCursor();
2134 current_view->buffer()->update(-2);
2135 InsetSpecialChar * new_inset =
2136 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2137 current_view->buffer()->insertInset(new_inset);
2142 void EndOfSentenceDot()
2144 if (current_view->available()) {
2145 current_view->getScreen()->HideCursor();
2146 current_view->buffer()->update(-2);
2147 InsetSpecialChar * new_inset =
2148 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2149 current_view->buffer()->insertInset(new_inset);
2154 void MenuSeparator()
2156 if (current_view->available()) {
2157 current_view->getScreen()->HideCursor();
2158 current_view->buffer()->update(-2);
2159 InsetSpecialChar * new_inset =
2160 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2161 current_view->buffer()->insertInset(new_inset);
2168 if (current_view->available()) {
2169 current_view->getScreen()->HideCursor();
2170 current_view->buffer()->update(-2);
2171 current_view->buffer()->text->InsertChar(LyXParagraph::META_NEWLINE);
2172 current_view->buffer()->update(-1);
2177 void ProtectedBlank()
2179 if (current_view->available()) {
2180 current_view->getScreen()->HideCursor();
2181 current_view->buffer()->update(-2);
2182 current_view->buffer()->text->InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR);
2183 current_view->buffer()->update(-1);
2190 if (current_view->available()) {
2191 current_view->getScreen()->HideCursor();
2192 current_view->buffer()->update(-2);
2193 current_view->buffer()->text->InsertChar(LyXParagraph::META_HFILL);
2194 current_view->buffer()->update(-1);
2199 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2200 They also show the current font state. */
2203 void ToggleAndShow(LyXFont const &);
2206 void FontSizeCB(string const & size)
2208 LyXFont font(LyXFont::ALL_IGNORE);
2209 font.setGUISize(size);
2210 ToggleAndShow(font);
2216 LyXFont font(LyXFont::ALL_IGNORE);
2217 font.setEmph(LyXFont::TOGGLE);
2218 ToggleAndShow(font);
2224 LyXFont font(LyXFont::ALL_IGNORE);
2225 font.setNoun(LyXFont::TOGGLE);
2226 ToggleAndShow(font);
2232 LyXFont font(LyXFont::ALL_IGNORE);
2233 font.setSeries(LyXFont::BOLD_SERIES);
2234 ToggleAndShow(font);
2240 LyXFont font(LyXFont::ALL_IGNORE);
2241 font.setUnderbar(LyXFont::TOGGLE);
2242 ToggleAndShow(font);
2248 LyXFont font(LyXFont::ALL_IGNORE);
2249 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2250 ToggleAndShow(font);
2256 LyXFont font(LyXFont::ALL_IGNORE);
2257 font.setFamily(LyXFont::SANS_FAMILY);
2258 ToggleAndShow(font);
2264 LyXFont font(LyXFont::ALL_IGNORE);
2265 font.setFamily(LyXFont::ROMAN_FAMILY);
2266 ToggleAndShow(font);
2272 LyXFont font(LyXFont::ALL_IGNORE);
2273 font.setLatex (LyXFont::TOGGLE);
2274 ToggleAndShow(font);
2280 LyXFont font(LyXFont::ALL_INHERIT);
2281 ToggleAndShow(font);
2285 /* -------> Returns the current font and depth by printing a message. In the
2286 * future perhaps we could try to implement a callback to the button-bar.
2287 * That is, `light' the bold button when the font is currently bold, etc.
2289 string CurrentState()
2292 if (current_view->available()) {
2293 // I think we should only show changes from the default
2295 Buffer * buffer = current_view->buffer();
2296 LyXFont font = buffer->text->real_current_font;
2297 LyXFont defaultfont = textclasslist.TextClass(buffer->
2298 params.textclass).defaultfont();
2299 font.reduce(defaultfont);
2300 state = _("Font: ") + font.stateText();
2302 int depth = buffer->text->GetDepth();
2304 state += string(_(", Depth: ")) + tostr(depth);
2310 /* -------> Does the actual toggle job of the XxxCB() calls above.
2311 * Also shows the current font state.
2314 void ToggleAndShow(LyXFont const & font)
2316 if (current_view->available()) {
2317 current_view->getScreen()->HideCursor();
2318 current_view->buffer()->update(-2);
2319 current_view->buffer()->text->ToggleFree(font, toggleall);
2320 current_view->buffer()->update(1);
2322 // removed since it overrides the ToggleFree Message about the style
2323 // Since Styles are more "High Level" than raw fonts I think the user
2324 // prefers it like this Matthias
2325 // FontStateShowCB( 0, 0 );
2329 extern "C" void MarginCB(FL_OBJECT *, long)
2331 if (current_view->available()) {
2332 minibuffer->Set(_("Inserting margin note..."));
2333 current_view->getScreen()->HideCursor();
2334 current_view->buffer()->update(-2);
2335 current_view->buffer()->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2336 current_view->buffer()->update(1);
2341 extern "C" void FigureCB(FL_OBJECT *, long)
2343 if (fd_form_figure->form_figure->visible) {
2344 fl_raise_form(fd_form_figure->form_figure);
2346 fl_show_form(fd_form_figure->form_figure,
2347 FL_PLACE_MOUSE, FL_FULLBORDER,
2348 _("Insert Figure"));
2353 extern "C" void TableCB(FL_OBJECT *, long)
2355 if (fd_form_table->form_table->visible) {
2356 fl_raise_form(fd_form_table->form_table);
2358 fl_show_form(fd_form_table->form_table,
2359 FL_PLACE_MOUSE, FL_FULLBORDER,
2365 void CopyEnvironmentCB()
2367 if (current_view->available()) {
2368 current_view->buffer()->text->copyEnvironmentType();
2369 /* clear the selection, even if mark_set */
2370 current_view->getScreen()->ToggleSelection();
2371 current_view->buffer()->text->ClearSelection();
2372 current_view->buffer()->update(-2);
2373 minibuffer->Set(_("Paragraph environment type copied"));
2378 void PasteEnvironmentCB()
2380 if (current_view->available()) {
2381 current_view->buffer()->text->pasteEnvironmentType();
2382 minibuffer->Set(_("Paragraph environment type set"));
2383 current_view->buffer()->update(1);
2390 if (current_view->available()) {
2391 current_view->buffer()->text->CopySelection();
2392 /* clear the selection, even if mark_set */
2393 current_view->getScreen()->ToggleSelection();
2394 current_view->buffer()->text->ClearSelection();
2395 current_view->buffer()->update(-2);
2396 minibuffer->Set(_("Copy"));
2403 if (current_view->available()) {
2404 current_view->getScreen()->HideCursor();
2405 current_view->buffer()->update(-2);
2406 current_view->buffer()->text->CutSelection();
2407 current_view->buffer()->update(1);
2408 minibuffer->Set(_("Cut"));
2415 if (!current_view->available()) return;
2417 minibuffer->Set(_("Paste"));
2418 current_view->getScreen()->HideCursor();
2419 /* clear the selection */
2420 current_view->getScreen()->ToggleSelection();
2421 current_view->buffer()->text->ClearSelection();
2422 current_view->buffer()->update(-2);
2425 current_view->buffer()->text->PasteSelection();
2426 current_view->buffer()->update(1);
2428 /* clear the selection */
2429 current_view->getScreen()->ToggleSelection();
2430 current_view->buffer()->text->ClearSelection();
2431 current_view->buffer()->update(-2);
2435 extern "C" void MeltCB(FL_OBJECT *, long)
2437 if (!current_view->available()) return;
2439 minibuffer->Set(_("Melt"));
2440 current_view->getScreen()->HideCursor();
2442 current_view->buffer()->update(-2);
2443 current_view->buffer()->text->MeltFootnoteEnvironment();
2444 current_view->buffer()->update(1);
2448 // Change environment depth.
2449 // if decInc == 0, depth change taking mouse button number into account
2450 // if decInc == 1, increment depth
2451 // if decInc == -1, decrement depth
2452 extern "C" void DepthCB(FL_OBJECT *ob, long decInc)
2456 /* When decInc != 0, fake a mouse button. This allows us to
2457 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2458 /* check out wether ob is defined, too (Matthias) */
2461 else if (!decInc && ob) {
2462 button = fl_get_button_numb(ob);
2465 if (current_view->available()) {
2466 current_view->getScreen()->HideCursor();
2467 current_view->buffer()->update(-2);
2469 current_view->buffer()->text->IncDepth();
2471 current_view->buffer()->text->DecDepth();
2472 current_view->buffer()->update(1);
2473 minibuffer->Set(_("Changed environment depth"
2474 " (in possible range, maybe not)"));
2479 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2480 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2481 LyXFont UserFreeFont()
2483 LyXFont font(LyXFont::ALL_IGNORE);
2486 pos = fl_get_choice(fd_form_character->choice_family);
2488 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2489 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2490 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2491 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2492 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2495 pos = fl_get_choice(fd_form_character->choice_series);
2497 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2498 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2499 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2500 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2503 pos = fl_get_choice(fd_form_character->choice_shape);
2505 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2506 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2507 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2508 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2509 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2510 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2513 pos = fl_get_choice(fd_form_character->choice_size);
2515 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2516 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2517 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2518 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2519 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2520 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2521 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2522 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2523 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2524 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2525 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2526 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2527 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2528 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2531 pos = fl_get_choice(fd_form_character->choice_bar);
2533 case 1: font.setEmph(LyXFont::IGNORE);
2534 font.setUnderbar(LyXFont::IGNORE);
2535 font.setNoun(LyXFont::IGNORE);
2536 font.setLatex(LyXFont::IGNORE);
2538 case 2: font.setEmph(LyXFont::TOGGLE); break;
2539 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2540 case 4: font.setNoun(LyXFont::TOGGLE); break;
2541 case 5: font.setLatex(LyXFont::TOGGLE); break;
2542 case 6: font.setEmph(LyXFont::INHERIT);
2543 font.setUnderbar(LyXFont::INHERIT);
2544 font.setNoun(LyXFont::INHERIT);
2545 font.setLatex(LyXFont::INHERIT);
2549 pos = fl_get_choice(fd_form_character->choice_color);
2551 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2552 case 2: font.setColor(LyXFont::NONE); break;
2553 case 3: font.setColor(LyXFont::BLACK); break;
2554 case 4: font.setColor(LyXFont::WHITE); break;
2555 case 5: font.setColor(LyXFont::RED); break;
2556 case 6: font.setColor(LyXFont::GREEN); break;
2557 case 7: font.setColor(LyXFont::BLUE); break;
2558 case 8: font.setColor(LyXFont::CYAN); break;
2559 case 9: font.setColor(LyXFont::MAGENTA); break;
2560 case 10: font.setColor(LyXFont::YELLOW); break;
2561 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2570 ToggleAndShow(UserFreeFont());
2574 /* callbacks for form form_title */
2575 extern "C" void TimerCB(FL_OBJECT *, long)
2577 // only if the form still exists
2578 if (fd_form_title->form_title != 0) {
2579 if (fd_form_title->form_title->visible) {
2580 fl_hide_form(fd_form_title->form_title);
2582 fl_free_form(fd_form_title->form_title);
2583 fd_form_title->form_title = 0;
2588 /* callbacks for form form_paragraph */
2590 extern "C" void ParagraphVSpaceCB(FL_OBJECT* obj, long )
2592 // "Synchronize" the choices and input fields, making it
2593 // impossible to commit senseless data.
2595 const FD_form_paragraph* fp = fd_form_paragraph;
2597 if (obj == fp->choice_space_above) {
2598 if (fl_get_choice (fp->choice_space_above) != 7) {
2599 fl_set_input (fp->input_space_above, "");
2600 ActivateParagraphButtons();
2602 } else if (obj == fp->choice_space_below) {
2603 if (fl_get_choice (fp->choice_space_below) != 7) {
2604 fl_set_input (fp->input_space_below, "");
2605 ActivateParagraphButtons();
2607 } else if (obj == fp->input_space_above) {
2608 string input = fl_get_input (fp->input_space_above);
2610 if (input.empty()) {
2611 fl_set_choice (fp->choice_space_above, 1);
2612 ActivateParagraphButtons();
2614 else if (isValidGlueLength (input)) {
2615 fl_set_choice (fp->choice_space_above, 7);
2616 ActivateParagraphButtons();
2619 fl_set_choice (fp->choice_space_above, 7);
2620 DeactivateParagraphButtons();
2622 } else if (obj == fp->input_space_below) {
2623 string input = fl_get_input (fp->input_space_below);
2625 if (input.empty()) {
2626 fl_set_choice (fp->choice_space_below, 1);
2627 ActivateParagraphButtons();
2629 else if (isValidGlueLength (input)) {
2630 fl_set_choice (fp->choice_space_below, 7);
2631 ActivateParagraphButtons();
2634 fl_set_choice (fp->choice_space_below, 7);
2635 DeactivateParagraphButtons();
2641 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2643 if (!current_view->available())
2646 VSpace space_top, space_bottom;
2648 string labelwidthstring;
2651 // If a vspace kind is "Length" but there's no text in
2652 // the input field, reset the kind to "None".
2653 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2654 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2655 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2657 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2658 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2659 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2662 bool line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2663 bool line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2664 bool pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2665 bool pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2666 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2667 case 1: space_top = VSpace(VSpace::NONE); break;
2668 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2669 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2670 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2671 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2672 case 6: space_top = VSpace(VSpace::VFILL); break;
2673 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2675 if (fl_get_button (fd_form_paragraph->check_space_above))
2676 space_top.setKeep (true);
2677 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2678 case 1: space_bottom = VSpace(VSpace::NONE); break;
2679 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2680 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2681 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2682 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2683 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2684 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2686 if (fl_get_button (fd_form_paragraph->check_space_below))
2687 space_bottom.setKeep (true);
2689 if (fl_get_button(fd_form_paragraph->radio_align_left))
2690 align = LYX_ALIGN_LEFT;
2691 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2692 align = LYX_ALIGN_RIGHT;
2693 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2694 align = LYX_ALIGN_CENTER;
2696 align = LYX_ALIGN_BLOCK;
2698 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2699 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2701 current_view->buffer()->text->SetParagraph(line_top,
2710 current_view->buffer()->update(1);
2711 minibuffer->Set(_("Paragraph layout set"));
2715 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2717 fl_hide_form(fd_form_paragraph->form_paragraph);
2721 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2723 ParagraphApplyCB(ob, data);
2724 ParagraphCancelCB(ob, data);
2728 /* callbacks for form form_character */
2730 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2732 // we set toggleall locally here, since it should be true for
2733 // all other uses of ToggleAndShow() (JMarc)
2734 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2735 ToggleAndShow( UserFreeFont());
2740 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2742 fl_hide_form(fd_form_character->form_character);
2746 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2748 CharacterApplyCB(ob, data);
2749 CharacterCloseCB(ob, data);
2753 /* callbacks for form form_document */
2755 void UpdateDocumentButtons(BufferParams const ¶ms)
2757 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2759 if (params.sides == 2)
2760 fl_set_button(fd_form_document->radio_sides_two, 1);
2762 fl_set_button(fd_form_document->radio_sides_one, 1);
2764 if (params.columns == 2)
2765 fl_set_button(fd_form_document->radio_columns_two, 1);
2767 fl_set_button(fd_form_document->radio_columns_one, 1);
2769 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2770 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2771 params.secnumdepth);
2772 fl_set_counter_value(fd_form_document->slider_tocdepth,
2777 extern "C" void ChoiceClassCB(FL_OBJECT *ob, long)
2780 if (textclasslist.Load(fl_get_choice(ob)-1)) {
2781 if (AskQuestion(_("Should I set some parameters to"),
2782 fl_get_choice_text(ob),
2783 _("the defaults of this document class?"))) {
2784 BufferParams params = BufferParams();
2785 params.textclass = fl_get_choice(ob)-1;
2786 params.useClassDefaults();
2787 UpdateLayoutDocument(¶ms);
2788 UpdateDocumentButtons(params);
2791 // unable to load new style
2792 WriteAlert(_("Conversion Errors!"),
2793 _("Unable to switch to new document class."),
2794 _("Reverting to original document class."));
2795 fl_set_choice(fd_form_document->choice_class,
2796 GetCurrentTextClass() + 1);
2802 extern "C" void DocumentDefskipCB(FL_OBJECT *obj, long)
2804 // "Synchronize" the choice and the input field, so that it
2805 // is impossible to commit senseless data.
2806 const FD_form_document* fd = fd_form_document;
2808 if (obj == fd->choice_default_skip) {
2809 if (fl_get_choice (fd->choice_default_skip) != 4) {
2810 fl_set_input (fd->input_default_skip, "");
2811 ActivateDocumentButtons();
2813 } else if (obj == fd->input_default_skip) {
2815 const char* input = fl_get_input (fd->input_default_skip);
2818 fl_set_choice (fd->choice_default_skip, 2);
2819 ActivateDocumentButtons();
2820 } else if (isValidGlueLength (input)) {
2821 fl_set_choice (fd->choice_default_skip, 4);
2822 ActivateDocumentButtons();
2824 fl_set_choice (fd->choice_default_skip, 4);
2825 DeactivateDocumentButtons();
2831 extern "C" void DocumentSpacingCB(FL_OBJECT *obj, long)
2833 // "Synchronize" the choice and the input field, so that it
2834 // is impossible to commit senseless data.
2835 const FD_form_document* fd = fd_form_document;
2837 if (obj == fd->choice_spacing
2838 && fl_get_choice (fd->choice_spacing) != 4) {
2839 fl_set_input(fd->input_spacing, "");
2840 } else if (obj == fd->input_spacing) {
2842 const char* input = fl_get_input (fd->input_spacing);
2845 fl_set_choice (fd->choice_spacing, 1);
2847 fl_set_choice (fd->choice_spacing, 4);
2853 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2856 BufferParams *params = &(current_view->buffer()->params);
2857 current_view->buffer()->params.language =
2858 combo_language->getline();
2860 // If default skip is a "Length" but there's no text in the
2861 // input field, reset the kind to "Medskip", which is the default.
2862 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2863 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2864 fl_set_choice (fd_form_document->choice_default_skip, 2);
2867 /* this shouldn't be done automatically IMO. For example I write german
2868 * documents with an american keyboard very often. Matthias */
2870 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2871 fl_get_choice(fd_form_document->choice_language)); */
2873 fl_get_choice_text(fd_form_document->choice_fonts);
2875 fl_get_choice_text(fd_form_document->choice_inputenc);
2877 fl_get_choice_text(fd_form_document->choice_fontsize);
2879 fl_get_choice_text(fd_form_document->choice_pagestyle);
2880 params->graphicsDriver =
2881 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2882 params->use_amsmath =
2883 fl_get_button(fd_form_document->check_use_amsmath);
2885 if (!current_view->available())
2888 LyXTextClassList::ClassList::size_type new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2889 if (params->textclass != new_class) {
2890 // try to load new_class
2891 if (textclasslist.Load(new_class)) {
2892 // successfully loaded
2894 minibuffer->Set(_("Converting document to new document class..."));
2895 int ret = current_view->buffer()->
2897 SwitchLayoutsBetweenClasses(current_view->buffer()->
2900 current_view->buffer()->
2906 s = _("One paragraph couldn't be converted");
2909 s += _(" paragraphs couldn't be converted");
2911 WriteAlert(_("Conversion Errors!"), s,
2912 _("into chosen document class"));
2915 params->textclass = new_class;
2917 // problem changing class -- warn user and retain old style
2918 WriteAlert(_("Conversion Errors!"),
2919 _("Unable to switch to new document class."),
2920 _("Reverting to original document class."));
2921 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2925 char tmpsep = params->paragraph_separation;
2926 if (fl_get_button(fd_form_document->radio_indent))
2927 params->paragraph_separation = BufferParams::PARSEP_INDENT;
2929 params->paragraph_separation = BufferParams::PARSEP_SKIP;
2930 if (tmpsep != params->paragraph_separation)
2933 VSpace tmpdefskip = params->getDefSkip();
2934 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2935 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2936 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2937 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2938 case 4: params->setDefSkip(
2939 VSpace (LyXGlueLength (fl_get_input
2940 (fd_form_document->input_default_skip))));
2942 // DocumentDefskipCB assures that this never happens
2943 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2945 if (!(tmpdefskip == params->getDefSkip()))
2948 if (fl_get_button(fd_form_document->radio_columns_two))
2949 params->columns = 2;
2951 params->columns = 1;
2952 if (fl_get_button(fd_form_document->radio_sides_two))
2953 params->sides = LyXTextClass::TwoSides;
2955 params->sides = LyXTextClass::OneSide;
2957 Spacing tmpSpacing = params->spacing;
2958 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2960 lyxerr.debug() << "Spacing: SINGLE" << endl;
2961 params->spacing.set(Spacing::Single);
2964 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2965 params->spacing.set(Spacing::Onehalf);
2968 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2969 params->spacing.set(Spacing::Double);
2972 lyxerr.debug() << "Spacing: OTHER" << endl;
2973 params->spacing.set(Spacing::Other,
2974 fl_get_input(fd_form_document->input_spacing));
2977 if (tmpSpacing != params->spacing)
2980 signed char tmpchar =
2981 static_cast<signed char>(fl_get_counter_value(fd_form_document->slider_secnumdepth));
2982 if (params->secnumdepth != tmpchar)
2984 params->secnumdepth = tmpchar;
2987 static_cast<int>(fl_get_counter_value(fd_form_document->slider_tocdepth));
2989 params->float_placement =
2990 fl_get_input(fd_form_document->input_float_placement);
2992 // More checking should be done to ensure the string doesn't have
2993 // spaces or illegal placement characters in it. (thornley)
2996 current_view->redoCurrentBuffer();
2998 minibuffer->Set(_("Document layout set"));
2999 current_view->buffer()->markDirty();
3002 fl_get_input(fd_form_document->input_extra);
3007 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
3009 fl_hide_form(fd_form_document->form_document);
3013 extern "C" void DocumentOKCB(FL_OBJECT *ob, long data)
3015 DocumentCancelCB(ob, data);
3016 DocumentApplyCB(ob, data);
3020 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
3023 // bullet callbacks etc. in bullet_panel.C -- ARRae
3029 if (!current_view->getScreen())
3032 current_view->getScreen()->HideCursor();
3034 current_view->buffer()->update(-2);
3037 if (!current_view->buffer()->text->GotoNextNote()) {
3038 if (current_view->buffer()->text->cursor.pos
3039 || current_view->buffer()->text->cursor.par !=
3040 current_view->buffer()->text->FirstParagraph())
3042 tmp = current_view->buffer()->text->cursor;
3043 current_view->buffer()->text->cursor.par =
3044 current_view->buffer()->text->FirstParagraph();
3045 current_view->buffer()->text->cursor.pos = 0;
3046 if (!current_view->buffer()->text->GotoNextNote()) {
3047 current_view->buffer()->text->cursor = tmp;
3048 minibuffer->Set(_("No more notes"));
3052 minibuffer->Set(_("No more notes"));
3056 current_view->buffer()->update(0);
3057 current_view->buffer()->text->sel_cursor =
3058 current_view->buffer()->text->cursor;
3062 void InsertCorrectQuote()
3064 Buffer * cbuffer = current_view->buffer();
3067 if (cbuffer->text->cursor.pos )
3068 c = cbuffer->text->cursor.par->GetChar(cbuffer->text->cursor.pos - 1);
3072 cbuffer->insertInset(new InsetQuotes(c, cbuffer->params));
3076 /* callbacks for form form_quotes */
3078 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
3080 if (!current_view->available())
3083 minibuffer->Set(_("Quotes type set"));
3084 //current_view->buffer()->params.quotes_language =
3085 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3086 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3087 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3089 lga = InsetQuotes::EnglishQ;
3092 lga = InsetQuotes::SwedishQ;
3095 lga = InsetQuotes::GermanQ;
3098 lga = InsetQuotes::PolishQ;
3101 lga = InsetQuotes::FrenchQ;
3104 lga = InsetQuotes::DanishQ;
3107 current_view->buffer()->params.quotes_language = lga;
3108 if (fl_get_button(fd_form_quotes->radio_single))
3109 current_view->buffer()->
3110 params.quotes_times = InsetQuotes::SingleQ;
3112 current_view->buffer()->
3113 params.quotes_times = InsetQuotes::DoubleQ;
3117 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
3119 fl_hide_form(fd_form_quotes->form_quotes);
3123 extern "C" void QuotesOKCB(FL_OBJECT *ob, long data)
3125 QuotesApplyCB(ob, data);
3126 QuotesCancelCB(ob, data);
3131 /* callbacks for form form_preamble */
3133 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
3135 fl_hide_form(fd_form_preamble->form_preamble);
3139 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
3141 if (!current_view->available())
3144 current_view->buffer()->params.preamble =
3145 fl_get_input(fd_form_preamble->input_preamble);
3146 current_view->buffer()->markDirty();
3147 minibuffer->Set(_("LaTeX preamble set"));
3151 extern "C" void PreambleOKCB(FL_OBJECT *ob, long data)
3153 PreambleApplyCB(ob, data);
3154 PreambleCancelCB(ob, data);
3158 /* callbacks for form form_table */
3160 extern "C" void TableApplyCB(FL_OBJECT *, long)
3163 if (!current_view->getScreen())
3166 // check for tables in tables
3167 if (current_view->buffer()->text->cursor.par->table){
3168 WriteAlert(_("Impossible Operation!"),
3169 _("Cannot insert table in table."),
3174 minibuffer->Set(_("Inserting table..."));
3176 ysize = (int)(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3177 xsize = (int)(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3180 current_view->getScreen()->HideCursor();
3182 current_view->buffer()->update(-2);
3184 current_view->buffer()->text->SetCursorParUndo();
3185 current_view->buffer()->text->FreezeUndo();
3187 current_view->buffer()->text->BreakParagraph();
3188 current_view->buffer()->update(-1);
3190 if (current_view->buffer()->text->cursor.par->Last()) {
3191 current_view->buffer()->text->CursorLeft();
3193 current_view->buffer()->text->BreakParagraph();
3194 current_view->buffer()->update(-1);
3197 current_view->buffer()->text->current_font.setLatex(LyXFont::OFF);
3198 //if (!fl_get_button(fd_form_table->check_latex)){
3199 // insert the new wysiwy table
3200 current_view->buffer()->text->SetLayout(0); // standard layout
3201 if (current_view->buffer()->text->cursor.par->footnoteflag ==
3202 LyXParagraph::NO_FOOTNOTE) {
3203 current_view->buffer()->
3204 text->SetParagraph(0, 0,
3206 VSpace (0.3 * current_view->buffer()->
3207 params.spacing.getValue(),
3209 VSpace (0.3 * current_view->buffer()->
3210 params.spacing.getValue(),
3217 current_view->buffer()->text->SetParagraph(0, 0,
3219 VSpace(VSpace::NONE),
3220 VSpace(VSpace::NONE),
3225 current_view->buffer()->text->cursor.par->table = new LyXTable(xsize, ysize);
3227 for (i = 0; i<xsize * ysize - 1; i++)
3228 current_view->buffer()->text->cursor.par->InsertChar(0, LyXParagraph::META_NEWLINE);
3229 current_view->buffer()->text->RedoParagraph();
3231 current_view->buffer()->text->UnFreezeUndo();
3233 current_view->buffer()->update(1);
3234 minibuffer->Set(_("Table inserted"));
3238 extern "C" void TableCancelCB(FL_OBJECT *, long)
3240 fl_hide_form(fd_form_table->form_table);
3244 extern "C" void TableOKCB(FL_OBJECT *ob, long data)
3246 TableApplyCB(ob, data);
3247 TableCancelCB(ob, data);
3251 /* callbacks for form form_print */
3253 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3255 fl_hide_form(fd_form_print->form_print);
3258 static bool stringOnlyContains (string const & LStr, char const * cset)
3260 char const * cstr = LStr.c_str() ;
3262 return strspn(cstr, cset) == strlen(cstr) ;
3265 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3267 if (!current_view->available())
3269 Buffer *buffer = current_view->buffer();
3270 string path = OnlyPath(buffer->getFileName());
3273 if (fl_get_button(fd_form_print->radio_even_pages))
3274 pageflag = lyxrc->print_evenpage_flag + ' ';
3275 else if (fl_get_button(fd_form_print->radio_odd_pages))
3276 pageflag = lyxrc->print_oddpage_flag + ' ';
3278 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3279 // User may give a page (range) list
3280 // User may print multiple (unsorted) copies
3281 string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
3282 pages = subst(pages, '+',',');
3283 pages = frontStrip(strip(pages)) ;
3284 while (!pages.empty()) { // a page range was given
3286 pages = split (pages, piece, ',') ;
3287 piece = strip(piece) ;
3288 piece = frontStrip(piece) ;
3289 if ( !stringOnlyContains (piece, "0123456789-") ) {
3290 WriteAlert(_("ERROR! Unable to print!"),
3291 _("Check 'range of pages'!"));
3294 if (piece.find('-') == string::npos) { // not found
3295 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3296 } else if (suffixIs(piece, "-") ) { // missing last page
3297 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3298 } else if (prefixIs(piece, "-") ) { // missing first page
3299 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3301 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3305 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3306 if (!copies.empty()) { // a number of copies was given
3307 if ( !stringOnlyContains (copies, "0123456789") ) {
3308 WriteAlert(_("ERROR! Unable to print!"),
3309 _("Check 'number of copies'!"));
3312 if (fl_get_button(fd_form_print->do_unsorted))
3313 pageflag += lyxrc->print_copies_flag;
3315 pageflag += lyxrc->print_collcopies_flag;
3316 pageflag += " " + copies + ' ' ;
3320 if (fl_get_button(fd_form_print->radio_order_reverse))
3321 reverseflag = lyxrc->print_reverse_flag + ' ';
3323 string orientationflag;
3324 if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
3325 orientationflag = lyxrc->print_landscape_flag + ' ';
3327 string ps_file = SpaceLess(fl_get_input(fd_form_print->input_file));
3328 string printer = strip(fl_get_input(fd_form_print->input_printer));
3331 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3332 && ! printer.empty()) // a printer name has been given
3333 printerflag = lyxrc->print_to_printer + printer + ' ';
3336 if (!lyxrc->print_extra_options.empty())
3337 extraflags = lyxrc->print_extra_options + ' ';
3339 string command = lyxrc->print_command + ' '
3340 + printerflag + pageflag + reverseflag
3341 + orientationflag + extraflags;
3343 char real_papersize = buffer->params.papersize;
3344 if (real_papersize == BufferParams::PAPER_DEFAULT)
3345 real_papersize = lyxrc->default_papersize;
3349 switch (real_papersize) {
3350 case BufferParams::PAPER_USLETTER:
3353 case BufferParams::PAPER_A3PAPER:
3356 case BufferParams::PAPER_A4PAPER:
3359 case BufferParams::PAPER_A5PAPER:
3362 case BufferParams::PAPER_B5PAPER:
3365 case BufferParams::PAPER_EXECUTIVEPAPER:
3368 case BufferParams::PAPER_LEGALPAPER:
3371 default: /* If nothing else fits, keep an empty value... */
3375 if (buffer->params.use_geometry
3376 && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
3377 && !lyxrc->print_paper_dimension_flag.empty()
3378 && !buffer->params.paperwidth.empty()
3379 && !buffer->params.paperheight.empty()) {
3380 // using a custom papersize
3382 command += lyxrc->print_paper_dimension_flag + ' ';
3383 command += buffer->params.paperwidth + ',';
3384 command += buffer->params.paperheight + ' ';
3385 } else if (!lyxrc->print_paper_flag.empty()
3387 && (real_papersize != BufferParams::PAPER_USLETTER ||
3388 buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
3389 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3391 if (fl_get_button(fd_form_print->radio_file))
3392 command += lyxrc->print_to_file + '\"'
3393 + MakeAbsPath(ps_file, path)
3395 else if (!lyxrc->print_spool_command.empty())
3396 command += lyxrc->print_to_file
3397 + '\"' + ps_file + '\"';
3399 // push directorypath, if necessary
3400 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3401 path = buffer->tmppath;
3406 if (!lyxrc->print_spool_command.empty() &&
3407 !fl_get_button(fd_form_print->radio_file)) {
3408 string command2 = lyxrc->print_spool_command + ' ';
3409 if (!printer.empty())
3410 command2 += lyxrc->print_spool_printerprefix
3412 // First run dvips and, if succesful, then spool command
3413 if ((result = RunScript(buffer, true, command))) {
3414 result = RunScript(buffer, false, command2, ps_file);
3417 result = RunScript(buffer, false, command);
3420 WriteAlert(_("Error:"),
3421 _("Unable to print"),
3422 _("Check that your parameters are correct"));
3426 extern "C" void PrintOKCB(FL_OBJECT *ob, long data)
3428 PrintCancelCB(ob, data);
3429 PrintApplyCB(ob, data);
3433 /* callbacks for form form_figure */
3435 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3437 if (!current_view->available())
3440 Buffer * buffer = current_view->buffer();
3441 if(buffer->isReadonly()) // paranoia
3444 minibuffer->Set(_("Inserting figure..."));
3445 if (fl_get_button(fd_form_figure->radio_inline)
3446 || buffer->text->cursor.par->table) {
3447 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3448 buffer->insertInset(new_inset);
3449 minibuffer->Set(_("Figure inserted"));
3450 new_inset->Edit(0, 0);
3454 current_view->getScreen()->HideCursor();
3458 buffer->text->SetCursorParUndo();
3459 buffer->text->FreezeUndo();
3461 buffer->text->BreakParagraph();
3464 if (buffer->text->cursor.par->Last()) {
3465 buffer->text->CursorLeft();
3467 buffer->text->BreakParagraph();
3471 // The standard layout should always be numer 0;
3472 buffer->text->SetLayout(0);
3474 if (buffer->text->cursor.par->footnoteflag ==
3475 LyXParagraph::NO_FOOTNOTE) {
3476 buffer->text->SetParagraph(0, 0,
3478 VSpace (0.3 * buffer->params.spacing.getValue(),
3481 buffer->params.spacing.getValue(),
3483 LYX_ALIGN_CENTER, string(), 0);
3485 buffer->text->SetParagraph(0, 0,
3487 VSpace(VSpace::NONE),
3488 VSpace(VSpace::NONE),
3495 Inset * new_inset = new InsetFig(100, 100, buffer);
3496 buffer->insertInset(new_inset);
3497 new_inset->Edit(0, 0);
3499 minibuffer->Set(_("Figure inserted"));
3500 buffer->text->UnFreezeUndo();
3504 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3506 fl_hide_form(fd_form_figure->form_figure);
3510 extern "C" void FigureOKCB(FL_OBJECT *ob, long data)
3512 FigureApplyCB(ob, data);
3513 FigureCancelCB(ob, data);
3516 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3518 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3519 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3520 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3521 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3522 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3523 fontloader.update();
3525 // All buffers will need resize
3526 bufferlist.resize();
3528 minibuffer->Set(_("Screen options set"));
3532 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3534 fl_hide_form(fd_form_screen->form_screen);
3538 extern "C" void ScreenOKCB(FL_OBJECT *ob, long data)
3540 ScreenCancelCB(ob, data);
3541 ScreenApplyCB(ob, data);
3547 if (!current_view->available())
3550 fl_set_button(fd_latex_options->accents,
3551 (int)current_view->buffer()->params.allowAccents);
3553 if (fd_latex_options->LaTeXOptions->visible) {
3554 fl_raise_form(fd_latex_options->LaTeXOptions);
3556 fl_show_form(fd_latex_options->LaTeXOptions,
3557 FL_PLACE_MOUSE, FL_FULLBORDER,
3558 _("LaTeX Options"));
3563 // This function runs "configure" and then rereads lyx.defaults to
3564 // reconfigure the automatic settings.
3567 minibuffer->Set(_("Running configure..."));
3569 // Run configure in user lyx directory
3570 Path p(user_lyxdir);
3571 Systemcalls one(Systemcalls::System,
3572 AddName(system_lyxdir, "configure"));
3574 minibuffer->Set(_("Reloading configuration..."));
3575 lyxrc->Read(LibFileSearch(string(), "lyxrc.defaults"));
3576 WriteAlert(_("The system has been reconfigured."),
3577 _("You need to restart LyX to make use of any"),
3578 _("updated document class specifications."));
3582 /* these functions are for the spellchecker */
3583 char* NextWord(float &value)
3585 if (!current_view->available()){
3590 char* string = current_view->buffer()->text->SelectNextWord(value);
3596 void SelectLastWord()
3598 if (!current_view->available())
3601 current_view->getScreen()->HideCursor();
3603 current_view->buffer()->text->SelectSelectedWord();
3604 current_view->getScreen()->ToggleSelection(false);
3605 current_view->buffer()->update(0);
3609 void EndOfSpellCheck()
3611 if (!current_view->available())
3614 current_view->getScreen()->HideCursor();
3616 current_view->buffer()->text->SelectSelectedWord();
3617 current_view->buffer()->text->ClearSelection();
3618 current_view->buffer()->update(0);
3622 void ReplaceWord(string const & replacestring)
3624 if (!current_view->getScreen())
3627 current_view->getScreen()->HideCursor();
3628 current_view->buffer()->update(-2);
3630 /* clear the selection (if there is any) */
3631 current_view->getScreen()->ToggleSelection(false);
3632 current_view->buffer()->text->
3633 ReplaceSelectionWithString(replacestring.c_str());
3635 current_view->buffer()->text->SetSelectionOverString(replacestring.c_str());
3637 // Go back so that replacement string is also spellchecked
3638 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3639 current_view->buffer()->text->CursorLeftIntern();
3641 current_view->buffer()->update(1);
3643 // End of spellchecker stuff
3648 // Table of Contents
3658 static TocList* toclist = 0;
3661 extern "C" void TocSelectCB(FL_OBJECT *ob, long)
3663 if (!current_view->available())
3666 TocList* tmptoclist = toclist;
3667 int i = fl_get_browser(ob);
3670 for (a = 1; a<i && tmptoclist->next; a++){
3671 tmptoclist = tmptoclist->next;
3678 LyXParagraph *par = current_view->buffer()->paragraph;
3679 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3680 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3681 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3682 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3683 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3684 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3685 par->appendix != tmptoclist->appendix)) {
3686 par = par->LastPhysicalPar()->Next();
3691 current_view->buffer()->text->SetCursor(par, 0);
3692 current_view->buffer()->text->sel_cursor =
3693 current_view->buffer()->text->cursor;
3694 current_view->buffer()->update(0);
3697 WriteAlert(_("Error"),
3698 _("Couldn't find this label"),
3699 _("in current document."));
3705 extern "C" void TocCancelCB(FL_OBJECT *, long)
3707 fl_hide_form(fd_form_toc->form_toc);
3711 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3713 static LyXParagraph * stapar = 0;
3714 TocList * tmptoclist = 0;
3716 /* deleted the toclist */
3719 tmptoclist = toclist->next;
3721 toclist = tmptoclist;
3725 tmptoclist = toclist;
3728 fl_clear_browser(fd_form_toc->browser_toc);
3729 if (!current_view->available()) {
3730 fl_add_browser_line(fd_form_toc->browser_toc, _("*** No Document ***"));
3733 fl_hide_object(fd_form_toc->browser_toc);
3734 /* get the table of contents */
3735 LyXParagraph * par = current_view->buffer()->paragraph;
3737 char * line = new char[200];
3743 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3747 labeltype = textclasslist.Style(current_view->buffer()->params.textclass,
3748 par->GetLayout()).labeltype;
3750 if (labeltype >= LABEL_COUNTER_CHAPTER
3751 && labeltype <= LABEL_COUNTER_CHAPTER +
3752 current_view->buffer()->params.tocdepth) {
3753 /* insert this into the table of contents */
3754 /* first indent a little bit */
3758 textclasslist.TextClass(current_view->buffer()->
3759 params.textclass).maxcounter()) * 4 + 2;
3763 // Then the labestring
3764 if (!par->labelstring.empty()) {
3765 string::size_type i = 0;
3766 while (pos < 199 && i < par->labelstring.length()) {
3767 line[pos] = par->labelstring[i];
3776 /* now the contents */
3777 LyXParagraph::size_type i = 0;
3778 while (pos < 199 && i < par->size()) {
3779 c = par->GetChar(i);
3780 if (isprint(c) || c >= 128) {
3787 fl_add_browser_line(fd_form_toc->browser_toc, line);
3789 /* make a toclist entry */
3791 tmptoclist = new TocList;
3792 toclist = tmptoclist;
3794 tmptoclist->next = new TocList;
3795 tmptoclist = tmptoclist->next;
3798 tmptoclist->next = 0;
3800 for (a = 0; a<6; a++){
3801 tmptoclist->counter[a] = par->GetFirstCounter(a);
3803 tmptoclist->appendix = par->appendix;
3805 par = par->LastPhysicalPar()->Next();
3809 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3810 fl_show_object(fd_form_toc->browser_toc);
3814 /* callbacks for form form_ref */
3815 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3817 if (!current_view->available())
3821 fl_get_browser_line(fd_form_ref->browser_ref,
3822 fl_get_browser(fd_form_ref->browser_ref));
3823 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3829 current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3839 if(current_view->buffer()->isSGML())
3840 t += "[" + u + "]" + "{" + s + "}";
3845 new InsetRef(t, current_view->buffer());
3846 current_view->buffer()->insertInset(new_inset);
3850 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3852 if (!current_view->available()) {
3853 fl_clear_browser(fd_form_ref->browser_ref);
3857 FL_OBJECT * brow = fd_form_ref->browser_ref;
3859 // Get the current line, in order to restore it later
3860 char const * const btmp = fl_get_browser_line(brow,
3861 fl_get_browser(brow));
3862 string currentstr = btmp ? btmp : "";
3863 //string currentstr = fl_get_browser_line(brow,
3864 // fl_get_browser(brow));
3866 fl_clear_browser(brow);
3868 string refs = current_view->buffer()->getReferenceList('\n');
3871 #if FL_REVISION > 85
3872 fl_addto_browser_chars(brow, refs.c_str());
3873 int total_lines = fl_get_browser_maxline(brow);
3874 for (int i = 1; i <= total_lines ; i++) {
3875 if (fl_get_browser_line(brow, i) == currentstr) {
3880 fl_set_browser_topline(brow, topline);
3882 // Keep the old ugly code for xforms 0.81 compatibility
3887 curr_ref = refs.token('\n', ref_num);
3888 if (curr_ref.empty())
3890 fl_add_browser_line(brow, curr_ref.c_str());
3895 if (!fl_get_browser_maxline(brow)) {
3896 fl_add_browser_line(brow,
3897 _("*** No labels found in document ***"));
3898 fl_deactivate_object(brow);
3900 fl_select_browser_line(brow, topline);
3901 fl_activate_object(brow);
3903 if (current_view->buffer()->isReadonly()) {
3904 // would be better to de/activate insert buttons
3905 // but that's more work... besides this works. ARRae
3906 fl_hide_form(fd_form_ref->form_ref);
3908 if (!current_view->buffer()->isSGML()) {
3909 fl_deactivate_object(fd_form_ref->ref_name);
3910 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3913 fl_activate_object(fd_form_ref->ref_name);
3914 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3919 extern "C" void RefHideCB(FL_OBJECT *, long)
3921 fl_hide_form(fd_form_ref->form_ref);
3925 void UpdateInset(Inset* inset, bool mark_dirty)
3930 /* very first check for locking insets*/
3931 if (current_view->buffer()->the_locking_inset == inset){
3932 if (current_view->buffer()->text->UpdateInset(inset)){
3933 current_view->update();
3935 if (current_view->buffer()->isLyxClean())
3936 minibuffer->setTimer(4);
3937 current_view->buffer()->markDirty();
3939 current_view->updateScrollbar();
3944 /* first check the current buffer */
3945 if (current_view->available()){
3946 current_view->getScreen()->HideCursor();
3947 current_view->buffer()->update(-3);
3948 if (current_view->buffer()->text->UpdateInset(inset)){
3950 current_view->buffer()->update(1);
3952 current_view->buffer()->update(3);
3957 // check all buffers
3958 bufferlist.updateInset(inset, mark_dirty);
3963 /* these functions return 1 if an error occured,
3965 int LockInset(UpdatableInset* inset)
3967 if (!current_view->buffer()->the_locking_inset && inset){
3968 current_view->buffer()->the_locking_inset = inset;
3975 void ShowLockedInsetCursor(long x, long y, int asc, int desc)
3977 if (current_view->buffer()->the_locking_inset &&
3978 current_view->getScreen()){
3979 y += current_view->buffer()->text->cursor.y;
3980 current_view->getScreen()->ShowManualCursor(x, y,
3986 void HideLockedInsetCursor(long x, long y, int asc, int desc)
3988 if (current_view->buffer()->the_locking_inset &&
3989 current_view->getScreen()){
3990 y += current_view->buffer()->text->cursor.y;
3991 current_view->getScreen()->HideManualCursor(x, y,
3997 void FitLockedInsetCursor(long x, long y, int asc, int desc)
3999 if (current_view->buffer()->the_locking_inset &&
4000 current_view->getScreen()){
4001 y += current_view->buffer()->text->cursor.y;
4002 if (current_view->getScreen()->FitManualCursor(x, y, asc, desc))
4003 current_view->updateScrollbar();
4008 int UnlockInset(UpdatableInset * inset)
4011 current_view->buffer()->the_locking_inset == inset){
4012 inset->InsetUnlock();
4013 current_view->buffer()->the_locking_inset = 0;
4014 current_view->buffer()->text->FinishUndo();
4017 return bufferlist.unlockInset(inset);
4021 void LockedInsetStoreUndo(Undo::undo_kind kind)
4023 if (!current_view->buffer()->the_locking_inset)
4024 return; // shouldn't happen
4025 if (kind == Undo::EDIT) // in this case insets would not be stored!
4026 kind = Undo::FINISH;
4027 current_view->buffer()->text->SetUndo(kind,
4028 current_view->buffer()->text->cursor.par->
4029 ParFromPos(current_view->buffer()->text->cursor.pos)->previous,
4030 current_view->buffer()->text->cursor.par->
4031 ParFromPos(current_view->buffer()->text->cursor.pos)->next);
4035 void PutInsetIntoInsetUpdateList(Inset * inset)
4038 InsetUpdateStruct * tmp = new InsetUpdateStruct();
4040 tmp->next = InsetUpdateList;
4041 InsetUpdateList = tmp;
4046 void UpdateInsetUpdateList()
4048 InsetUpdateStruct * tmp = InsetUpdateList;
4050 UpdateInset(tmp->inset, false); // "false" because no document change
4054 // delete the update list
4055 while (InsetUpdateList) {
4056 tmp = InsetUpdateList;
4057 InsetUpdateList = InsetUpdateList->next;
4060 InsetUpdateList = 0;
4063 #ifdef WITH_WARNINGS
4066 // I know we shouldn't put anything in here but this seems the fastest
4067 // way to do this (and the cleanest for now). This function just inserts
4068 // a newline in the string and the inserts 'depth'-spaces so that the
4069 // code is indented in the right way!!!
4070 void addNewlineAndDepth(string & file, int const depth)
4073 file.append(depth, ' ');