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->currentBuffer()->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->currentBuffer()->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->currentBuffer()->update(f);
309 current_view->fitCursor();
310 current_view->updateScrollbar();
312 if (!current_view->currentBuffer()->text->selection)
313 current_view->currentBuffer()->text->sel_cursor =
314 current_view->currentBuffer()->text->cursor;
317 if (current_view->currentBuffer()->isLyxClean()) {
318 current_view->currentBuffer()->markDirty();
319 minibuffer->setTimer(4);
322 current_view->currentBuffer()->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->currentBuffer()->isBakClean()
991 || current_view->currentBuffer()->isReadonly()) {
992 // We don't save now, but we'll try again later
993 current_view->getOwner()->resetAutosaveTimer();
997 minibuffer->Set(_("Autosaving current document..."));
999 // create autosave filename
1000 string fname = OnlyPath(current_view->currentBuffer()->getFileName());
1002 fname += OnlyFilename(current_view->currentBuffer()->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->currentBuffer()->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->currentBuffer()->writeFile(fname,
1035 // It is dangerous to do this in the child,
1036 // but safe in the parent, so...
1038 minibuffer->Set(_("Autosave Failed!"));
1041 if (pid == 0) { // we are the child so...
1046 current_view->currentBuffer()->markBakClean();
1047 current_view->getOwner()->resetAutosaveTimer();
1052 // (c) CHT Software Service GmbH
1055 // create new file with template
1058 Buffer * NewLyxFile(string const & filename)
1060 // Split argument by :
1062 string tmpname = split(filename, name, ':');
1063 #ifdef __EMX__ // Fix me! lyx_cb.C may not be low level enough to allow this.
1064 if (name.length() == 1
1065 && isalpha(static_cast<unsigned char>(name[0]))
1066 && (prefixIs(tmpname, "/") || prefixIs(tmpname, "\\"))) {
1068 name += token(tmpname, ':', 0);
1069 tmpname = split(tmpname, ':');
1072 lyxerr.debug() << "Arg is " << filename
1073 << "\nName is " << name
1074 << "\nTemplate is " << tmpname << endl;
1076 // find a free buffer
1077 Buffer *tmpbuf = bufferlist.newFile(name,tmpname);
1079 lastfiles->newFile(tmpbuf->getFileName());
1084 // Insert ascii file (if filename is empty, prompt for one)
1085 void InsertAsciiFile(string const & f, bool asParagraph)
1088 LyXParagraph *tmppar;
1091 if (!current_view->getScreen()) return;
1093 if (fname.empty()) {
1095 fname = fileDlg.Select(_("File to Insert"),
1096 current_view->getOwner()->currentBuffer()->filepath,
1099 if (fname.empty()) return;
1103 FilePtr myfile(fname, FilePtr::read);
1105 if (!fi.exist() || !fi.readable() || !myfile()) {
1106 WriteFSAlert(_("Error! Cannot open specified file:"),
1107 MakeDisplayPath(fname,50));
1111 tmppar = new LyXParagraph;
1113 tmppar->text.reserve(500);
1115 tmppar->readSimpleWholeFile(myfile);
1117 // set the end of the string
1119 // I don't think this is needed. Actually it might be plain wrong.
1120 tmppar->InsertChar(tmppar->text.size() - 1,'\0');
1122 tmppar->InsertChar(tmppar->last-1,'\0');
1124 // insert the string
1125 current_view->getScreen()->HideCursor();
1127 // clear the selection
1130 current_view->currentBuffer()->text->InsertStringA(tmppar->text);
1132 current_view->currentBuffer()->text->InsertStringB(tmppar->text);
1134 current_view->currentBuffer()->update(1);
1138 void MenuShowTableOfContents()
1140 static int ow = -1, oh;
1143 if (fd_form_toc->form_toc->visible) {
1144 fl_raise_form(fd_form_toc->form_toc);
1146 fl_show_form(fd_form_toc->form_toc,
1147 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1148 _("Table Of Contents"));
1150 ow = fd_form_toc->form_toc->w;
1151 oh = fd_form_toc->form_toc->h;
1153 fl_set_form_minsize(fd_form_toc->form_toc,ow,oh);
1158 void MenuInsertLabel(const char *arg)
1162 //string label = fl_show_input(_("Enter new label to insert:"),"");
1164 label = frontStrip(strip(askForText(_("Enter new label to insert:"))));
1165 if (!label.empty()) {
1166 InsetLabel *new_inset = new InsetLabel;
1167 new_inset->setContents(label);
1168 current_view->currentBuffer()->insertInset(new_inset);
1174 void MenuInsertRef()
1176 static int ow = -1, oh;
1179 if (fd_form_ref->form_ref->visible) {
1180 fl_raise_form(fd_form_ref->form_ref);
1182 fl_show_form(fd_form_ref->form_ref,
1183 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1184 _("Insert Reference"));
1186 ow = fd_form_ref->form_ref->w;
1187 oh = fd_form_ref->form_ref->h;
1189 fl_set_form_minsize(fd_form_ref->form_ref,ow,oh);
1194 void MenuPasteSelection(char at)
1196 if (!current_view->getScreen())
1201 Atom data_prop = XInternAtom(fl_display,
1204 if (data_prop == None)
1206 XConvertSelection(fl_display,
1207 XA_PRIMARY, XA_STRING, data_prop,
1208 fd_form_main->form_main->window, 0);
1213 extern "C" void FootCB(FL_OBJECT*, long)
1215 if (!current_view->available())
1218 minibuffer->Set(_("Inserting Footnote..."));
1219 current_view->getScreen()->HideCursor();
1220 current_view->currentBuffer()->update(-2);
1221 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1222 current_view->currentBuffer()->update(1);
1226 void LayoutsCB(int sel, void *)
1228 string tmp = tostr(sel);
1229 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1235 * SGML Linuxdoc support:
1236 * (flag == -1) import SGML file
1237 * (flag == 0) make TeX output
1238 * (flag == 1) make dvi output
1240 int RunLinuxDoc(int flag, string const & filename)
1249 /* generate a path-less extension name */
1250 name = ChangeExtension (filename, ".sgml", true);
1251 path = OnlyPath (filename);
1252 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1253 path = current_view->currentBuffer()->tmppath;
1258 if (!current_view->available())
1260 current_view->currentBuffer()->makeLinuxDocFile(name,0);
1261 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1263 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1264 case PAPER_USLETTER: add_flags = "-p letter"; break;
1265 default: /* nothing to be done yet ;-) */ break;
1273 case -1: /* Import file */
1274 minibuffer->Set(_("Importing LinuxDoc SGML file `"),
1275 MakeDisplayPath(filename), "'...");
1276 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1278 if (one.startscript(Systemcalls::System, s2))
1281 case 0: /* TeX output asked */
1282 minibuffer->Set(_("Converting LinuxDoc SGML to TeX file..."));
1283 s2 = "sgml2latex " + add_flags + " -o tex "
1284 + lyxrc->sgml_extra_options + ' ' + name;
1285 if (one.startscript(Systemcalls::System, s2))
1288 case 1: /* dvi output asked */
1289 minibuffer->Set(_("Converting LinuxDoc SGML to dvi file..."));
1290 s2 = "sgml2latex " + add_flags + " -o dvi "
1291 + lyxrc->sgml_extra_options + ' ' + name;
1292 if (one.startscript(Systemcalls::System, s2)) {
1295 current_view->currentBuffer()->markDviClean();
1297 default: /* unknown output */
1303 current_view->currentBuffer()->redraw();
1309 * SGML DocBook support:
1310 * (flag == 1) make dvi output
1312 int RunDocBook(int flag, string const & filename)
1320 /* generate a path-less extension name */
1321 name = ChangeExtension (filename, ".sgml", true);
1322 path = OnlyPath (filename);
1323 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1324 path = current_view->currentBuffer()->tmppath;
1328 if (!current_view->available())
1331 current_view->currentBuffer()->makeDocBookFile(name,0);
1333 // Shall this code go or should it stay? (Lgb)
1334 // string add_flags;
1335 // LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1337 // case PAPER_A4PAPER: add_flags = "-p a4"; break;
1338 // case PAPER_USLETTER: add_flags = "-p letter"; break;
1339 // default: /* nothing to be done yet ;-) */ break;
1345 case 1: /* dvi output asked */
1346 minibuffer->Set(_("Converting DocBook SGML to dvi file..."));
1347 s2 = "sgmltools --backend dvi " + name;
1348 if (one.startscript(Systemcalls::System, s2)) {
1351 current_view->currentBuffer()->markDviClean();
1353 default: /* unknown output */
1359 current_view->currentBuffer()->redraw();
1364 void AllFloats(char flag, char figmar)
1366 if (!current_view->available())
1369 LyXCursor cursor = current_view->currentBuffer()->text->cursor;
1371 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1373 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1374 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1376 && cursor.par->footnotekind != LyXParagraph::FIG
1377 && cursor.par->footnotekind != LyXParagraph::TAB
1378 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1379 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1380 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1385 LyXCursor tmpcursor = cursor;
1386 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1387 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1389 LyXParagraph *par = current_view->currentBuffer()->paragraph;
1392 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1396 par->footnotekind != LyXParagraph::FOOTNOTE
1398 par->footnotekind != LyXParagraph::MARGIN
1403 par->footnotekind != LyXParagraph::FIG
1405 par->footnotekind != LyXParagraph::TAB
1407 par->footnotekind != LyXParagraph::WIDE_FIG
1409 par->footnotekind != LyXParagraph::WIDE_TAB
1411 par->footnotekind != LyXParagraph::ALGORITHM
1416 && par->previous->footnoteflag !=
1417 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1418 current_view->currentBuffer()->text->SetCursorIntern(par->previous,
1420 current_view->currentBuffer()->text->OpenFootnote();
1425 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1429 par->footnotekind != LyXParagraph::FOOTNOTE
1431 par->footnotekind != LyXParagraph::MARGIN
1436 par->footnotekind != LyXParagraph::FIG
1438 par->footnotekind != LyXParagraph::TAB
1440 par->footnotekind != LyXParagraph::WIDE_FIG
1442 par->footnotekind != LyXParagraph::WIDE_TAB
1444 par->footnotekind != LyXParagraph::ALGORITHM
1448 current_view->currentBuffer()->text->SetCursorIntern(par, 0);
1449 current_view->currentBuffer()->text->CloseFootnote();
1455 current_view->currentBuffer()->text->SetCursorIntern(cursor.par, cursor.pos);
1456 current_view->redraw();
1457 current_view->fitCursor();
1458 current_view->updateScrollbar();
1462 void MenuLayoutCharacter()
1464 static int ow = -1, oh;
1466 if (fd_form_character->form_character->visible) {
1467 fl_raise_form(fd_form_character->form_character);
1469 fl_show_form(fd_form_character->form_character,
1470 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
1471 _("Character Style"));
1473 ow = fd_form_character->form_character->w;
1474 oh = fd_form_character->form_character->h;
1476 fl_set_form_minsize(fd_form_character->form_character,ow,oh);
1481 inline void DeactivateParagraphButtons ()
1483 fl_deactivate_object (fd_form_paragraph->button_ok);
1484 fl_deactivate_object (fd_form_paragraph->button_apply);
1485 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1486 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1489 inline void ActivateParagraphButtons ()
1491 fl_activate_object (fd_form_paragraph->button_ok);
1492 fl_activate_object (fd_form_paragraph->button_apply);
1493 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1494 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1497 inline void DisableParagraphLayout ()
1499 DeactivateParagraphButtons();
1500 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1501 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1502 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1503 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1504 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1505 fl_deactivate_object (fd_form_paragraph->check_noindent);
1506 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1507 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1508 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1509 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1510 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1511 fl_deactivate_object (fd_form_paragraph->input_space_above);
1512 fl_deactivate_object (fd_form_paragraph->input_space_below);
1513 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1514 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1515 fl_deactivate_object (fd_form_paragraph->check_space_above);
1516 fl_deactivate_object (fd_form_paragraph->check_space_below);
1519 inline void EnableParagraphLayout ()
1521 ActivateParagraphButtons();
1522 fl_activate_object (fd_form_paragraph->input_labelwidth);
1523 fl_activate_object (fd_form_paragraph->check_lines_top);
1524 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1525 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1526 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1527 fl_activate_object (fd_form_paragraph->check_noindent);
1528 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1529 fl_activate_object (fd_form_paragraph->radio_align_right);
1530 fl_activate_object (fd_form_paragraph->radio_align_left);
1531 fl_activate_object (fd_form_paragraph->radio_align_block);
1532 fl_activate_object (fd_form_paragraph->radio_align_center);
1533 fl_activate_object (fd_form_paragraph->input_space_above);
1534 fl_activate_object (fd_form_paragraph->input_space_below);
1535 fl_activate_object (fd_form_paragraph->choice_space_above);
1536 fl_activate_object (fd_form_paragraph->choice_space_below);
1537 fl_activate_object (fd_form_paragraph->check_space_above);
1538 fl_activate_object (fd_form_paragraph->check_space_below);
1541 bool UpdateLayoutParagraph()
1543 if (!current_view->getScreen() || !current_view->available()) {
1544 if (fd_form_paragraph->form_paragraph->visible)
1545 fl_hide_form(fd_form_paragraph->form_paragraph);
1549 Buffer * buf = current_view->currentBuffer();
1551 fl_set_input(fd_form_paragraph->input_labelwidth,
1552 buf->text->cursor.par->GetLabelWidthString().c_str());
1553 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1554 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1555 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1556 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1558 int align = buf->text->cursor.par->GetAlign();
1559 if (align == LYX_ALIGN_LAYOUT)
1560 align = textclasslist.Style(buf->params.textclass,
1561 buf->text->cursor.par->GetLayout()).align;
1564 case LYX_ALIGN_RIGHT:
1565 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1567 case LYX_ALIGN_LEFT:
1568 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1570 case LYX_ALIGN_CENTER:
1571 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1574 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1578 fl_set_button(fd_form_paragraph->check_lines_top,
1579 buf->text->cursor.par->FirstPhysicalPar()->line_top);
1580 fl_set_button(fd_form_paragraph->check_lines_bottom,
1581 buf->text->cursor.par->FirstPhysicalPar()->line_bottom);
1582 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1583 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1584 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1585 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1586 fl_set_button(fd_form_paragraph->check_noindent,
1587 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1588 fl_set_input (fd_form_paragraph->input_space_above, "");
1590 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1592 fl_set_choice (fd_form_paragraph->choice_space_above,
1595 case VSpace::DEFSKIP:
1596 fl_set_choice (fd_form_paragraph->choice_space_above,
1599 case VSpace::SMALLSKIP:
1600 fl_set_choice (fd_form_paragraph->choice_space_above,
1603 case VSpace::MEDSKIP:
1604 fl_set_choice (fd_form_paragraph->choice_space_above,
1607 case VSpace::BIGSKIP:
1608 fl_set_choice (fd_form_paragraph->choice_space_above,
1612 fl_set_choice (fd_form_paragraph->choice_space_above,
1615 case VSpace::LENGTH:
1616 fl_set_choice (fd_form_paragraph->choice_space_above,
1618 fl_set_input (fd_form_paragraph->input_space_above,
1619 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1622 fl_set_button (fd_form_paragraph->check_space_above,
1623 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1624 fl_set_input (fd_form_paragraph->input_space_below, "");
1625 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1627 fl_set_choice (fd_form_paragraph->choice_space_below,
1630 case VSpace::DEFSKIP:
1631 fl_set_choice (fd_form_paragraph->choice_space_below,
1634 case VSpace::SMALLSKIP:
1635 fl_set_choice (fd_form_paragraph->choice_space_below,
1638 case VSpace::MEDSKIP:
1639 fl_set_choice (fd_form_paragraph->choice_space_below,
1642 case VSpace::BIGSKIP:
1643 fl_set_choice (fd_form_paragraph->choice_space_below,
1647 fl_set_choice (fd_form_paragraph->choice_space_below,
1650 case VSpace::LENGTH:
1651 fl_set_choice (fd_form_paragraph->choice_space_below,
1653 fl_set_input (fd_form_paragraph->input_space_below,
1654 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1657 fl_set_button (fd_form_paragraph->check_space_below,
1658 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1660 fl_set_button(fd_form_paragraph->check_noindent,
1661 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1663 if (current_view->currentBuffer()->isReadonly()) {
1664 DisableParagraphLayout();
1666 EnableParagraphLayout();
1671 void MenuLayoutParagraph()
1673 if (UpdateLayoutParagraph()) {
1674 if (fd_form_paragraph->form_paragraph->visible) {
1675 fl_raise_form(fd_form_paragraph->form_paragraph);
1677 fl_show_form(fd_form_paragraph->form_paragraph,
1678 FL_PLACE_MOUSE, FL_FULLBORDER,
1679 _("Paragraph Environment"));
1686 void DeactivateDocumentButtons ()
1688 fl_deactivate_object (fd_form_document->button_ok);
1689 fl_deactivate_object (fd_form_document->button_apply);
1690 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1691 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1696 void ActivateDocumentButtons ()
1698 fl_activate_object (fd_form_document->button_ok);
1699 fl_activate_object (fd_form_document->button_apply);
1700 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1701 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1705 void DisableDocumentLayout ()
1707 DeactivateDocumentButtons ();
1708 fl_deactivate_object (fd_form_document->group_radio_separation);
1709 fl_deactivate_object (fd_form_document->radio_indent);
1710 fl_deactivate_object (fd_form_document->radio_skip);
1711 fl_deactivate_object (fd_form_document->choice_class);
1712 fl_deactivate_object (fd_form_document->choice_pagestyle);
1713 fl_deactivate_object (fd_form_document->choice_fonts);
1714 fl_deactivate_object (fd_form_document->choice_fontsize);
1715 fl_deactivate_object (fd_form_document->input_float_placement);
1716 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1717 fl_deactivate_object (fd_form_document->choice_inputenc);
1718 fl_deactivate_object (fd_form_document->group_radio_sides);
1719 fl_deactivate_object (fd_form_document->radio_sides_one);
1720 fl_deactivate_object (fd_form_document->radio_sides_two);
1721 fl_deactivate_object (fd_form_document->group_radio_columns);
1722 fl_deactivate_object (fd_form_document->radio_columns_one);
1723 fl_deactivate_object (fd_form_document->radio_columns_two);
1724 fl_deactivate_object (fd_form_document->input_extra);
1725 fl_deactivate_object (fd_form_document->choice_language);
1726 combo_language->deactivate();
1727 fl_deactivate_object (fd_form_document->input_default_skip);
1728 fl_deactivate_object (fd_form_document->choice_default_skip);
1729 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1730 fl_deactivate_object (fd_form_document->slider_tocdepth);
1731 fl_deactivate_object (fd_form_document->choice_spacing);
1732 fl_deactivate_object (fd_form_document->input_spacing);
1733 fl_deactivate_object (fd_form_document->check_use_amsmath);
1737 void EnableDocumentLayout ()
1739 ActivateDocumentButtons ();
1740 fl_activate_object (fd_form_document->group_radio_separation);
1741 fl_activate_object (fd_form_document->radio_indent);
1742 fl_activate_object (fd_form_document->radio_skip);
1743 fl_activate_object (fd_form_document->choice_class);
1744 fl_activate_object (fd_form_document->choice_pagestyle);
1745 fl_activate_object (fd_form_document->choice_fonts);
1746 fl_activate_object (fd_form_document->choice_fontsize);
1747 fl_activate_object (fd_form_document->input_float_placement);
1748 fl_activate_object (fd_form_document->choice_postscript_driver);
1749 fl_activate_object (fd_form_document->choice_inputenc);
1750 fl_activate_object (fd_form_document->group_radio_sides);
1751 fl_activate_object (fd_form_document->radio_sides_one);
1752 fl_activate_object (fd_form_document->radio_sides_two);
1753 fl_activate_object (fd_form_document->group_radio_columns);
1754 fl_activate_object (fd_form_document->radio_columns_one);
1755 fl_activate_object (fd_form_document->radio_columns_two);
1756 fl_activate_object (fd_form_document->input_extra);
1757 fl_activate_object (fd_form_document->choice_language);
1758 combo_language->activate();
1759 fl_activate_object (fd_form_document->input_default_skip);
1760 fl_activate_object (fd_form_document->choice_default_skip);
1761 fl_activate_object (fd_form_document->slider_secnumdepth);
1762 fl_activate_object (fd_form_document->slider_tocdepth);
1763 fl_activate_object (fd_form_document->choice_spacing);
1764 fl_activate_object (fd_form_document->input_spacing);
1765 fl_activate_object (fd_form_document->check_use_amsmath);
1768 bool UpdateLayoutDocument(BufferParams *params)
1770 if (!current_view->getScreen() || !current_view->available()) {
1771 if (fd_form_document->form_document->visible)
1772 fl_hide_form(fd_form_document->form_document);
1777 params = ¤t_view->currentBuffer()->params;
1778 LyXTextClass const & tclass = textclasslist.TextClass(params->textclass);
1780 fl_set_choice_text(fd_form_document->choice_class,
1781 textclasslist.DescOfClass(params->textclass).c_str());
1782 combo_language->select_text(params->language.c_str());
1784 fl_set_choice_text(fd_form_document->choice_fonts,
1785 params->fonts.c_str());
1786 fl_set_choice_text(fd_form_document->choice_inputenc,
1787 params->inputenc.c_str());
1788 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1789 params->graphicsDriver.c_str());
1791 // ale970405+lasgoutt970513
1792 fl_clear_choice(fd_form_document->choice_fontsize);
1793 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1794 fl_addto_choice(fd_form_document->choice_fontsize,
1795 tclass.opt_fontsize().c_str());
1796 fl_set_choice(fd_form_document->choice_fontsize,
1797 tokenPos(tclass.opt_fontsize(), '|', params->fontsize) + 2);
1799 // ale970405+lasgoutt970513
1800 fl_clear_choice(fd_form_document->choice_pagestyle);
1801 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1802 fl_addto_choice(fd_form_document->choice_pagestyle,
1803 tclass.opt_pagestyle().c_str());
1805 fl_set_choice(fd_form_document->choice_pagestyle,
1806 tokenPos(tclass.opt_pagestyle(), '|', params->pagestyle) + 2);
1808 fl_set_button(fd_form_document->radio_indent, 0);
1809 fl_set_button(fd_form_document->radio_skip, 0);
1812 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1814 if (params->paragraph_separation == LYX_PARSEP_INDENT)
1815 fl_set_button(fd_form_document->radio_indent, 1);
1817 fl_set_button(fd_form_document->radio_skip, 1);
1819 switch (params->getDefSkip().kind()) {
1820 case VSpace::SMALLSKIP:
1821 fl_set_choice (fd_form_document->choice_default_skip, 1);
1823 case VSpace::MEDSKIP:
1824 fl_set_choice (fd_form_document->choice_default_skip, 2);
1826 case VSpace::BIGSKIP:
1827 fl_set_choice (fd_form_document->choice_default_skip, 3);
1829 case VSpace::LENGTH:
1830 fl_set_choice (fd_form_document->choice_default_skip, 4);
1831 fl_set_input (fd_form_document->input_default_skip,
1832 params->getDefSkip().asLyXCommand().c_str());
1835 fl_set_choice (fd_form_document->choice_default_skip, 2);
1839 fl_set_button(fd_form_document->radio_sides_one, 0);
1840 fl_set_button(fd_form_document->radio_sides_two, 0);
1842 if (params->sides == 2)
1843 fl_set_button(fd_form_document->radio_sides_two, 1);
1845 fl_set_button(fd_form_document->radio_sides_one, 1);
1847 fl_set_button(fd_form_document->radio_columns_one, 0);
1848 fl_set_button(fd_form_document->radio_columns_two, 0);
1850 if (params->columns == 2)
1851 fl_set_button(fd_form_document->radio_columns_two, 1);
1853 fl_set_button(fd_form_document->radio_columns_one, 1);
1855 fl_set_input(fd_form_document->input_spacing, "");
1856 switch (params->spacing.getSpace()) {
1857 case Spacing::Single:
1860 fl_set_choice(fd_form_document->choice_spacing, 1);
1863 case Spacing::Onehalf:
1866 fl_set_choice(fd_form_document->choice_spacing, 2);
1869 case Spacing::Double:
1872 fl_set_choice(fd_form_document->choice_spacing, 3);
1875 case Spacing::Other:
1877 fl_set_choice(fd_form_document->choice_spacing, 4);
1879 sprintf(sval,"%g",params->spacing.getValue());
1880 fl_set_input(fd_form_document->input_spacing, sval);
1886 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1887 params->secnumdepth);
1888 fl_set_counter_value(fd_form_document->slider_tocdepth,
1890 if (!params->float_placement.empty()) { // buffer local (Lgb)
1891 fl_set_input(fd_form_document->input_float_placement,
1892 params->float_placement.c_str());
1894 fl_set_input(fd_form_document->input_float_placement, "");
1896 if (!params->options.empty())
1897 fl_set_input(fd_form_document->input_extra,
1898 params->options.c_str());
1900 fl_set_input(fd_form_document->input_extra, "");
1902 if (current_view->currentBuffer()->isSGML()) {
1903 // bullets not used in SGML derived documents
1904 fl_deactivate_object(fd_form_document->button_bullets);
1905 fl_set_object_lcol(fd_form_document->button_bullets,
1908 fl_activate_object(fd_form_document->button_bullets);
1909 fl_set_object_lcol(fd_form_document->button_bullets,
1913 if (current_view->currentBuffer()->isReadonly()) {
1914 DisableDocumentLayout();
1916 EnableDocumentLayout();
1922 void MenuLayoutDocument()
1924 if (UpdateLayoutDocument()) {
1925 if (fd_form_document->form_document->visible) {
1926 fl_raise_form(fd_form_document->form_document);
1928 fl_show_form(fd_form_document->form_document,
1929 FL_PLACE_MOUSE, FL_FULLBORDER,
1930 _("Document Layout"));
1936 bool UpdateLayoutQuotes()
1939 if (!current_view->getScreen()
1940 || !current_view->available()
1941 || current_view->currentBuffer()->isReadonly())
1945 fl_set_choice(fd_form_quotes->choice_quotes_language,
1946 current_view->currentBuffer()->params.quotes_language + 1);
1947 fl_set_button(fd_form_quotes->radio_single, 0);
1948 fl_set_button(fd_form_quotes->radio_double, 0);
1950 if (current_view->currentBuffer()->params.quotes_times == InsetQuotes::SingleQ)
1951 fl_set_button(fd_form_quotes->radio_single, 1);
1953 fl_set_button(fd_form_quotes->radio_double, 1);
1954 } else if (fd_form_quotes->form_quotes->visible) {
1955 fl_hide_form(fd_form_quotes->form_quotes);
1960 void MenuLayoutQuotes()
1962 if (UpdateLayoutQuotes()) {
1963 if (fd_form_quotes->form_quotes->visible) {
1964 fl_raise_form(fd_form_quotes->form_quotes);
1966 fl_show_form(fd_form_quotes->form_quotes,
1967 FL_PLACE_MOUSE, FL_FULLBORDER,
1974 bool UpdateLayoutPreamble()
1977 if (!current_view->getScreen() || ! current_view->available())
1981 fl_set_input(fd_form_preamble->input_preamble,
1982 current_view->currentBuffer()->params.preamble.c_str());
1984 if (current_view->currentBuffer()->isReadonly()) {
1985 fl_deactivate_object(fd_form_preamble->input_preamble);
1986 fl_deactivate_object(fd_form_preamble->button_ok);
1987 fl_deactivate_object(fd_form_preamble->button_apply);
1988 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
1989 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
1992 fl_activate_object(fd_form_preamble->input_preamble);
1993 fl_activate_object(fd_form_preamble->button_ok);
1994 fl_activate_object(fd_form_preamble->button_apply);
1995 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
1996 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
1998 } else if (fd_form_preamble->form_preamble->visible) {
1999 fl_hide_form(fd_form_preamble->form_preamble);
2004 void MenuLayoutPreamble()
2006 static int ow = -1, oh;
2008 if (UpdateLayoutPreamble()) {
2009 if (fd_form_preamble->form_preamble->visible) {
2010 fl_raise_form(fd_form_preamble->form_preamble);
2012 fl_show_form(fd_form_preamble->form_preamble,
2013 FL_PLACE_MOUSE | FL_FREE_SIZE,
2015 _("LaTeX Preamble"));
2017 ow = fd_form_preamble->form_preamble->w;
2018 oh = fd_form_preamble->form_preamble->h;
2020 fl_set_form_minsize(fd_form_preamble->form_preamble,
2026 void MenuLayoutSave()
2028 if (!current_view->getScreen() || ! current_view->available())
2031 if (AskQuestion(_("Do you want to save the current settings"),
2032 _("for Character, Document, Paper and Quotes"),
2033 _("as default for new documents?")))
2034 current_view->currentBuffer()->saveParamsAsDefaults();
2040 InsetInfo *new_inset = new InsetInfo();
2041 current_view->currentBuffer()->insertInset(new_inset);
2042 new_inset->Edit(0,0);
2043 //current_view->currentBuffer()->update(-1);
2049 if (current_view->available()) {
2050 minibuffer->Set(_("Open/Close..."));
2051 current_view->getScreen()->HideCursor();
2053 current_view->currentBuffer()->update(-2);
2054 current_view->currentBuffer()->text->OpenStuff();
2055 current_view->currentBuffer()->update(0);
2061 if (current_view->available()) {
2062 minibuffer->Set(_("Open/Close..."));
2063 current_view->getScreen()->HideCursor();
2065 current_view->currentBuffer()->update(-2);
2066 current_view->currentBuffer()->text->ToggleFootnote();
2067 current_view->currentBuffer()->update(0);
2074 /* if (current_view->currentBuffer()->the_locking_inset) {
2075 minibuffer->Set(_("Undo not yet supported in math mode"));
2079 if (current_view->available()) {
2080 minibuffer->Set(_("Undo"));
2081 current_view->getScreen()->HideCursor();
2083 current_view->currentBuffer()->update(-2);
2084 if (!current_view->currentBuffer()->text->TextUndo())
2085 minibuffer->Set(_("No further undo information"));
2087 current_view->currentBuffer()->update(-1);
2094 if (current_view->currentBuffer()->the_locking_inset) {
2095 minibuffer->Set(_("Redo not yet supported in math mode"));
2099 if (current_view->available()) {
2100 minibuffer->Set(_("Redo"));
2101 current_view->getScreen()->HideCursor();
2103 current_view->currentBuffer()->update(-2);
2104 if (!current_view->currentBuffer()->text->TextRedo())
2105 minibuffer->Set(_("No further redo information"));
2107 current_view->currentBuffer()->update(-1);
2112 void HyphenationPoint()
2114 if (current_view->available()) {
2115 current_view->getScreen()->HideCursor();
2116 current_view->currentBuffer()->update(-2);
2117 InsetSpecialChar *new_inset =
2118 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2119 current_view->currentBuffer()->insertInset(new_inset);
2120 //current_view->currentBuffer()->update(-1);
2127 if (current_view->available()) {
2128 current_view->getScreen()->HideCursor();
2129 current_view->currentBuffer()->update(-2);
2130 InsetSpecialChar *new_inset =
2131 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2132 current_view->currentBuffer()->insertInset(new_inset);
2137 void EndOfSentenceDot()
2139 if (current_view->available()) {
2140 current_view->getScreen()->HideCursor();
2141 current_view->currentBuffer()->update(-2);
2142 InsetSpecialChar *new_inset =
2143 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2144 current_view->currentBuffer()->insertInset(new_inset);
2149 void MenuSeparator()
2151 if (current_view->available()) {
2152 current_view->getScreen()->HideCursor();
2153 current_view->currentBuffer()->update(-2);
2154 InsetSpecialChar *new_inset =
2155 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2156 current_view->currentBuffer()->insertInset(new_inset);
2157 //current_view->currentBuffer()->update(-1);
2164 if (current_view->available()) {
2165 current_view->getScreen()->HideCursor();
2166 current_view->currentBuffer()->update(-2);
2167 current_view->currentBuffer()->text->InsertChar(LYX_META_NEWLINE);
2168 current_view->currentBuffer()->update(-1);
2173 void ProtectedBlank()
2175 if (current_view->available()) {
2176 current_view->getScreen()->HideCursor();
2177 current_view->currentBuffer()->update(-2);
2178 current_view->currentBuffer()->text->InsertChar(LYX_META_PROTECTED_SEPARATOR);
2179 current_view->currentBuffer()->update(-1);
2186 if (current_view->available()) {
2187 current_view->getScreen()->HideCursor();
2188 current_view->currentBuffer()->update(-2);
2189 current_view->currentBuffer()->text->InsertChar(LYX_META_HFILL);
2190 current_view->currentBuffer()->update(-1);
2195 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2196 They also show the current font state. */
2199 void ToggleAndShow(LyXFont const &);
2202 void FontSizeCB(string const & size)
2204 LyXFont font(LyXFont::ALL_IGNORE);
2205 font.setGUISize(size);
2206 ToggleAndShow(font);
2212 LyXFont font(LyXFont::ALL_IGNORE);
2213 font.setEmph(LyXFont::TOGGLE);
2214 ToggleAndShow(font);
2220 LyXFont font(LyXFont::ALL_IGNORE);
2221 font.setNoun(LyXFont::TOGGLE);
2222 ToggleAndShow(font);
2228 LyXFont font(LyXFont::ALL_IGNORE);
2229 font.setSeries(LyXFont::BOLD_SERIES);
2230 ToggleAndShow(font);
2236 LyXFont font(LyXFont::ALL_IGNORE);
2237 font.setUnderbar(LyXFont::TOGGLE);
2238 ToggleAndShow(font);
2244 LyXFont font(LyXFont::ALL_IGNORE);
2245 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2246 ToggleAndShow(font);
2252 LyXFont font(LyXFont::ALL_IGNORE);
2253 font.setFamily(LyXFont::SANS_FAMILY);
2254 ToggleAndShow(font);
2260 LyXFont font(LyXFont::ALL_IGNORE);
2261 font.setFamily(LyXFont::ROMAN_FAMILY);
2262 ToggleAndShow(font);
2268 LyXFont font(LyXFont::ALL_IGNORE);
2269 font.setLatex (LyXFont::TOGGLE);
2270 ToggleAndShow(font);
2276 LyXFont font(LyXFont::ALL_INHERIT);
2277 ToggleAndShow(font);
2281 /* -------> Returns the current font and depth by printing a message. In the
2282 * future perhaps we could try to implement a callback to the button-bar.
2283 * That is, `light' the bold button when the font is currently bold, etc.
2285 string CurrentState()
2288 if (current_view->available()) {
2289 // I think we should only show changes from the default
2291 Buffer * buffer = current_view->currentBuffer();
2292 LyXFont font = buffer->text->real_current_font;
2293 LyXFont defaultfont = textclasslist.TextClass(buffer->
2294 params.textclass).defaultfont();
2295 font.reduce(defaultfont);
2296 state = _("Font: ") + font.stateText();
2298 int depth = buffer->text->GetDepth();
2300 state += string(_(", Depth: ")) + tostr(depth);
2306 /* -------> Does the actual toggle job of the XxxCB() calls above.
2307 * Also shows the current font state.
2310 void ToggleAndShow(LyXFont const & font)
2312 if (current_view->available()) {
2313 current_view->getScreen()->HideCursor();
2314 current_view->currentBuffer()->update(-2);
2315 current_view->currentBuffer()->text->ToggleFree(font, toggleall);
2316 current_view->currentBuffer()->update(1);
2318 // removed since it overrides the ToggleFree Message about the style
2319 // Since Styles are more "High Level" than raw fonts I think the user
2320 // prefers it like this Matthias
2321 // FontStateShowCB( 0, 0 );
2325 extern "C" void MarginCB(FL_OBJECT *, long)
2327 if (current_view->available()) {
2328 minibuffer->Set(_("Inserting margin note..."));
2329 current_view->getScreen()->HideCursor();
2330 current_view->currentBuffer()->update(-2);
2331 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2332 current_view->currentBuffer()->update(1);
2337 extern "C" void FigureCB(FL_OBJECT *, long)
2339 if (fd_form_figure->form_figure->visible) {
2340 fl_raise_form(fd_form_figure->form_figure);
2342 fl_show_form(fd_form_figure->form_figure,
2343 FL_PLACE_MOUSE, FL_FULLBORDER,
2344 _("Insert Figure"));
2349 extern "C" void TableCB(FL_OBJECT *, long)
2351 if (fd_form_table->form_table->visible) {
2352 fl_raise_form(fd_form_table->form_table);
2354 fl_show_form(fd_form_table->form_table,
2355 FL_PLACE_MOUSE, FL_FULLBORDER,
2361 void CopyEnvironmentCB()
2363 if (current_view->available()) {
2364 current_view->currentBuffer()->text->copyEnvironmentType();
2365 /* clear the selection, even if mark_set */
2366 current_view->getScreen()->ToggleSelection();
2367 current_view->currentBuffer()->text->ClearSelection();
2368 current_view->currentBuffer()->update(-2);
2369 minibuffer->Set(_("Paragraph environment type copied"));
2374 void PasteEnvironmentCB()
2376 if (current_view->available()) {
2377 current_view->currentBuffer()->text->pasteEnvironmentType();
2378 minibuffer->Set(_("Paragraph environment type set"));
2379 current_view->currentBuffer()->update(1);
2386 if (current_view->available()) {
2387 current_view->currentBuffer()->text->CopySelection();
2388 /* clear the selection, even if mark_set */
2389 current_view->getScreen()->ToggleSelection();
2390 current_view->currentBuffer()->text->ClearSelection();
2391 current_view->currentBuffer()->update(-2);
2392 minibuffer->Set(_("Copy"));
2399 if (current_view->available()) {
2400 current_view->getScreen()->HideCursor();
2401 current_view->currentBuffer()->update(-2);
2402 current_view->currentBuffer()->text->CutSelection();
2403 current_view->currentBuffer()->update(1);
2404 minibuffer->Set(_("Cut"));
2411 if (!current_view->available()) return;
2413 minibuffer->Set(_("Paste"));
2414 current_view->getScreen()->HideCursor();
2415 /* clear the selection */
2416 current_view->getScreen()->ToggleSelection();
2417 current_view->currentBuffer()->text->ClearSelection();
2418 current_view->currentBuffer()->update(-2);
2421 current_view->currentBuffer()->text->PasteSelection();
2422 current_view->currentBuffer()->update(1);
2424 /* clear the selection */
2425 current_view->getScreen()->ToggleSelection();
2426 current_view->currentBuffer()->text->ClearSelection();
2427 current_view->currentBuffer()->update(-2);
2431 extern "C" void MeltCB(FL_OBJECT *, long)
2433 if (!current_view->available()) return;
2435 minibuffer->Set(_("Melt"));
2436 current_view->getScreen()->HideCursor();
2438 current_view->currentBuffer()->update(-2);
2439 current_view->currentBuffer()->text->MeltFootnoteEnvironment();
2440 current_view->currentBuffer()->update(1);
2444 // Change environment depth.
2445 // if decInc == 0, depth change taking mouse button number into account
2446 // if decInc == 1, increment depth
2447 // if decInc == -1, decrement depth
2448 extern "C" void DepthCB(FL_OBJECT *ob, long decInc)
2452 /* When decInc != 0, fake a mouse button. This allows us to
2453 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2454 /* check out wether ob is defined, too (Matthias) */
2457 else if (!decInc && ob) {
2458 button = fl_get_button_numb(ob);
2461 if (current_view->available()) {
2462 current_view->getScreen()->HideCursor();
2463 current_view->currentBuffer()->update(-2);
2465 current_view->currentBuffer()->text->IncDepth();
2467 current_view->currentBuffer()->text->DecDepth();
2468 current_view->currentBuffer()->update(1);
2469 minibuffer->Set(_("Changed environment depth"
2470 " (in possible range, maybe not)"));
2475 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2476 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2477 LyXFont UserFreeFont()
2479 LyXFont font(LyXFont::ALL_IGNORE);
2482 pos = fl_get_choice(fd_form_character->choice_family);
2484 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2485 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2486 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2487 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2488 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2491 pos = fl_get_choice(fd_form_character->choice_series);
2493 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2494 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2495 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2496 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2499 pos = fl_get_choice(fd_form_character->choice_shape);
2501 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2502 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2503 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2504 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2505 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2506 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2509 pos = fl_get_choice(fd_form_character->choice_size);
2511 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2512 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2513 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2514 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2515 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2516 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2517 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2518 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2519 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2520 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2521 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2522 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2523 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2524 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2527 pos = fl_get_choice(fd_form_character->choice_bar);
2529 case 1: font.setEmph(LyXFont::IGNORE);
2530 font.setUnderbar(LyXFont::IGNORE);
2531 font.setNoun(LyXFont::IGNORE);
2532 font.setLatex(LyXFont::IGNORE);
2534 case 2: font.setEmph(LyXFont::TOGGLE); break;
2535 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2536 case 4: font.setNoun(LyXFont::TOGGLE); break;
2537 case 5: font.setLatex(LyXFont::TOGGLE); break;
2538 case 6: font.setEmph(LyXFont::INHERIT);
2539 font.setUnderbar(LyXFont::INHERIT);
2540 font.setNoun(LyXFont::INHERIT);
2541 font.setLatex(LyXFont::INHERIT);
2545 pos = fl_get_choice(fd_form_character->choice_color);
2547 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2548 case 2: font.setColor(LyXFont::NONE); break;
2549 case 3: font.setColor(LyXFont::BLACK); break;
2550 case 4: font.setColor(LyXFont::WHITE); break;
2551 case 5: font.setColor(LyXFont::RED); break;
2552 case 6: font.setColor(LyXFont::GREEN); break;
2553 case 7: font.setColor(LyXFont::BLUE); break;
2554 case 8: font.setColor(LyXFont::CYAN); break;
2555 case 9: font.setColor(LyXFont::MAGENTA); break;
2556 case 10: font.setColor(LyXFont::YELLOW); break;
2557 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2566 ToggleAndShow(UserFreeFont());
2570 /* callbacks for form form_title */
2571 extern "C" void TimerCB(FL_OBJECT *, long)
2573 // only if the form still exists
2574 if (fd_form_title->form_title != 0) {
2575 if (fd_form_title->form_title->visible) {
2576 fl_hide_form(fd_form_title->form_title);
2578 fl_free_form(fd_form_title->form_title);
2579 fd_form_title->form_title = 0;
2584 /* callbacks for form form_paragraph */
2586 extern "C" void ParagraphVSpaceCB(FL_OBJECT* obj, long )
2588 // "Synchronize" the choices and input fields, making it
2589 // impossible to commit senseless data.
2591 const FD_form_paragraph* fp = fd_form_paragraph;
2593 if (obj == fp->choice_space_above) {
2594 if (fl_get_choice (fp->choice_space_above) != 7) {
2595 fl_set_input (fp->input_space_above, "");
2596 ActivateParagraphButtons();
2598 } else if (obj == fp->choice_space_below) {
2599 if (fl_get_choice (fp->choice_space_below) != 7) {
2600 fl_set_input (fp->input_space_below, "");
2601 ActivateParagraphButtons();
2603 } else if (obj == fp->input_space_above) {
2604 string input = fl_get_input (fp->input_space_above);
2606 if (input.empty()) {
2607 fl_set_choice (fp->choice_space_above, 1);
2608 ActivateParagraphButtons();
2610 else if (isValidGlueLength (input)) {
2611 fl_set_choice (fp->choice_space_above, 7);
2612 ActivateParagraphButtons();
2615 fl_set_choice (fp->choice_space_above, 7);
2616 DeactivateParagraphButtons();
2618 } else if (obj == fp->input_space_below) {
2619 string input = fl_get_input (fp->input_space_below);
2621 if (input.empty()) {
2622 fl_set_choice (fp->choice_space_below, 1);
2623 ActivateParagraphButtons();
2625 else if (isValidGlueLength (input)) {
2626 fl_set_choice (fp->choice_space_below, 7);
2627 ActivateParagraphButtons();
2630 fl_set_choice (fp->choice_space_below, 7);
2631 DeactivateParagraphButtons();
2637 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2639 if (!current_view->available())
2642 VSpace space_top, space_bottom;
2644 string labelwidthstring;
2647 // If a vspace kind is "Length" but there's no text in
2648 // the input field, reset the kind to "None".
2649 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2650 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2651 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2653 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2654 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2655 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2658 bool line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2659 bool line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2660 bool pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2661 bool pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2662 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2663 case 1: space_top = VSpace(VSpace::NONE); break;
2664 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2665 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2666 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2667 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2668 case 6: space_top = VSpace(VSpace::VFILL); break;
2669 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2671 if (fl_get_button (fd_form_paragraph->check_space_above))
2672 space_top.setKeep (true);
2673 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2674 case 1: space_bottom = VSpace(VSpace::NONE); break;
2675 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2676 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2677 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2678 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2679 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2680 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2682 if (fl_get_button (fd_form_paragraph->check_space_below))
2683 space_bottom.setKeep (true);
2685 if (fl_get_button(fd_form_paragraph->radio_align_left))
2686 align = LYX_ALIGN_LEFT;
2687 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2688 align = LYX_ALIGN_RIGHT;
2689 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2690 align = LYX_ALIGN_CENTER;
2692 align = LYX_ALIGN_BLOCK;
2694 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2695 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2697 current_view->currentBuffer()->text->SetParagraph(line_top,
2706 current_view->currentBuffer()->update(1);
2707 minibuffer->Set(_("Paragraph layout set"));
2711 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2713 fl_hide_form(fd_form_paragraph->form_paragraph);
2717 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2719 ParagraphApplyCB(ob, data);
2720 ParagraphCancelCB(ob, data);
2724 /* callbacks for form form_character */
2726 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2728 // we set toggleall locally here, since it should be true for
2729 // all other uses of ToggleAndShow() (JMarc)
2730 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2731 ToggleAndShow( UserFreeFont());
2736 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2738 fl_hide_form(fd_form_character->form_character);
2742 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2744 CharacterApplyCB(ob,data);
2745 CharacterCloseCB(ob,data);
2749 /* callbacks for form form_document */
2751 void UpdateDocumentButtons(BufferParams const ¶ms)
2753 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2755 if (params.sides == 2)
2756 fl_set_button(fd_form_document->radio_sides_two, 1);
2758 fl_set_button(fd_form_document->radio_sides_one, 1);
2760 if (params.columns == 2)
2761 fl_set_button(fd_form_document->radio_columns_two, 1);
2763 fl_set_button(fd_form_document->radio_columns_one, 1);
2765 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2766 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2767 params.secnumdepth);
2768 fl_set_counter_value(fd_form_document->slider_tocdepth,
2773 extern "C" void ChoiceClassCB(FL_OBJECT *ob, long)
2776 if (textclasslist.Load(fl_get_choice(ob)-1)) {
2777 if (AskQuestion(_("Should I set some parameters to"),
2778 fl_get_choice_text(ob),
2779 _("the defaults of this document class?"))) {
2780 BufferParams params = BufferParams();
2781 params.textclass = fl_get_choice(ob)-1;
2782 params.useClassDefaults();
2783 UpdateLayoutDocument(¶ms);
2784 UpdateDocumentButtons(params);
2787 // unable to load new style
2788 WriteAlert(_("Conversion Errors!"),
2789 _("Unable to switch to new document class."),
2790 _("Reverting to original document class."));
2791 fl_set_choice(fd_form_document->choice_class,
2792 GetCurrentTextClass() + 1);
2798 extern "C" void DocumentDefskipCB(FL_OBJECT *obj, long)
2800 // "Synchronize" the choice and the input field, so that it
2801 // is impossible to commit senseless data.
2802 const FD_form_document* fd = fd_form_document;
2804 if (obj == fd->choice_default_skip) {
2805 if (fl_get_choice (fd->choice_default_skip) != 4) {
2806 fl_set_input (fd->input_default_skip, "");
2807 ActivateDocumentButtons();
2809 } else if (obj == fd->input_default_skip) {
2811 const char* input = fl_get_input (fd->input_default_skip);
2814 fl_set_choice (fd->choice_default_skip, 2);
2815 ActivateDocumentButtons();
2816 } else if (isValidGlueLength (input)) {
2817 fl_set_choice (fd->choice_default_skip, 4);
2818 ActivateDocumentButtons();
2820 fl_set_choice (fd->choice_default_skip, 4);
2821 DeactivateDocumentButtons();
2827 extern "C" void DocumentSpacingCB(FL_OBJECT *obj, long)
2829 // "Synchronize" the choice and the input field, so that it
2830 // is impossible to commit senseless data.
2831 const FD_form_document* fd = fd_form_document;
2833 if (obj == fd->choice_spacing
2834 && fl_get_choice (fd->choice_spacing) != 4) {
2835 fl_set_input(fd->input_spacing, "");
2836 } else if (obj == fd->input_spacing) {
2838 const char* input = fl_get_input (fd->input_spacing);
2841 fl_set_choice (fd->choice_spacing, 1);
2843 fl_set_choice (fd->choice_spacing, 4);
2849 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2852 BufferParams *params = &(current_view->currentBuffer()->params);
2853 current_view->currentBuffer()->params.language =
2854 combo_language->getline();
2856 // If default skip is a "Length" but there's no text in the
2857 // input field, reset the kind to "Medskip", which is the default.
2858 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2859 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2860 fl_set_choice (fd_form_document->choice_default_skip, 2);
2863 /* this shouldn't be done automatically IMO. For example I write german
2864 * documents with an american keyboard very often. Matthias */
2866 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2867 fl_get_choice(fd_form_document->choice_language)); */
2869 fl_get_choice_text(fd_form_document->choice_fonts);
2871 fl_get_choice_text(fd_form_document->choice_inputenc);
2873 fl_get_choice_text(fd_form_document->choice_fontsize);
2875 fl_get_choice_text(fd_form_document->choice_pagestyle);
2876 params->graphicsDriver =
2877 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2878 params->use_amsmath =
2879 fl_get_button(fd_form_document->check_use_amsmath);
2881 if (!current_view->available())
2884 LyXTextClassList::ClassList::size_type new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2885 if (params->textclass != new_class) {
2886 // try to load new_class
2887 if (textclasslist.Load(new_class)) {
2888 // successfully loaded
2890 minibuffer->Set(_("Converting document to new document class..."));
2891 int ret = current_view->currentBuffer()->
2893 SwitchLayoutsBetweenClasses(current_view->currentBuffer()->
2896 current_view->currentBuffer()->
2902 s= _("One paragraph couldn't be converted");
2905 s += _(" paragraphs couldn't be converted");
2907 WriteAlert(_("Conversion Errors!"),s,
2908 _("into chosen document class"));
2911 params->textclass = new_class;
2913 // problem changing class -- warn user and retain old style
2914 WriteAlert(_("Conversion Errors!"),
2915 _("Unable to switch to new document class."),
2916 _("Reverting to original document class."));
2917 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2921 char tmpsep = params->paragraph_separation;
2922 if (fl_get_button(fd_form_document->radio_indent))
2923 params->paragraph_separation = LYX_PARSEP_INDENT;
2925 params->paragraph_separation = LYX_PARSEP_SKIP;
2926 if (tmpsep != params->paragraph_separation)
2929 VSpace tmpdefskip = params->getDefSkip();
2930 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2931 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2932 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2933 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2934 case 4: params->setDefSkip(
2935 VSpace (LyXGlueLength (fl_get_input
2936 (fd_form_document->input_default_skip))));
2938 // DocumentDefskipCB assures that this never happens
2939 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2941 if (!(tmpdefskip == params->getDefSkip()))
2944 if (fl_get_button(fd_form_document->radio_columns_two))
2945 params->columns = 2;
2947 params->columns = 1;
2948 if (fl_get_button(fd_form_document->radio_sides_two))
2949 params->sides = LyXTextClass::TwoSides;
2951 params->sides = LyXTextClass::OneSide;
2953 Spacing tmpSpacing = params->spacing;
2954 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2956 lyxerr.debug() << "Spacing: SINGLE" << endl;
2957 params->spacing.set(Spacing::Single);
2960 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2961 params->spacing.set(Spacing::Onehalf);
2964 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2965 params->spacing.set(Spacing::Double);
2968 lyxerr.debug() << "Spacing: OTHER" << endl;
2969 params->spacing.set(Spacing::Other,
2970 fl_get_input(fd_form_document->input_spacing));
2973 if (tmpSpacing != params->spacing)
2976 signed char tmpchar =
2977 static_cast<signed char>(fl_get_counter_value(fd_form_document->slider_secnumdepth));
2978 if (params->secnumdepth != tmpchar)
2980 params->secnumdepth = tmpchar;
2983 static_cast<int>(fl_get_counter_value(fd_form_document->slider_tocdepth));
2985 params->float_placement =
2986 fl_get_input(fd_form_document->input_float_placement);
2988 // More checking should be done to ensure the string doesn't have
2989 // spaces or illegal placement characters in it. (thornley)
2992 current_view->redoCurrentBuffer();
2994 minibuffer->Set(_("Document layout set"));
2995 current_view->currentBuffer()->markDirty();
2998 fl_get_input(fd_form_document->input_extra);
3003 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
3005 fl_hide_form(fd_form_document->form_document);
3009 extern "C" void DocumentOKCB(FL_OBJECT *ob, long data)
3011 DocumentCancelCB(ob,data);
3012 DocumentApplyCB(ob,data);
3016 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
3019 // bullet callbacks etc. in bullet_panel.C -- ARRae
3025 if (!current_view->getScreen())
3028 current_view->getScreen()->HideCursor();
3030 current_view->currentBuffer()->update(-2);
3033 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3034 if (current_view->currentBuffer()->text->cursor.pos
3035 || current_view->currentBuffer()->text->cursor.par !=
3036 current_view->currentBuffer()->text->FirstParagraph())
3038 tmp = current_view->currentBuffer()->text->cursor;
3039 current_view->currentBuffer()->text->cursor.par =
3040 current_view->currentBuffer()->text->FirstParagraph();
3041 current_view->currentBuffer()->text->cursor.pos = 0;
3042 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3043 current_view->currentBuffer()->text->cursor = tmp;
3044 minibuffer->Set(_("No more notes"));
3048 minibuffer->Set(_("No more notes"));
3052 current_view->currentBuffer()->update(0);
3053 current_view->currentBuffer()->text->sel_cursor =
3054 current_view->currentBuffer()->text->cursor;
3058 void InsertCorrectQuote()
3060 Buffer *cbuffer = current_view->currentBuffer();
3063 if (cbuffer->text->cursor.pos )
3064 c = cbuffer->text->cursor.par->GetChar(cbuffer->text->cursor.pos - 1);
3068 cbuffer->insertInset(new InsetQuotes(c, cbuffer->params));
3072 /* callbacks for form form_quotes */
3074 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
3076 if (!current_view->available())
3079 minibuffer->Set(_("Quotes type set"));
3080 //current_view->currentBuffer()->params.quotes_language =
3081 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3082 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3083 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3085 lga = InsetQuotes::EnglishQ;
3088 lga = InsetQuotes::SwedishQ;
3091 lga = InsetQuotes::GermanQ;
3094 lga = InsetQuotes::PolishQ;
3097 lga = InsetQuotes::FrenchQ;
3100 lga = InsetQuotes::DanishQ;
3103 current_view->currentBuffer()->params.quotes_language = lga;
3104 if (fl_get_button(fd_form_quotes->radio_single))
3105 current_view->currentBuffer()->
3106 params.quotes_times = InsetQuotes::SingleQ;
3108 current_view->currentBuffer()->
3109 params.quotes_times = InsetQuotes::DoubleQ;
3113 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
3115 fl_hide_form(fd_form_quotes->form_quotes);
3119 extern "C" void QuotesOKCB(FL_OBJECT *ob, long data)
3121 QuotesApplyCB(ob, data);
3122 QuotesCancelCB(ob, data);
3127 /* callbacks for form form_preamble */
3129 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
3131 fl_hide_form(fd_form_preamble->form_preamble);
3135 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
3137 if (!current_view->available())
3140 current_view->currentBuffer()->params.preamble =
3141 fl_get_input(fd_form_preamble->input_preamble);
3142 current_view->currentBuffer()->markDirty();
3143 minibuffer->Set(_("LaTeX preamble set"));
3147 extern "C" void PreambleOKCB(FL_OBJECT *ob, long data)
3149 PreambleApplyCB(ob, data);
3150 PreambleCancelCB(ob, data);
3154 /* callbacks for form form_table */
3156 extern "C" void TableApplyCB(FL_OBJECT *, long)
3159 if (!current_view->getScreen())
3162 // check for tables in tables
3163 if (current_view->currentBuffer()->text->cursor.par->table){
3164 WriteAlert(_("Impossible Operation!"),
3165 _("Cannot insert table in table."),
3170 minibuffer->Set(_("Inserting table..."));
3172 ysize = (int)(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3173 xsize = (int)(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3176 current_view->getScreen()->HideCursor();
3178 current_view->currentBuffer()->update(-2);
3180 current_view->currentBuffer()->text->SetCursorParUndo();
3181 current_view->currentBuffer()->text->FreezeUndo();
3183 current_view->currentBuffer()->text->BreakParagraph();
3184 current_view->currentBuffer()->update(-1);
3186 if (current_view->currentBuffer()->text->cursor.par->Last()) {
3187 current_view->currentBuffer()->text->CursorLeft();
3189 current_view->currentBuffer()->text->BreakParagraph();
3190 current_view->currentBuffer()->update(-1);
3193 current_view->currentBuffer()->text->current_font.setLatex(LyXFont::OFF);
3194 //if (!fl_get_button(fd_form_table->check_latex)){
3195 // insert the new wysiwy table
3196 current_view->currentBuffer()->text->SetLayout(0); // standard layout
3197 if (current_view->currentBuffer()->text->cursor.par->footnoteflag ==
3198 LyXParagraph::NO_FOOTNOTE) {
3199 current_view->currentBuffer()->
3200 text->SetParagraph(0, 0,
3202 VSpace (0.3 * current_view->currentBuffer()->
3203 params.spacing.getValue(),
3205 VSpace (0.3 * current_view->currentBuffer()->
3206 params.spacing.getValue(),
3213 current_view->currentBuffer()->text->SetParagraph(0, 0,
3215 VSpace(VSpace::NONE),
3216 VSpace(VSpace::NONE),
3221 current_view->currentBuffer()->text->cursor.par->table = new LyXTable(xsize, ysize);
3223 for (i=0; i<xsize * ysize - 1; i++)
3224 current_view->currentBuffer()->text->cursor.par->InsertChar(0,LYX_META_NEWLINE);
3225 current_view->currentBuffer()->text->RedoParagraph();
3227 current_view->currentBuffer()->text->UnFreezeUndo();
3229 current_view->currentBuffer()->update(1);
3230 minibuffer->Set(_("Table inserted"));
3234 extern "C" void TableCancelCB(FL_OBJECT *, long)
3236 fl_hide_form(fd_form_table->form_table);
3240 extern "C" void TableOKCB(FL_OBJECT *ob, long data)
3242 TableApplyCB(ob,data);
3243 TableCancelCB(ob,data);
3247 /* callbacks for form form_print */
3249 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3251 fl_hide_form(fd_form_print->form_print);
3254 static bool stringOnlyContains (string const & LStr, const char * cset)
3256 const char * cstr = LStr.c_str() ;
3258 return strspn(cstr,cset) == strlen(cstr) ;
3261 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3263 if (!current_view->available())
3265 Buffer *buffer = current_view->currentBuffer();
3266 string path = OnlyPath(buffer->getFileName());
3269 if (fl_get_button(fd_form_print->radio_even_pages))
3270 pageflag = lyxrc->print_evenpage_flag + ' ';
3271 else if (fl_get_button(fd_form_print->radio_odd_pages))
3272 pageflag = lyxrc->print_oddpage_flag + ' ';
3274 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3275 // User may give a page (range) list
3276 // User may print multiple (unsorted) copies
3277 string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
3278 pages = subst(pages, '+',',');
3279 pages = frontStrip(strip(pages)) ;
3280 while (!pages.empty()) { // a page range was given
3282 pages = split (pages, piece, ',') ;
3283 piece = strip(piece) ;
3284 piece = frontStrip(piece) ;
3285 if ( !stringOnlyContains (piece, "0123456789-") ) {
3286 WriteAlert(_("ERROR! Unable to print!"),
3287 _("Check 'range of pages'!"));
3290 if (piece.find('-') == string::npos) { // not found
3291 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3292 } else if (suffixIs(piece, "-") ) { // missing last page
3293 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3294 } else if (prefixIs(piece, "-") ) { // missing first page
3295 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3297 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3301 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3302 if (!copies.empty()) { // a number of copies was given
3303 if ( !stringOnlyContains (copies, "0123456789") ) {
3304 WriteAlert(_("ERROR! Unable to print!"),
3305 _("Check 'number of copies'!"));
3308 if (fl_get_button(fd_form_print->do_unsorted))
3309 pageflag += lyxrc->print_copies_flag;
3311 pageflag += lyxrc->print_collcopies_flag;
3312 pageflag += " " + copies + ' ' ;
3316 if (fl_get_button(fd_form_print->radio_order_reverse))
3317 reverseflag = lyxrc->print_reverse_flag + ' ';
3319 string orientationflag;
3320 if (buffer->params.orientation == ORIENTATION_LANDSCAPE)
3321 orientationflag = lyxrc->print_landscape_flag + ' ';
3323 string ps_file = SpaceLess(fl_get_input(fd_form_print->input_file));
3324 string printer = strip(fl_get_input(fd_form_print->input_printer));
3327 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3328 && ! printer.empty()) // a printer name has been given
3329 printerflag = lyxrc->print_to_printer + printer + ' ';
3332 if (!lyxrc->print_extra_options.empty())
3333 extraflags = lyxrc->print_extra_options + ' ';
3335 string command = lyxrc->print_command + ' '
3336 + printerflag + pageflag + reverseflag
3337 + orientationflag + extraflags;
3339 char real_papersize = buffer->params.papersize;
3340 if (real_papersize == PAPER_DEFAULT)
3341 real_papersize = lyxrc->default_papersize;
3345 switch (real_papersize) {
3346 case PAPER_USLETTER:
3361 case PAPER_EXECUTIVEPAPER:
3364 case PAPER_LEGALPAPER:
3367 default: /* If nothing else fits, keep an empty value... */
3371 if (buffer->params.use_geometry
3372 && buffer->params.papersize2 == VM_PAPER_CUSTOM
3373 && !lyxrc->print_paper_dimension_flag.empty()
3374 && !buffer->params.paperwidth.empty()
3375 && !buffer->params.paperheight.empty()) {
3376 // using a custom papersize
3378 command += lyxrc->print_paper_dimension_flag + ' ';
3379 command += buffer->params.paperwidth + ',';
3380 command += buffer->params.paperheight + ' ';
3381 } else if (!lyxrc->print_paper_flag.empty()
3383 && (real_papersize != PAPER_USLETTER ||
3384 buffer->params.orientation == ORIENTATION_PORTRAIT)) {
3385 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3387 if (fl_get_button(fd_form_print->radio_file))
3388 command += lyxrc->print_to_file + '\"'
3389 + MakeAbsPath(ps_file, path)
3391 else if (!lyxrc->print_spool_command.empty())
3392 command += lyxrc->print_to_file
3393 + '\"' + ps_file + '\"';
3395 // push directorypath, if necessary
3396 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3397 path = buffer->tmppath;
3402 if (!lyxrc->print_spool_command.empty() &&
3403 !fl_get_button(fd_form_print->radio_file)) {
3404 string command2 = lyxrc->print_spool_command + ' ';
3405 if (!printer.empty())
3406 command2 += lyxrc->print_spool_printerprefix
3408 // First run dvips and, if succesful, then spool command
3409 if ((result = RunScript(buffer, true, command))) {
3410 result = RunScript(buffer, false, command2, ps_file);
3413 result = RunScript(buffer, false, command);
3416 WriteAlert(_("Error:"),
3417 _("Unable to print"),
3418 _("Check that your parameters are correct"));
3422 extern "C" void PrintOKCB(FL_OBJECT *ob, long data)
3424 PrintCancelCB(ob, data);
3425 PrintApplyCB(ob,data);
3429 /* callbacks for form form_figure */
3431 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3433 if (!current_view->available())
3436 Buffer * buffer = current_view->currentBuffer();
3437 if(buffer->isReadonly()) // paranoia
3440 minibuffer->Set(_("Inserting figure..."));
3441 if (fl_get_button(fd_form_figure->radio_inline)
3442 || buffer->text->cursor.par->table) {
3443 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3444 buffer->insertInset(new_inset);
3445 minibuffer->Set(_("Figure inserted"));
3446 new_inset->Edit(0, 0);
3450 current_view->getScreen()->HideCursor();
3454 buffer->text->SetCursorParUndo();
3455 buffer->text->FreezeUndo();
3457 buffer->text->BreakParagraph();
3460 if (buffer->text->cursor.par->Last()) {
3461 buffer->text->CursorLeft();
3463 buffer->text->BreakParagraph();
3467 // The standard layout should always be numer 0;
3468 buffer->text->SetLayout(0);
3470 if (buffer->text->cursor.par->footnoteflag ==
3471 LyXParagraph::NO_FOOTNOTE) {
3472 buffer->text->SetParagraph(0, 0,
3474 VSpace (0.3 * buffer->params.spacing.getValue(),
3477 buffer->params.spacing.getValue(),
3479 LYX_ALIGN_CENTER, string(), 0);
3481 buffer->text->SetParagraph(0, 0,
3483 VSpace(VSpace::NONE),
3484 VSpace(VSpace::NONE),
3491 Inset *new_inset = 0;
3493 new_inset = new InsetFig(100, 100, buffer);
3494 buffer->insertInset(new_inset);
3495 new_inset->Edit(0, 0);
3497 minibuffer->Set(_("Figure inserted"));
3498 buffer->text->UnFreezeUndo();
3502 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3504 fl_hide_form(fd_form_figure->form_figure);
3508 extern "C" void FigureOKCB(FL_OBJECT *ob, long data)
3510 FigureApplyCB(ob,data);
3511 FigureCancelCB(ob,data);
3514 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3516 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3517 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3518 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3519 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3520 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3521 fontloader.update();
3523 // All buffers will need resize
3524 bufferlist.resize();
3526 minibuffer->Set(_("Screen options set"));
3530 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3532 fl_hide_form(fd_form_screen->form_screen);
3536 extern "C" void ScreenOKCB(FL_OBJECT *ob, long data)
3538 ScreenCancelCB(ob,data);
3539 ScreenApplyCB(ob,data);
3545 if (!current_view->available())
3548 fl_set_button(fd_latex_options->accents,
3549 (int)current_view->currentBuffer()->params.allowAccents);
3551 if (fd_latex_options->LaTeXOptions->visible) {
3552 fl_raise_form(fd_latex_options->LaTeXOptions);
3554 fl_show_form(fd_latex_options->LaTeXOptions,
3555 FL_PLACE_MOUSE, FL_FULLBORDER,
3556 _("LaTeX Options"));
3561 // This function runs "configure" and then rereads lyx.defaults to
3562 // reconfigure the automatic settings.
3565 minibuffer->Set(_("Running configure..."));
3567 // Run configure in user lyx directory
3568 Path p(user_lyxdir);
3569 Systemcalls one(Systemcalls::System,
3570 AddName(system_lyxdir,"configure"));
3572 minibuffer->Set(_("Reloading configuration..."));
3573 lyxrc->Read(LibFileSearch(string(), "lyxrc.defaults"));
3574 WriteAlert(_("The system has been reconfigured."),
3575 _("You need to restart LyX to make use of any"),
3576 _("updated document class specifications."));
3580 /* these functions are for the spellchecker */
3581 char* NextWord(float &value)
3583 if (!current_view->available()){
3588 char* string = current_view->currentBuffer()->text->SelectNextWord(value);
3594 void SelectLastWord()
3596 if (!current_view->available())
3599 current_view->getScreen()->HideCursor();
3601 current_view->currentBuffer()->text->SelectSelectedWord();
3602 current_view->getScreen()->ToggleSelection(false);
3603 current_view->currentBuffer()->update(0);
3607 void EndOfSpellCheck()
3609 if (!current_view->available())
3612 current_view->getScreen()->HideCursor();
3614 current_view->currentBuffer()->text->SelectSelectedWord();
3615 current_view->currentBuffer()->text->ClearSelection();
3616 current_view->currentBuffer()->update(0);
3620 void ReplaceWord(string const & replacestring)
3622 if (!current_view->getScreen())
3625 current_view->getScreen()->HideCursor();
3626 current_view->currentBuffer()->update(-2);
3628 /* clear the selection (if there is any) */
3629 current_view->getScreen()->ToggleSelection(false);
3630 current_view->currentBuffer()->text->
3631 ReplaceSelectionWithString(replacestring.c_str());
3633 current_view->currentBuffer()->text->SetSelectionOverString(replacestring.c_str());
3635 // Go back so that replacement string is also spellchecked
3636 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3637 current_view->currentBuffer()->text->CursorLeftIntern();
3639 current_view->currentBuffer()->update(1);
3641 // End of spellchecker stuff
3646 // Table of Contents
3656 static TocList* toclist = 0;
3659 extern "C" void TocSelectCB(FL_OBJECT *ob, long)
3661 if (!current_view->available())
3664 TocList* tmptoclist = toclist;
3665 int i = fl_get_browser(ob);
3668 for (a=1; a<i && tmptoclist->next; a++){
3669 tmptoclist = tmptoclist->next;
3676 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3677 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3678 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3679 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3680 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3681 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3682 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3683 par->appendix != tmptoclist->appendix)) {
3684 par = par->LastPhysicalPar()->Next();
3689 current_view->currentBuffer()->text->SetCursor(par, 0);
3690 current_view->currentBuffer()->text->sel_cursor =
3691 current_view->currentBuffer()->text->cursor;
3692 current_view->currentBuffer()->update(0);
3695 WriteAlert(_("Error"),
3696 _("Couldn't find this label"),
3697 _("in current document."));
3703 extern "C" void TocCancelCB(FL_OBJECT *, long)
3705 fl_hide_form(fd_form_toc->form_toc);
3709 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3711 static LyXParagraph * stapar = 0;
3712 TocList * tmptoclist = 0;
3714 /* deleted the toclist */
3717 tmptoclist = toclist->next;
3719 toclist = tmptoclist;
3723 tmptoclist = toclist;
3726 fl_clear_browser(fd_form_toc->browser_toc);
3727 if (!current_view->available()) {
3728 fl_add_browser_line(fd_form_toc->browser_toc, _("*** No Document ***"));
3731 fl_hide_object(fd_form_toc->browser_toc);
3732 /* get the table of contents */
3733 LyXParagraph * par = current_view->currentBuffer()->paragraph;
3735 char * line = new char[200];
3741 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3745 labeltype = textclasslist.Style(current_view->currentBuffer()->params.textclass,
3746 par->GetLayout()).labeltype;
3748 if (labeltype >= LABEL_COUNTER_CHAPTER
3749 && labeltype <= LABEL_COUNTER_CHAPTER +
3750 current_view->currentBuffer()->params.tocdepth) {
3751 /* insert this into the table of contents */
3752 /* first indent a little bit */
3756 textclasslist.TextClass(current_view->currentBuffer()->
3757 params.textclass).maxcounter()) * 4 + 2;
3761 // Then the labestring
3762 if (!par->labelstring.empty()) {
3763 string::size_type i = 0;
3764 while (pos < 199 && i < par->labelstring.length()) {
3765 line[pos] = par->labelstring[i];
3774 /* now the contents */
3776 LyXParagraph::size_type i = 0;
3777 while (pos < 199 && i < par->size()) {
3780 while (pos < 199 && i < par->last) {
3782 c = par->GetChar(i);
3783 if (isprint(c) || c >= 128) {
3790 fl_add_browser_line(fd_form_toc->browser_toc, line);
3792 /* make a toclist entry */
3794 tmptoclist = new TocList;
3795 toclist = tmptoclist;
3797 tmptoclist->next = new TocList;
3798 tmptoclist = tmptoclist->next;
3801 tmptoclist->next = 0;
3803 for (a=0; a<6; a++){
3804 tmptoclist->counter[a] = par->GetFirstCounter(a);
3806 tmptoclist->appendix = par->appendix;
3808 par = par->LastPhysicalPar()->Next();
3812 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3813 fl_show_object(fd_form_toc->browser_toc);
3817 /* callbacks for form form_ref */
3818 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3820 if (!current_view->available())
3824 fl_get_browser_line(fd_form_ref->browser_ref,
3825 fl_get_browser(fd_form_ref->browser_ref));
3826 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3832 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3842 if(current_view->currentBuffer()->isSGML())
3843 t += "[" + u + "]" + "{" + s + "}";
3848 new InsetRef(t, current_view->currentBuffer());
3849 current_view->currentBuffer()->insertInset(new_inset);
3853 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3855 if (!current_view->available()) {
3856 fl_clear_browser(fd_form_ref->browser_ref);
3860 FL_OBJECT * brow = fd_form_ref->browser_ref;
3862 // Get the current line, in order to restore it later
3863 char const * const btmp=fl_get_browser_line(brow,
3864 fl_get_browser(brow));
3865 string currentstr=btmp ? btmp : "";
3866 //string currentstr = fl_get_browser_line(brow,
3867 // fl_get_browser(brow));
3869 fl_clear_browser(brow);
3871 string refs = current_view->currentBuffer()->getReferenceList('\n');
3874 #if FL_REVISION > 85
3875 fl_addto_browser_chars(brow,refs.c_str());
3876 int total_lines = fl_get_browser_maxline(brow);
3877 for (int i = 1; i <= total_lines ; i++) {
3878 if (fl_get_browser_line(brow, i) == currentstr) {
3883 fl_set_browser_topline(brow, topline);
3885 // Keep the old ugly code for xforms 0.81 compatibility
3890 curr_ref = refs.token('\n',ref_num);
3891 if (curr_ref.empty())
3893 fl_add_browser_line(brow,curr_ref.c_str());
3898 if (!fl_get_browser_maxline(brow)) {
3899 fl_add_browser_line(brow,
3900 _("*** No labels found in document ***"));
3901 fl_deactivate_object(brow);
3903 fl_select_browser_line(brow, topline);
3904 fl_activate_object(brow);
3906 if (current_view->currentBuffer()->isReadonly()) {
3907 // would be better to de/activate insert buttons
3908 // but that's more work... besides this works. ARRae
3909 fl_hide_form(fd_form_ref->form_ref);
3911 if (!current_view->currentBuffer()->isSGML()) {
3912 fl_deactivate_object(fd_form_ref->ref_name);
3913 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3916 fl_activate_object(fd_form_ref->ref_name);
3917 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3922 extern "C" void RefHideCB(FL_OBJECT *, long)
3924 fl_hide_form(fd_form_ref->form_ref);
3928 void UpdateInset(Inset* inset, bool mark_dirty)
3933 /* very first check for locking insets*/
3934 if (current_view->currentBuffer()->the_locking_inset == inset){
3935 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3936 current_view->update();
3938 if (current_view->currentBuffer()->isLyxClean())
3939 minibuffer->setTimer(4);
3940 current_view->currentBuffer()->markDirty();
3942 current_view->updateScrollbar();
3947 /* first check the current buffer */
3948 if (current_view->available()){
3949 current_view->getScreen()->HideCursor();
3950 current_view->currentBuffer()->update(-3);
3951 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3953 current_view->currentBuffer()->update(1);
3955 current_view->currentBuffer()->update(3);
3960 // check all buffers
3961 bufferlist.updateInset(inset, mark_dirty);
3966 /* these functions return 1 if an error occured,
3968 int LockInset(UpdatableInset* inset)
3970 if (!current_view->currentBuffer()->the_locking_inset && inset){
3971 current_view->currentBuffer()->the_locking_inset = inset;
3978 void ShowLockedInsetCursor(long x, long y, int asc, int desc)
3980 if (current_view->currentBuffer()->the_locking_inset &&
3981 current_view->getScreen()){
3982 y += current_view->currentBuffer()->text->cursor.y;
3983 current_view->getScreen()->ShowManualCursor(x, y,
3989 void HideLockedInsetCursor(long x, long y, int asc, int desc)
3991 if (current_view->currentBuffer()->the_locking_inset &&
3992 current_view->getScreen()){
3993 y += current_view->currentBuffer()->text->cursor.y;
3994 current_view->getScreen()->HideManualCursor(x, y,
4000 void FitLockedInsetCursor(long x, long y, int asc, int desc)
4002 if (current_view->currentBuffer()->the_locking_inset &&
4003 current_view->getScreen()){
4004 y += current_view->currentBuffer()->text->cursor.y;
4005 if (current_view->getScreen()->FitManualCursor(x, y, asc, desc))
4006 current_view->updateScrollbar();
4011 int UnlockInset(UpdatableInset* inset)
4014 current_view->currentBuffer()->the_locking_inset == inset){
4015 inset->InsetUnlock();
4016 current_view->currentBuffer()->the_locking_inset = 0;
4017 current_view->currentBuffer()->text->FinishUndo();
4020 return bufferlist.unlockInset(inset);
4024 void LockedInsetStoreUndo(Undo::undo_kind kind)
4026 if (!current_view->currentBuffer()->the_locking_inset)
4027 return; // shouldn't happen
4028 if (kind == Undo::EDIT) // in this case insets would not be stored!
4029 kind = Undo::FINISH;
4030 current_view->currentBuffer()->text->SetUndo(kind,
4031 current_view->currentBuffer()->text->cursor.par->
4032 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->previous,
4033 current_view->currentBuffer()->text->cursor.par->
4034 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->next);
4038 void PutInsetIntoInsetUpdateList(Inset* inset)
4041 InsetUpdateStruct* tmp = new InsetUpdateStruct();
4043 tmp->next = InsetUpdateList;
4044 InsetUpdateList = tmp;
4049 void UpdateInsetUpdateList()
4051 InsetUpdateStruct *tmp = InsetUpdateList;
4053 UpdateInset(tmp->inset, false); // "false" because no document change
4057 /* delete the update list */
4058 while (InsetUpdateList) {
4059 tmp = InsetUpdateList;
4060 InsetUpdateList = InsetUpdateList->next;
4063 InsetUpdateList = 0;
4066 #ifdef WITH_WARNINGS
4069 // I know we shouldn't put anything in here but this seems the fastest
4070 // way to do this (and the cleanest for now). This function just inserts
4071 // a newline in the string and the inserts 'depth'-spaces so that the
4072 // code is indented in the right way!!!
4073 void addNewlineAndDepth(string & file, int const depth)
4076 file.append(depth, ' ');