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