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"
62 extern MiniBuffer *minibuffer;
63 extern Combox *combo_language;
64 extern BufferList bufferlist;
65 extern void show_symbols_form();
66 extern FD_form_main *fd_form_main;
67 extern FD_form_title *fd_form_title;
68 extern FD_form_paragraph *fd_form_paragraph;
69 extern FD_form_character *fd_form_character;
70 extern FD_form_document *fd_form_document;
71 extern FD_form_quotes *fd_form_quotes;
72 extern FD_form_preamble *fd_form_preamble;
73 extern FD_form_table *fd_form_table;
74 extern FD_form_print *fd_form_print;
75 extern FD_form_figure *fd_form_figure;
76 extern FD_form_screen *fd_form_screen;
77 extern FD_form_toc *fd_form_toc;
78 extern FD_form_ref *fd_form_ref;
79 extern FD_LaTeXOptions *fd_latex_options;
80 extern FD_form_bullet *fd_form_bullet;
82 extern BufferView *current_view; // called too many times in this file...
84 extern void DeleteSimpleCutBuffer(); /* for the cleanup when exiting */
86 extern bool send_fax(string const &fname, string const &sendcmd);
88 extern LyXServer *lyxserver;
89 extern FontLoader fontloader;
91 // this should be static, but I need it in buffer.C
92 bool quitting; // flag, that we are quitting the program
93 extern bool finished; // all cleanup done just let it run through now.
95 char ascii_type; /* for selection notify callbacks */
97 bool scrolling = false;
101 /* whether the work area should get callbacks */
102 bool input_prohibited = false;
104 /* the selection possible is needed, that only motion events are
105 * used, where the bottom press event was on the drawing area too */
106 bool selection_possible = false;
108 // This is used to make the dreaded font toggle problem hopefully go
109 // away. Definitely not the best solution, but I think it sorta works.
110 bool toggleall = true;
112 void InsertCorrectQuote();
116 This is the inset locking stuff needed for mathed --------------------
118 an inset can simple call LockInset in it's edit call and *ONLY* in it's
120 Inset::Edit() can only be called by the main lyx module.
122 Then the inset may modify the menu's and/or iconbars.
124 Unlocking is either done by LyX or the inset itself with a UnlockInset-call
126 During the lock, all button and keyboard events will be modified
127 and send to the inset through the following inset-features. Note that
128 Inset::InsetUnlock will be called from inside UnlockInset. It is meant
129 to contain the code for restoring the menus and things like this.
132 virtual void InsetButtonPress(int x, int y, int button);
133 virtual void InsetButtonRelease(int x, int y, int button);
134 virtual void InsetKeyPress(XKeyEvent *ev);
135 virtual void InsetMotionNotify(int x, int y, int state);
136 virtual void InsetUnlock();
138 If a inset wishes any redraw and/or update it just has to call
140 It's is completly irrelevant, where the inset is. UpdateInset will
141 find it in any paragraph in any buffer.
142 Of course the_locking_inset and the insets in the current paragraph/buffer
143 are checked first, so no performance problem should occur.
145 Hope that's ok for the beginning, Alejandro,
146 sorry that I needed so much time,
151 void UpdateInset(Inset* inset, bool mark_dirty = true);
152 /* these functions return 1 if an error occured,
154 // Now they work only for updatable insets. [Alejandro 080596]
155 int LockInset(UpdatableInset* inset);
156 void ToggleLockedInsetCursor(long x, long y, int asc, int desc);
157 void FitLockedInsetCursor(long x, long y, int asc, int desc);
158 int UnlockInset(UpdatableInset* inset);
159 void LockedInsetStoreUndo(Undo::undo_kind kind);
161 /* this is for asyncron updating. UpdateInsetUpdateList will be called
162 automatically from LyX. Just insert the Inset into the Updatelist */
163 void UpdateInsetUpdateList();
164 void PutInsetIntoInsetUpdateList(Inset* inset);
166 InsetUpdateStruct *InsetUpdateList = 0;
170 -----------------------------------------------------------------------
173 /* some function prototypes */
180 void HyphenationPoint();
181 void MenuSeparator();
184 void ProtectedBlank();
186 int RunLinuxDoc(int, string const &);
187 int RunDocBook(int, string const &);
188 void MenuWrite(Buffer* buf);
189 void MenuWriteAs(Buffer *buffer);
190 void MenuReload(Buffer *buf);
191 void MenuLayoutSave();
193 unsigned char GetCurrentTextClass()
194 // Who are we asking?
195 // Shouldn't this question be directed to the buffer?
196 // Indeed it should. Asger.
198 return current_view->currentBuffer()->params.textclass;
202 // How should this actually work? Should it prohibit input in all BufferViews,
203 // or just in the current one? If "just the current one", then it should be
204 // placed in BufferView. If "all BufferViews" then LyXGUI (I think) should
205 // run "ProhibitInput" on all LyXViews which will run prohibitInput on all
206 // BufferViews. Or is it perhaps just the (input in) BufferViews in the
207 // current LyxView that should be prohibited (Lgb) (This applies to
208 // "AllowInput" as well.)
211 input_prohibited = true;
212 if (current_view->getScreen())
213 current_view->getScreen()->HideCursor();
215 static Cursor cursor;
216 static bool cursor_undefined = true;
218 if (cursor_undefined){
219 cursor = XCreateFontCursor(fl_display, XC_watch);
221 cursor_undefined = false;
224 /* set the cursor to the watch for all forms and the canvas */
225 XDefineCursor(fl_display, fd_form_main->form_main->window, cursor);
226 if (fd_form_paragraph->form_paragraph->visible)
227 XDefineCursor(fl_display,
228 fd_form_paragraph->form_paragraph->window,
230 if (fd_form_character->form_character->visible)
231 XDefineCursor(fl_display,
232 fd_form_character->form_character->window,
236 fl_deactivate_all_forms();
240 // Should find a way to move this into BufferView.C
241 void SetXtermCursor(Window win)
243 static Cursor cursor;
244 static char cursor_undefined = 1;
245 if (cursor_undefined){
246 cursor = XCreateFontCursor(fl_display, XC_xterm);
248 cursor_undefined = 0;
250 XDefineCursor(fl_display, win, cursor);
257 input_prohibited = false;
259 /* reset the cursor from the watch for all forms and the canvas */
261 XUndefineCursor(fl_display, fd_form_main->form_main->window);
262 if (fd_form_paragraph->form_paragraph->visible)
263 XUndefineCursor(fl_display,
264 fd_form_paragraph->form_paragraph->window);
265 if (fd_form_character->form_character->visible)
266 XUndefineCursor(fl_display,
267 fd_form_character->form_character->window);
268 if (current_view->getWorkArea()->belowmouse)
269 SetXtermCursor(fd_form_main->form_main->window);
272 fl_activate_all_forms();
276 void FreeUpdateTimer()
278 /* a real free timer would be better but I don't know
279 * how to do this with xforms */
284 void SetUpdateTimer(float time)
286 fl_set_timer(fd_form_main->timer_update, time);
293 current_view->getScreen()->ToggleSelection();
294 current_view->currentBuffer()->text->ClearSelection();
299 void SmallUpdate(signed char f)
301 current_view->getScreen()->SmallUpdate();
302 if (current_view->getScreen()->TopCursorVisible()
303 != current_view->getScreen()->first){
304 current_view->currentBuffer()->update(f);
308 current_view->fitCursor();
309 current_view->updateScrollbar();
311 if (!current_view->currentBuffer()->text->selection)
312 current_view->currentBuffer()->text->sel_cursor =
313 current_view->currentBuffer()->text->cursor;
316 if (current_view->currentBuffer()->isLyxClean()) {
317 current_view->currentBuffer()->markDirty();
318 minibuffer->setTimer(4);
321 current_view->currentBuffer()->markDirty();
335 // should be moved to lyxfunc.C
336 void MenuWrite(Buffer* buf)
339 if (!bufferlist.write(buf)) {
340 string fname = buf->getFileName();
341 string s = MakeAbsPath(fname);
342 if (AskQuestion(_("Save failed. Rename and try again?"),
343 MakeDisplayPath(s,50),
344 _("(If not, document is not saved.)"))) {
348 lastfiles->newFile(buf->getFileName());
353 // should be moved to BufferView.C
354 void MenuWriteAs(Buffer *buffer)
356 if (!buffer->text) return;
358 string fname = buffer->getFileName();
359 string oldname = fname;
363 fileDlg.SetButton(0, _("Documents"), lyxrc->document_path);
364 fileDlg.SetButton(1, _("Templates"), lyxrc->template_path);
366 if (!IsLyXFilename(fname))
369 fname = fileDlg.Select(_("Enter Filename to Save Document as"),
372 OnlyFilename(fname));
376 minibuffer->Set(_("Canceled."));
380 // Make sure the absolute filename ends with appropriate suffix
381 string s= MakeAbsPath(fname);
382 if (!IsLyXFilename(s))
385 // Same name as we have already?
387 if (!AskQuestion(_("Same name as document already has:"),
388 MakeDisplayPath(s,50),
391 // Falls through to name change and save
393 // No, but do we have another file with this name open?
394 else if (bufferlist.exists(s)) {
395 if (AskQuestion(_("Another document with same name open!"),
396 MakeDisplayPath(s,50),
397 _("Replace with current document?")))
399 bufferlist.close(bufferlist.getBuffer(s));
401 // Ok, change the name of the buffer, but don't save!
402 buffer->setFileName(s);
405 minibuffer->Set(_("Document renamed to '"),
407 _("', but not saved..."));
410 } // Check whether the file exists
413 if (myfile.isOK() && !AskQuestion(_("Document already exists:"),
414 MakeDisplayPath(s,50),
419 // Ok, change the name of the buffer
420 buffer->setFileName(s);
423 // Small bug: If the save fails, we have irreversible changed the name
429 extern bool gsworking();
432 int MenuRunLaTeX(Buffer *buffer)
438 WriteAlert(_("Sorry, can't do this while pictures are being rendered."),
439 _("Please wait a few seconds for this to finish and try again."),
440 _("(or kill runaway gs processes by hand and try again.)"));
443 extern pid_t isp_pid; // from spellchecker.C
446 WriteAlert(_("Can't do this while the spellchecker is running."),
447 _("Stop the spellchecker first."));
452 if (buffer->isLinuxDoc())
453 ret = RunLinuxDoc(1, buffer->getFileName());
454 else if (buffer->isLiterate())
455 ret = buffer->runLiterate();
456 else if (buffer->isDocBook())
457 ret = RunDocBook(1, buffer->getFileName());
459 ret = buffer->runLaTeX();
465 s = _("One error detected");
466 t = _("You should try to fix it.");
469 s += _(" errors detected.");
470 t = _("You should try to fix them.");
472 WriteAlert(_("There were errors during the LaTeX run."), s, t);
478 int MenuBuildProg(Buffer *buffer)
482 if (buffer->isLiterate())
483 ret = buffer->buildProgram();
487 s = _("Wrong type of document");
488 t = _("The Build operation is not allowed in this document");
489 WriteAlert(_("There were errors during the Build process."), s, t);
497 s = _("One error detected");
498 t = _("You should try to fix it.");
501 s += _(" errors detected.");
502 t = _("You should try to fix them.");
504 WriteAlert(_("There were errors during the Build process."), s, t);
510 int MenuRunChktex(Buffer *buffer)
514 if (buffer->isSGML()) {
515 WriteAlert(_("Chktex does not work with SGML derived documents."));
518 ret = buffer->runChktex();
524 s = _("No warnings found.");
525 } else if (ret == 1) {
526 s = _("One warning found.");
527 t = _("Use 'Edit->Go to Error' to find it.");
530 s += _(" warnings found.");
531 t = _("Use 'Edit->Go to Error' to find them.");
533 WriteAlert(_("Chktex run successfully"), s, t);
535 WriteAlert(_("Error!"),_("It seems chktex does not work."));
541 int MakeDVIOutput(Buffer *buffer)
548 string path = OnlyPath(buffer->getFileName());
549 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
550 path = buffer->tmppath;
552 if (!buffer->isDviClean()) {
554 ret = MenuRunLaTeX(buffer);
560 /* wait == false means don't wait for termination */
561 /* wait == true means wait for termination */
562 // The bool should be placed last on the argument line. (Lgb)
563 // Returns false if we fail.
564 bool RunScript(Buffer *buffer, bool wait,
565 string const & command, string const & orgname = string(),
566 bool need_shell=true)
570 string name= orgname;
573 if (MakeDVIOutput(buffer) > 0)
575 /* get DVI-Filename */
577 name = ChangeExtension(buffer->getFileName(),
580 path = OnlyPath(name);
581 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
582 path = buffer->tmppath;
586 cmd = command + ' ' + SpaceLess(name);
594 // OS/2 cmd.exe has another use for '&'
596 // This is not NLS safe, but it's OK, I think.
597 string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
599 // COMSPEC is set, unless user unsets
600 sh = OnlyFilename(GetEnvPath("COMSPEC"));
605 if (sh.contains("cmd.exe") || sh.contains("4os2.exe"))
606 cmd = "start /min/n " + cmd;
611 // It seems that, if wait is false, we never get back
612 // the return code of the command. This means that all
613 // the code I added in PrintApplyCB is currently
616 #warning What should we do here?
618 minibuffer->Set(_("Executing command:"), cmd);
619 result = one.startscript(Systemcalls::System, cmd);
621 minibuffer->Set(_("Executing command:"), cmd);
622 result = one.startscript(wait ? Systemcalls::Wait
623 : Systemcalls::DontWait, cmd);
629 // Returns false if we fail
630 bool MenuRunDvips(Buffer *buffer, bool wait=false)
638 if (MakeDVIOutput(buffer) > 0) {
642 // Generate postscript file
643 string ps = ChangeExtension (buffer->getFileName(),
648 char real_papersize = buffer->params.papersize;
649 if (real_papersize == PAPER_DEFAULT)
650 real_papersize = lyxrc->default_papersize;
652 switch (real_papersize) {
668 case PAPER_EXECUTIVEPAPER:
671 case PAPER_LEGALPAPER:
674 default: /* If nothing else fits, keep an empty value... */
678 // Make postscript file.
679 string command = "dvips " + lyxrc->print_to_file + ' ';
680 command += SpaceLess(ps);
681 if (buffer->params.use_geometry
682 && buffer->params.papersize2 == VM_PAPER_CUSTOM
683 && !lyxrc->print_paper_dimension_flag.empty()
684 && !buffer->params.paperwidth.empty()
685 && !buffer->params.paperheight.empty()) {
686 // using a custom papersize
688 command += lyxrc->print_paper_dimension_flag + ' ';
689 command += buffer->params.paperwidth + ',';
690 command += buffer->params.paperheight;
691 } else if (!paper.empty()
692 && (real_papersize != PAPER_USLETTER ||
693 buffer->params.orientation == ORIENTATION_PORTRAIT)) {
694 // dvips won't accept -t letter -t landscape. In all other
695 // cases, include the paper size explicitly.
697 command += lyxrc->print_paper_flag + ' ' + paper;
699 if (buffer->params.orientation == ORIENTATION_LANDSCAPE) {
701 command += lyxrc->print_landscape_flag;
703 // push directorypath, if necessary
704 string path = OnlyPath(buffer->getFileName());
705 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
706 path = buffer->tmppath;
709 bool ret = RunScript(buffer, wait, command);
715 // Returns false if we fail
716 bool MenuPreviewPS(Buffer *buffer)
721 // Generate postscript file
722 if (!MenuRunDvips(buffer, true)) {
726 // Start postscript viewer
728 string ps = ChangeExtension (buffer->getFileName(),
730 // push directorypath, if necessary
731 string path = OnlyPath(buffer->getFileName());
732 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
733 path = buffer->tmppath;
736 bool ret = RunScript(buffer, false, lyxrc->view_ps_command, ps);
742 void MenuFax(Buffer *buffer)
747 // Generate postscript file
748 if (!MenuRunDvips(buffer, true)) {
753 string ps = ChangeExtension (buffer->getFileName(), ".ps_tmp", true);
754 string path = OnlyPath (buffer->getFileName());
755 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
756 path = buffer->tmppath;
759 if (!lyxrc->fax_program.empty()) {
760 string help2 = lyxrc->fax_program;
761 subst(help2, "$$FName",ps);
763 Systemcalls one(Systemcalls::System, help2);
765 send_fax(ps,lyxrc->fax_command);
769 // Returns false if we fail
770 bool MenuPreview(Buffer *buffer)
777 char real_papersize = buffer->params.papersize;
778 if (real_papersize == PAPER_DEFAULT)
779 real_papersize = lyxrc->default_papersize;
781 switch (real_papersize) {
797 case PAPER_EXECUTIVEPAPER:
800 case PAPER_LEGALPAPER:
803 default: /* If nothing else fits, keep the empty value */
808 if (buffer->params.orientation == ORIENTATION_LANDSCAPE)
809 // we HAVE to give a size when the page is in
810 // landscape, so use USletter.
811 paper = " -paper usr";
813 paper = " -paper " + paper;
814 if (buffer->params.orientation == ORIENTATION_LANDSCAPE)
818 // push directorypath, if necessary
819 string path = OnlyPath(buffer->getFileName());
820 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
821 path = buffer->tmppath;
825 string command = lyxrc->view_dvi_command + paper ;
826 bool ret = RunScript(buffer, false, command);
831 void MenuMakeLaTeX(Buffer *buffer)
834 // Get LaTeX-Filename
835 string s = SpaceLess(ChangeExtension(
836 buffer->getFileName(),
839 FilePtr myfile(s, FilePtr::read);
841 !AskQuestion(_("File already exists:"),
842 MakeDisplayPath(s,50),
843 _("Do you want to overwrite the file?"))) {
844 minibuffer->Set(_("Canceled"));
848 if (buffer->isDocBook())
849 minibuffer->Set(_("DocBook does not have a latex backend"));
851 if (buffer->isLinuxDoc())
852 RunLinuxDoc(0, buffer->getFileName());
854 buffer->makeLaTeXFile(s, string(), true);
855 minibuffer->Set(_("Nice LaTeX file saved as"),
857 buffer->markDviDirty();
863 void MenuMakeLinuxDoc(Buffer *buffer)
867 if (!buffer->isLinuxDoc()) {
868 WriteAlert(_("Error!"), _("Document class must be linuxdoc."));
872 // Get LinuxDoc-Filename
873 string s = ChangeExtension (buffer->getFileName(),
876 FilePtr myfile(s, FilePtr::read);
878 !AskQuestion(_("File already exists:"),
879 MakeDisplayPath(s,50),
880 _("Do you want to overwrite the file?"))) {
881 minibuffer->Set(_("Canceled"));
885 minibuffer->Set(_("Building LinuxDoc SGML file `"),
886 MakeDisplayPath(s), "'...");
888 buffer->makeLinuxDocFile(s, 65);
890 minibuffer->Set(_("LinuxDoc SGML file save as"),
896 void MenuMakeDocBook(Buffer *buffer)
900 if (!buffer->isDocBook()) {
901 WriteAlert(_("Error!"), _("Document class must be docbook."));
905 // Get DocBook-Filename
906 string s = ChangeExtension (buffer->getFileName(),
909 FilePtr myfile(s, FilePtr::read);
911 !AskQuestion(_("File already exists:"),
912 MakeDisplayPath(s,50),
913 _("Do you want to overwrite the file?"))) {
914 minibuffer->Set(_("Canceled"));
918 minibuffer->Set(_("Building DocBook SGML file `"),
919 MakeDisplayPath(s), "'...");
921 buffer->makeDocBookFile(s, 65);
923 minibuffer->Set(_("DocBook SGML file save as"),
929 void MenuMakeAscii(Buffer *buffer)
932 /* get LaTeX-Filename */
933 string s = ChangeExtension (buffer->getFileName(),
936 FilePtr myfile(s, FilePtr::read);
938 !AskQuestion(_("File already exists:"),
939 MakeDisplayPath(s,50),
940 _("Do you want to overwrite the file?"))) {
941 minibuffer->Set(_("Canceled"));
945 buffer->writeFileAscii(s, lyxrc->ascii_linelen);
947 minibuffer->Set(_("Ascii file saved as"), MakeDisplayPath(s));
952 void MenuPrint(Buffer *buffer)
959 input_file = ChangeExtension(buffer->getFileName(),
960 lyxrc->print_file_extension,
962 fl_set_input(fd_form_print->input_file, input_file.c_str());
964 if (fd_form_print->form_print->visible) {
965 fl_raise_form(fd_form_print->form_print);
968 fl_show_form(fd_form_print->form_print,
969 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
977 lyxerr.debug() << "Running QuitLyX." << endl;
979 if (!bufferlist.QwriteAll())
982 lastfiles->writeFile(lyxrc->lastfiles);
984 // Set a flag that we do quitting from the program,
985 // so no refreshes are necessary.
988 // close buffers first
989 bufferlist.closeAll();
991 // do any other cleanup procedures now
992 lyxerr.debug() << "Deleting tmp dir " << system_tempdir << endl;
994 DestroyLyXTmpDir(system_tempdir);
1002 // should probably be moved into BufferList (Lgb)
1003 // Perfect target for a thread...
1005 if (!current_view->getScreen() || !current_view->available())
1008 if (current_view->currentBuffer()->isBakClean()
1009 || current_view->currentBuffer()->isReadonly()) {
1010 // We don't save now, but we'll try again later
1011 current_view->getOwner()->resetAutosaveTimer();
1015 minibuffer->Set(_("Autosaving current document..."));
1017 // create autosave filename
1018 string fname = OnlyPath(current_view->currentBuffer()->getFileName());
1020 fname += OnlyFilename(current_view->currentBuffer()->getFileName());
1023 // tmp_ret will be located (usually) in /tmp
1024 // will that be a problem?
1025 string tmp_ret = tmpnam(0);
1027 pid_t pid = fork(); // If you want to debug the autosave
1028 // you should set pid to -1, and comment out the
1030 if (pid == 0 || pid == -1) {
1031 // pid = -1 signifies that lyx was unable
1032 // to fork. But we will do the save
1034 bool failed = false;
1035 if (!tmp_ret.empty()) {
1036 current_view->currentBuffer()->writeFile(tmp_ret, 1);
1037 // assume successful write of tmp_ret
1038 if (rename(tmp_ret.c_str(), fname.c_str()) == -1) {
1040 // most likely couldn't move between filesystems
1041 // unless write of tmp_ret failed
1042 // so remove tmp file (if it exists)
1043 remove(tmp_ret.c_str());
1050 // failed to write/rename tmp_ret so try writing direct
1051 if (!current_view->currentBuffer()->writeFile(fname,
1053 // It is dangerous to do this in the child,
1054 // but safe in the parent, so...
1056 minibuffer->Set(_("Autosave Failed!"));
1059 if (pid == 0) { // we are the child so...
1064 current_view->currentBuffer()->markBakClean();
1065 current_view->getOwner()->resetAutosaveTimer();
1070 // (c) CHT Software Service GmbH
1073 // create new file with template
1076 Buffer * NewLyxFile(string const & filename)
1078 // Split argument by :
1080 string tmpname=split(filename, name, ':');
1081 #ifdef __EMX__ // Fix me! lyx_cb.C may not be low level enough to allow this.
1082 if (name.length() == 1 && isalpha((unsigned char) name[0]) &&
1083 (tmpname.prefixIs("/") || tmpname.prefixIs("\\"))) {
1085 name += tmpname.token(':');
1086 tmpname =Â split(tmpname, ':');
1089 lyxerr.debug() << "Arg is " << filename
1090 << "\nName is " << name
1091 << "\nTemplate is " << tmpname << endl;
1093 // find a free buffer
1094 Buffer *tmpbuf = bufferlist.newFile(name,tmpname);
1096 lastfiles->newFile(tmpbuf->getFileName());
1101 // Insert ascii file (if filename is empty, prompt for one)
1102 void InsertAsciiFile(string const & f, bool asParagraph)
1105 LyXParagraph *tmppar;
1108 if (!current_view->getScreen()) return;
1110 if (fname.empty()) {
1112 fname = fileDlg.Select(_("File to Insert"),
1113 current_view->getOwner()->currentBuffer()->filepath,
1116 if (fname.empty()) return;
1120 FilePtr myfile(fname, FilePtr::read);
1122 if (!fi.exist() || !fi.readable() || !myfile()) {
1123 WriteFSAlert(_("Error! Cannot open specified file:"),
1124 MakeDisplayPath(fname,50));
1128 tmppar = new LyXParagraph();
1129 tmppar->readSimpleWholeFile(myfile);
1131 // set the end of the string
1132 tmppar->InsertChar(tmppar->last-1,'\0');
1134 // insert the string
1135 current_view->getScreen()->HideCursor();
1137 // clear the selection
1140 current_view->currentBuffer()->text->InsertStringA(tmppar->text);
1142 current_view->currentBuffer()->text->InsertStringB(tmppar->text);
1144 current_view->currentBuffer()->update(1);
1148 void MenuShowTableOfContents()
1151 if (fd_form_toc->form_toc->visible) {
1152 fl_raise_form(fd_form_toc->form_toc);
1154 fl_show_form(fd_form_toc->form_toc,
1155 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1156 _("Table Of Contents"));
1161 void MenuInsertLabel(const char *arg)
1165 //string label = fl_show_input(_("Enter new label to insert:"),"");
1167 label = frontStrip(strip(askForText(_("Enter new label to insert:"))));
1168 if (!label.empty()) {
1169 InsetLabel *new_inset = new InsetLabel;
1170 new_inset->setContents(label);
1171 current_view->currentBuffer()->insertInset(new_inset);
1177 void MenuInsertRef()
1180 if (fd_form_ref->form_ref->visible) {
1181 fl_raise_form(fd_form_ref->form_ref);
1183 fl_show_form(fd_form_ref->form_ref,
1184 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1185 _("Insert Reference"));
1190 void MenuPasteSelection(char at)
1192 if (!current_view->getScreen())
1197 Atom data_prop = XInternAtom(fl_display,
1200 if (data_prop == None)
1202 XConvertSelection(fl_display,
1203 XA_PRIMARY, XA_STRING, data_prop,
1204 fd_form_main->form_main->window, 0);
1209 void FootCB(FL_OBJECT*, long)
1211 if (!current_view->available())
1214 minibuffer->Set(_("Inserting Footnote..."));
1215 current_view->getScreen()->HideCursor();
1216 current_view->currentBuffer()->update(-2);
1217 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1218 current_view->currentBuffer()->update(1);
1222 void LayoutsCB(int sel, void *)
1224 string tmp = tostr(sel);
1225 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1231 * SGML Linuxdoc support:
1232 * (flag == -1) import SGML file
1233 * (flag == 0) make TeX output
1234 * (flag == 1) make dvi output
1236 int RunLinuxDoc(int flag, string const & filename)
1245 /* generate a path-less extension name */
1246 name = ChangeExtension (filename, ".sgml", true);
1247 path = OnlyPath (filename);
1248 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1249 path = current_view->currentBuffer()->tmppath;
1254 if (!current_view->available())
1256 current_view->currentBuffer()->makeLinuxDocFile(name,0);
1257 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1259 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1260 case PAPER_USLETTER: add_flags = "-p letter"; break;
1261 default: /* nothing to be done yet ;-) */ break;
1269 case -1: /* Import file */
1270 minibuffer->Set(_("Importing LinuxDoc SGML file `"),
1271 MakeDisplayPath(filename), "'...");
1272 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1274 if (one.startscript(Systemcalls::System, s2))
1277 case 0: /* TeX output asked */
1278 minibuffer->Set(_("Converting LinuxDoc SGML to TeX file..."));
1279 s2 = "sgml2latex " + add_flags + " -o tex "
1280 + lyxrc->sgml_extra_options + ' ' + name;
1281 if (one.startscript(Systemcalls::System, s2))
1284 case 1: /* dvi output asked */
1285 minibuffer->Set(_("Converting LinuxDoc SGML to dvi file..."));
1286 s2 = "sgml2latex " + add_flags + " -o dvi "
1287 + lyxrc->sgml_extra_options + ' ' + name;
1288 if (one.startscript(Systemcalls::System, s2)) {
1291 current_view->currentBuffer()->markDviClean();
1293 default: /* unknown output */
1299 current_view->currentBuffer()->redraw();
1305 * SGML DocBook support:
1306 * (flag == 1) make dvi output
1308 int RunDocBook(int flag, string const & filename)
1316 /* generate a path-less extension name */
1317 name = ChangeExtension (filename, ".sgml", true);
1318 path = OnlyPath (filename);
1319 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1320 path = current_view->currentBuffer()->tmppath;
1324 if (!current_view->available())
1327 current_view->currentBuffer()->makeDocBookFile(name,0);
1330 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1332 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1333 case PAPER_USLETTER: add_flags = "-p letter"; break;
1334 default: /* nothing to be done yet ;-) */ break;
1341 case 1: /* dvi output asked */
1342 minibuffer->Set(_("Converting DocBook SGML to dvi file..."));
1343 s2 = "sgmltools --backend dvi " + name;
1344 if (one.startscript(Systemcalls::System, s2)) {
1347 current_view->currentBuffer()->markDviClean();
1349 default: /* unknown output */
1355 current_view->currentBuffer()->redraw();
1360 void AllFloats(char flag, char figmar)
1362 if (!current_view->available())
1365 LyXCursor cursor = current_view->currentBuffer()->text->cursor;
1367 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1369 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1370 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1372 && cursor.par->footnotekind != LyXParagraph::FIG
1373 && cursor.par->footnotekind != LyXParagraph::TAB
1374 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1375 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1376 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1381 LyXCursor tmpcursor = cursor;
1382 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1383 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1385 LyXParagraph *par = current_view->currentBuffer()->paragraph;
1388 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1392 par->footnotekind != LyXParagraph::FOOTNOTE
1394 par->footnotekind != LyXParagraph::MARGIN
1399 par->footnotekind != LyXParagraph::FIG
1401 par->footnotekind != LyXParagraph::TAB
1403 par->footnotekind != LyXParagraph::WIDE_FIG
1405 par->footnotekind != LyXParagraph::WIDE_TAB
1407 par->footnotekind != LyXParagraph::ALGORITHM
1412 && par->previous->footnoteflag !=
1413 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1414 current_view->currentBuffer()->text->SetCursorIntern(par->previous,
1416 current_view->currentBuffer()->text->OpenFootnote();
1421 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1425 par->footnotekind != LyXParagraph::FOOTNOTE
1427 par->footnotekind != LyXParagraph::MARGIN
1432 par->footnotekind != LyXParagraph::FIG
1434 par->footnotekind != LyXParagraph::TAB
1436 par->footnotekind != LyXParagraph::WIDE_FIG
1438 par->footnotekind != LyXParagraph::WIDE_TAB
1440 par->footnotekind != LyXParagraph::ALGORITHM
1444 current_view->currentBuffer()->text->SetCursorIntern(par, 0);
1445 current_view->currentBuffer()->text->CloseFootnote();
1451 current_view->currentBuffer()->text->SetCursorIntern(cursor.par, cursor.pos);
1452 current_view->redraw();
1453 current_view->fitCursor();
1454 current_view->updateScrollbar();
1458 void MenuLayoutCharacter()
1460 if (fd_form_character->form_character->visible) {
1461 fl_raise_form(fd_form_character->form_character);
1463 fl_show_form(fd_form_character->form_character,
1464 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
1465 _("Character Style"));
1470 inline void DeactivateParagraphButtons ()
1472 fl_deactivate_object (fd_form_paragraph->button_ok);
1473 fl_deactivate_object (fd_form_paragraph->button_apply);
1474 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1475 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1478 inline void ActivateParagraphButtons ()
1480 fl_activate_object (fd_form_paragraph->button_ok);
1481 fl_activate_object (fd_form_paragraph->button_apply);
1482 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1483 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1486 inline void DisableParagraphLayout ()
1488 DeactivateParagraphButtons();
1489 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1490 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1491 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1492 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1493 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1494 fl_deactivate_object (fd_form_paragraph->check_noindent);
1495 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1496 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1497 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1498 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1499 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1500 fl_deactivate_object (fd_form_paragraph->input_space_above);
1501 fl_deactivate_object (fd_form_paragraph->input_space_below);
1502 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1503 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1504 fl_deactivate_object (fd_form_paragraph->check_space_above);
1505 fl_deactivate_object (fd_form_paragraph->check_space_below);
1508 inline void EnableParagraphLayout ()
1510 ActivateParagraphButtons();
1511 fl_activate_object (fd_form_paragraph->input_labelwidth);
1512 fl_activate_object (fd_form_paragraph->check_lines_top);
1513 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1514 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1515 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1516 fl_activate_object (fd_form_paragraph->check_noindent);
1517 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1518 fl_activate_object (fd_form_paragraph->radio_align_right);
1519 fl_activate_object (fd_form_paragraph->radio_align_left);
1520 fl_activate_object (fd_form_paragraph->radio_align_block);
1521 fl_activate_object (fd_form_paragraph->radio_align_center);
1522 fl_activate_object (fd_form_paragraph->input_space_above);
1523 fl_activate_object (fd_form_paragraph->input_space_below);
1524 fl_activate_object (fd_form_paragraph->choice_space_above);
1525 fl_activate_object (fd_form_paragraph->choice_space_below);
1526 fl_activate_object (fd_form_paragraph->check_space_above);
1527 fl_activate_object (fd_form_paragraph->check_space_below);
1530 bool UpdateLayoutParagraph()
1532 if (!current_view->getScreen() || !current_view->available()) {
1533 if (fd_form_paragraph->form_paragraph->visible)
1534 fl_hide_form(fd_form_paragraph->form_paragraph);
1538 Buffer * buf = current_view->currentBuffer();
1540 fl_set_input(fd_form_paragraph->input_labelwidth,
1541 buf->text->cursor.par->GetLabelWidthString().c_str());
1542 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1543 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1544 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1545 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1547 int align = buf->text->cursor.par->GetAlign();
1548 if (align == LYX_ALIGN_LAYOUT)
1549 align = lyxstyle.Style(buf->params.textclass,
1550 buf->text->cursor.par->GetLayout())->align;
1553 case LYX_ALIGN_RIGHT:
1554 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1556 case LYX_ALIGN_LEFT:
1557 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1559 case LYX_ALIGN_CENTER:
1560 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1563 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1567 fl_set_button(fd_form_paragraph->check_lines_top,
1568 buf->text->cursor.par->FirstPhysicalPar()->line_top);
1569 fl_set_button(fd_form_paragraph->check_lines_bottom,
1570 buf->text->cursor.par->FirstPhysicalPar()->line_bottom);
1571 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1572 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1573 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1574 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1575 fl_set_button(fd_form_paragraph->check_noindent,
1576 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1577 fl_set_input (fd_form_paragraph->input_space_above, "");
1579 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1581 fl_set_choice (fd_form_paragraph->choice_space_above,
1584 case VSpace::DEFSKIP:
1585 fl_set_choice (fd_form_paragraph->choice_space_above,
1588 case VSpace::SMALLSKIP:
1589 fl_set_choice (fd_form_paragraph->choice_space_above,
1592 case VSpace::MEDSKIP:
1593 fl_set_choice (fd_form_paragraph->choice_space_above,
1596 case VSpace::BIGSKIP:
1597 fl_set_choice (fd_form_paragraph->choice_space_above,
1601 fl_set_choice (fd_form_paragraph->choice_space_above,
1604 case VSpace::LENGTH:
1605 fl_set_choice (fd_form_paragraph->choice_space_above,
1607 fl_set_input (fd_form_paragraph->input_space_above,
1608 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1611 fl_set_button (fd_form_paragraph->check_space_above,
1612 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1613 fl_set_input (fd_form_paragraph->input_space_below, "");
1614 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1616 fl_set_choice (fd_form_paragraph->choice_space_below,
1619 case VSpace::DEFSKIP:
1620 fl_set_choice (fd_form_paragraph->choice_space_below,
1623 case VSpace::SMALLSKIP:
1624 fl_set_choice (fd_form_paragraph->choice_space_below,
1627 case VSpace::MEDSKIP:
1628 fl_set_choice (fd_form_paragraph->choice_space_below,
1631 case VSpace::BIGSKIP:
1632 fl_set_choice (fd_form_paragraph->choice_space_below,
1636 fl_set_choice (fd_form_paragraph->choice_space_below,
1639 case VSpace::LENGTH:
1640 fl_set_choice (fd_form_paragraph->choice_space_below,
1642 fl_set_input (fd_form_paragraph->input_space_below,
1643 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1646 fl_set_button (fd_form_paragraph->check_space_below,
1647 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1649 fl_set_button(fd_form_paragraph->check_noindent,
1650 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1652 if (current_view->currentBuffer()->isReadonly()) {
1653 DisableParagraphLayout();
1655 EnableParagraphLayout();
1660 void MenuLayoutParagraph()
1662 if (UpdateLayoutParagraph()) {
1663 if (fd_form_paragraph->form_paragraph->visible) {
1664 fl_raise_form(fd_form_paragraph->form_paragraph);
1666 fl_show_form(fd_form_paragraph->form_paragraph,
1667 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
1668 _("Paragraph Environment"));
1675 void DeactivateDocumentButtons ()
1677 fl_deactivate_object (fd_form_document->button_ok);
1678 fl_deactivate_object (fd_form_document->button_apply);
1679 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1680 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1685 void ActivateDocumentButtons ()
1687 fl_activate_object (fd_form_document->button_ok);
1688 fl_activate_object (fd_form_document->button_apply);
1689 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1690 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1694 void DisableDocumentLayout ()
1696 DeactivateDocumentButtons ();
1697 fl_deactivate_object (fd_form_document->group_radio_separation);
1698 fl_deactivate_object (fd_form_document->radio_indent);
1699 fl_deactivate_object (fd_form_document->radio_skip);
1700 fl_deactivate_object (fd_form_document->choice_class);
1701 fl_deactivate_object (fd_form_document->choice_pagestyle);
1702 fl_deactivate_object (fd_form_document->choice_fonts);
1703 fl_deactivate_object (fd_form_document->choice_fontsize);
1704 fl_deactivate_object (fd_form_document->input_float_placement);
1705 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1706 fl_deactivate_object (fd_form_document->choice_inputenc);
1707 fl_deactivate_object (fd_form_document->group_radio_sides);
1708 fl_deactivate_object (fd_form_document->radio_sides_one);
1709 fl_deactivate_object (fd_form_document->radio_sides_two);
1710 fl_deactivate_object (fd_form_document->group_radio_columns);
1711 fl_deactivate_object (fd_form_document->radio_columns_one);
1712 fl_deactivate_object (fd_form_document->radio_columns_two);
1713 fl_deactivate_object (fd_form_document->input_extra);
1714 fl_deactivate_object (fd_form_document->choice_language);
1715 combo_language->deactivate();
1716 fl_deactivate_object (fd_form_document->input_default_skip);
1717 fl_deactivate_object (fd_form_document->choice_default_skip);
1718 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1719 fl_deactivate_object (fd_form_document->slider_tocdepth);
1720 fl_deactivate_object (fd_form_document->choice_spacing);
1721 fl_deactivate_object (fd_form_document->input_spacing);
1722 fl_deactivate_object (fd_form_document->check_use_amsmath);
1726 void EnableDocumentLayout ()
1728 ActivateDocumentButtons ();
1729 fl_activate_object (fd_form_document->group_radio_separation);
1730 fl_activate_object (fd_form_document->radio_indent);
1731 fl_activate_object (fd_form_document->radio_skip);
1732 fl_activate_object (fd_form_document->choice_class);
1733 fl_activate_object (fd_form_document->choice_pagestyle);
1734 fl_activate_object (fd_form_document->choice_fonts);
1735 fl_activate_object (fd_form_document->choice_fontsize);
1736 fl_activate_object (fd_form_document->input_float_placement);
1737 fl_activate_object (fd_form_document->choice_postscript_driver);
1738 fl_activate_object (fd_form_document->choice_inputenc);
1739 fl_activate_object (fd_form_document->group_radio_sides);
1740 fl_activate_object (fd_form_document->radio_sides_one);
1741 fl_activate_object (fd_form_document->radio_sides_two);
1742 fl_activate_object (fd_form_document->group_radio_columns);
1743 fl_activate_object (fd_form_document->radio_columns_one);
1744 fl_activate_object (fd_form_document->radio_columns_two);
1745 fl_activate_object (fd_form_document->input_extra);
1746 fl_activate_object (fd_form_document->choice_language);
1747 combo_language->activate();
1748 fl_activate_object (fd_form_document->input_default_skip);
1749 fl_activate_object (fd_form_document->choice_default_skip);
1750 fl_activate_object (fd_form_document->slider_secnumdepth);
1751 fl_activate_object (fd_form_document->slider_tocdepth);
1752 fl_activate_object (fd_form_document->choice_spacing);
1753 fl_activate_object (fd_form_document->input_spacing);
1754 fl_activate_object (fd_form_document->check_use_amsmath);
1757 bool UpdateLayoutDocument(BufferParams *params)
1759 if (!current_view->getScreen() || !current_view->available()) {
1760 if (fd_form_document->form_document->visible)
1761 fl_hide_form(fd_form_document->form_document);
1766 params = ¤t_view->currentBuffer()->params;
1767 LyXTextClass *tclass = lyxstyle.TextClass(params->textclass);
1769 fl_set_choice_text(fd_form_document->choice_class,
1770 lyxstyle.DescOfClass(params->textclass).c_str());
1771 combo_language->select_text(params->language.c_str());
1773 fl_set_choice_text(fd_form_document->choice_fonts,
1774 params->fonts.c_str());
1775 fl_set_choice_text(fd_form_document->choice_inputenc,
1776 params->inputenc.c_str());
1777 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1778 params->graphicsDriver.c_str());
1780 // ale970405+lasgoutt970513
1781 fl_clear_choice(fd_form_document->choice_fontsize);
1782 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1783 fl_addto_choice(fd_form_document->choice_fontsize,
1784 tclass->opt_fontsize.c_str());
1785 fl_set_choice(fd_form_document->choice_fontsize,
1786 tokenPos(tclass->opt_fontsize, '|', params->fontsize) + 2);
1788 // ale970405+lasgoutt970513
1789 fl_clear_choice(fd_form_document->choice_pagestyle);
1790 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1791 fl_addto_choice(fd_form_document->choice_pagestyle,
1792 tclass->opt_pagestyle.c_str());
1794 fl_set_choice(fd_form_document->choice_pagestyle,
1795 tokenPos(tclass->opt_pagestyle, '|', params->pagestyle) + 2);
1797 fl_set_button(fd_form_document->radio_indent, 0);
1798 fl_set_button(fd_form_document->radio_skip, 0);
1801 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1803 if (params->paragraph_separation == LYX_PARSEP_INDENT)
1804 fl_set_button(fd_form_document->radio_indent, 1);
1806 fl_set_button(fd_form_document->radio_skip, 1);
1808 switch (params->getDefSkip().kind()) {
1809 case VSpace::SMALLSKIP:
1810 fl_set_choice (fd_form_document->choice_default_skip, 1);
1812 case VSpace::MEDSKIP:
1813 fl_set_choice (fd_form_document->choice_default_skip, 2);
1815 case VSpace::BIGSKIP:
1816 fl_set_choice (fd_form_document->choice_default_skip, 3);
1818 case VSpace::LENGTH:
1819 fl_set_choice (fd_form_document->choice_default_skip, 4);
1820 fl_set_input (fd_form_document->input_default_skip,
1821 params->getDefSkip().asLyXCommand().c_str());
1824 fl_set_choice (fd_form_document->choice_default_skip, 2);
1828 fl_set_button(fd_form_document->radio_sides_one, 0);
1829 fl_set_button(fd_form_document->radio_sides_two, 0);
1831 if (params->sides == 2)
1832 fl_set_button(fd_form_document->radio_sides_two, 1);
1834 fl_set_button(fd_form_document->radio_sides_one, 1);
1836 fl_set_button(fd_form_document->radio_columns_one, 0);
1837 fl_set_button(fd_form_document->radio_columns_two, 0);
1839 if (params->columns == 2)
1840 fl_set_button(fd_form_document->radio_columns_two, 1);
1842 fl_set_button(fd_form_document->radio_columns_one, 1);
1844 fl_set_input(fd_form_document->input_spacing, "");
1845 switch (params->spacing.getSpace()) {
1846 case Spacing::Single:
1849 fl_set_choice(fd_form_document->choice_spacing, 1);
1852 case Spacing::Onehalf:
1855 fl_set_choice(fd_form_document->choice_spacing, 2);
1858 case Spacing::Double:
1861 fl_set_choice(fd_form_document->choice_spacing, 3);
1864 case Spacing::Other:
1866 fl_set_choice(fd_form_document->choice_spacing, 4);
1868 sprintf(sval,"%g",params->spacing.getValue());
1869 fl_set_input(fd_form_document->input_spacing, sval);
1875 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1876 params->secnumdepth);
1877 fl_set_counter_value(fd_form_document->slider_tocdepth,
1879 if (!params->float_placement.empty()) { // buffer local (Lgb)
1880 fl_set_input(fd_form_document->input_float_placement,
1881 params->float_placement.c_str());
1883 fl_set_input(fd_form_document->input_float_placement, "");
1885 if (!params->options.empty())
1886 fl_set_input(fd_form_document->input_extra,
1887 params->options.c_str());
1889 fl_set_input(fd_form_document->input_extra, "");
1891 if (current_view->currentBuffer()->isSGML()) {
1892 // bullets not used in SGML derived documents
1893 fl_deactivate_object(fd_form_document->button_bullets);
1894 fl_set_object_lcol(fd_form_document->button_bullets,
1897 fl_activate_object(fd_form_document->button_bullets);
1898 fl_set_object_lcol(fd_form_document->button_bullets,
1902 if (current_view->currentBuffer()->isReadonly()) {
1903 DisableDocumentLayout();
1905 EnableDocumentLayout();
1911 void MenuLayoutDocument()
1913 if (UpdateLayoutDocument()) {
1914 if (fd_form_document->form_document->visible) {
1915 fl_raise_form(fd_form_document->form_document);
1917 fl_show_form(fd_form_document->form_document,
1918 FL_PLACE_MOUSE | FL_FREE_SIZE,
1920 _("Document Layout"));
1926 bool UpdateLayoutQuotes()
1929 if (!current_view->getScreen()
1930 || !current_view->available()
1931 || current_view->currentBuffer()->isReadonly())
1935 fl_set_choice(fd_form_quotes->choice_quotes_language,
1936 current_view->currentBuffer()->params.quotes_language + 1);
1937 fl_set_button(fd_form_quotes->radio_single, 0);
1938 fl_set_button(fd_form_quotes->radio_double, 0);
1940 if (current_view->currentBuffer()->params.quotes_times == InsetQuotes::SingleQ)
1941 fl_set_button(fd_form_quotes->radio_single, 1);
1943 fl_set_button(fd_form_quotes->radio_double, 1);
1944 } else if (fd_form_quotes->form_quotes->visible) {
1945 fl_hide_form(fd_form_quotes->form_quotes);
1950 void MenuLayoutQuotes()
1952 if (UpdateLayoutQuotes()) {
1953 if (fd_form_quotes->form_quotes->visible) {
1954 fl_raise_form(fd_form_quotes->form_quotes);
1956 fl_show_form(fd_form_quotes->form_quotes,
1957 FL_PLACE_MOUSE | FL_FREE_SIZE,
1965 bool UpdateLayoutPreamble()
1968 if (!current_view->getScreen() || ! current_view->available())
1972 fl_set_input(fd_form_preamble->input_preamble,
1973 current_view->currentBuffer()->params.preamble.c_str());
1975 if (current_view->currentBuffer()->isReadonly()) {
1976 fl_deactivate_object(fd_form_preamble->input_preamble);
1977 fl_deactivate_object(fd_form_preamble->button_ok);
1978 fl_deactivate_object(fd_form_preamble->button_apply);
1979 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
1980 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
1983 fl_activate_object(fd_form_preamble->input_preamble);
1984 fl_activate_object(fd_form_preamble->button_ok);
1985 fl_activate_object(fd_form_preamble->button_apply);
1986 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
1987 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
1989 } else if (fd_form_preamble->form_preamble->visible) {
1990 fl_hide_form(fd_form_preamble->form_preamble);
1995 void MenuLayoutPreamble()
1997 if (UpdateLayoutPreamble()) {
1998 if (fd_form_preamble->form_preamble->visible) {
1999 fl_raise_form(fd_form_preamble->form_preamble);
2001 fl_show_form(fd_form_preamble->form_preamble,
2002 FL_PLACE_MOUSE | FL_FREE_SIZE,
2004 _("LaTeX Preamble"));
2009 void MenuLayoutSave()
2011 if (!current_view->getScreen() || ! current_view->available())
2014 if (AskQuestion(_("Do you want to save the current settings"),
2015 _("for Character, Document, Paper and Quotes"),
2016 _("as default for new documents?")))
2017 current_view->currentBuffer()->saveParamsAsDefaults();
2023 InsetInfo *new_inset = new InsetInfo();
2024 current_view->currentBuffer()->insertInset(new_inset);
2025 new_inset->Edit(0,0);
2026 //current_view->currentBuffer()->update(-1);
2032 if (current_view->available()) {
2033 minibuffer->Set(_("Open/Close..."));
2034 current_view->getScreen()->HideCursor();
2036 current_view->currentBuffer()->update(-2);
2037 current_view->currentBuffer()->text->OpenStuff();
2038 current_view->currentBuffer()->update(0);
2044 if (current_view->available()) {
2045 minibuffer->Set(_("Open/Close..."));
2046 current_view->getScreen()->HideCursor();
2048 current_view->currentBuffer()->update(-2);
2049 current_view->currentBuffer()->text->ToggleFootnote();
2050 current_view->currentBuffer()->update(0);
2057 /* if (current_view->currentBuffer()->the_locking_inset) {
2058 minibuffer->Set(_("Undo not yet supported in math mode"));
2062 if (current_view->available()) {
2063 minibuffer->Set(_("Undo"));
2064 current_view->getScreen()->HideCursor();
2066 current_view->currentBuffer()->update(-2);
2067 if (!current_view->currentBuffer()->text->TextUndo())
2068 minibuffer->Set(_("No further undo information"));
2070 current_view->currentBuffer()->update(-1);
2077 if (current_view->currentBuffer()->the_locking_inset) {
2078 minibuffer->Set(_("Redo not yet supported in math mode"));
2082 if (current_view->available()) {
2083 minibuffer->Set(_("Redo"));
2084 current_view->getScreen()->HideCursor();
2086 current_view->currentBuffer()->update(-2);
2087 if (!current_view->currentBuffer()->text->TextRedo())
2088 minibuffer->Set(_("No further redo information"));
2090 current_view->currentBuffer()->update(-1);
2095 void HyphenationPoint()
2097 if (current_view->available()) {
2098 current_view->getScreen()->HideCursor();
2099 current_view->currentBuffer()->update(-2);
2100 InsetSpecialChar *new_inset =
2101 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2102 current_view->currentBuffer()->insertInset(new_inset);
2103 //current_view->currentBuffer()->update(-1);
2110 if (current_view->available()) {
2111 current_view->getScreen()->HideCursor();
2112 current_view->currentBuffer()->update(-2);
2113 InsetSpecialChar *new_inset =
2114 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2115 current_view->currentBuffer()->insertInset(new_inset);
2120 void EndOfSentenceDot()
2122 if (current_view->available()) {
2123 current_view->getScreen()->HideCursor();
2124 current_view->currentBuffer()->update(-2);
2125 InsetSpecialChar *new_inset =
2126 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2127 current_view->currentBuffer()->insertInset(new_inset);
2132 void MenuSeparator()
2134 if (current_view->available()) {
2135 current_view->getScreen()->HideCursor();
2136 current_view->currentBuffer()->update(-2);
2137 InsetSpecialChar *new_inset =
2138 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2139 current_view->currentBuffer()->insertInset(new_inset);
2140 //current_view->currentBuffer()->update(-1);
2147 if (current_view->available()) {
2148 current_view->getScreen()->HideCursor();
2149 current_view->currentBuffer()->update(-2);
2150 current_view->currentBuffer()->text->InsertChar(LYX_META_NEWLINE);
2151 current_view->currentBuffer()->update(-1);
2156 void ProtectedBlank()
2158 if (current_view->available()) {
2159 current_view->getScreen()->HideCursor();
2160 current_view->currentBuffer()->update(-2);
2161 current_view->currentBuffer()->text->InsertChar(LYX_META_PROTECTED_SEPARATOR);
2162 current_view->currentBuffer()->update(-1);
2169 if (current_view->available()) {
2170 current_view->getScreen()->HideCursor();
2171 current_view->currentBuffer()->update(-2);
2172 current_view->currentBuffer()->text->InsertChar(LYX_META_HFILL);
2173 current_view->currentBuffer()->update(-1);
2178 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2179 They also show the current font state. */
2182 void ToggleAndShow(LyXFont const &);
2185 void FontSizeCB(string const & size)
2187 LyXFont font(LyXFont::ALL_IGNORE);
2188 font.setGUISize(size);
2189 ToggleAndShow(font);
2195 LyXFont font(LyXFont::ALL_IGNORE);
2196 font.setEmph(LyXFont::TOGGLE);
2197 ToggleAndShow(font);
2203 LyXFont font(LyXFont::ALL_IGNORE);
2204 font.setNoun(LyXFont::TOGGLE);
2205 ToggleAndShow(font);
2211 LyXFont font(LyXFont::ALL_IGNORE);
2212 font.setSeries(LyXFont::BOLD_SERIES);
2213 ToggleAndShow(font);
2219 LyXFont font(LyXFont::ALL_IGNORE);
2220 font.setUnderbar(LyXFont::TOGGLE);
2221 ToggleAndShow(font);
2227 LyXFont font(LyXFont::ALL_IGNORE);
2228 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2229 ToggleAndShow(font);
2235 LyXFont font(LyXFont::ALL_IGNORE);
2236 font.setFamily(LyXFont::SANS_FAMILY);
2237 ToggleAndShow(font);
2243 LyXFont font(LyXFont::ALL_IGNORE);
2244 font.setFamily(LyXFont::ROMAN_FAMILY);
2245 ToggleAndShow(font);
2251 LyXFont font(LyXFont::ALL_IGNORE);
2252 font.setLatex (LyXFont::TOGGLE);
2253 ToggleAndShow(font);
2259 LyXFont font(LyXFont::ALL_INHERIT);
2260 ToggleAndShow(font);
2264 /* -------> Returns the current font and depth by printing a message. In the
2265 * future perhaps we could try to implement a callback to the button-bar.
2266 * That is, `light' the bold button when the font is currently bold, etc.
2268 string CurrentState()
2271 if (current_view->available()) {
2272 // I think we should only show changes from the default
2274 Buffer * buffer = current_view->currentBuffer();
2275 LyXFont font = buffer->text->real_current_font;
2276 LyXFont defaultfont = lyxstyle.TextClass(buffer->
2277 params.textclass)->defaultfont;
2278 font.reduce(defaultfont);
2279 state = _("Font: ") + font.stateText();
2281 int depth = buffer->text->GetDepth();
2283 state += string(_(", Depth: ")) + tostr(depth);
2289 /* -------> Does the actual toggle job of the XxxCB() calls above.
2290 * Also shows the current font state.
2293 void ToggleAndShow(LyXFont const & font)
2295 if (current_view->available()) {
2296 current_view->getScreen()->HideCursor();
2297 current_view->currentBuffer()->update(-2);
2298 current_view->currentBuffer()->text->ToggleFree(font, toggleall);
2299 current_view->currentBuffer()->update(1);
2301 // removed since it overrides the ToggleFree Message about the style
2302 // Since Styles are more "High Level" than raw fonts I think the user
2303 // prefers it like this Matthias
2304 // FontStateShowCB( 0, 0 );
2308 void MarginCB(FL_OBJECT *, long)
2310 if (current_view->available()) {
2311 minibuffer->Set(_("Inserting margin note..."));
2312 current_view->getScreen()->HideCursor();
2313 current_view->currentBuffer()->update(-2);
2314 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2315 current_view->currentBuffer()->update(1);
2320 void FigureCB(FL_OBJECT *, long)
2322 if (fd_form_figure->form_figure->visible) {
2323 fl_raise_form(fd_form_figure->form_figure);
2325 fl_show_form(fd_form_figure->form_figure,
2326 FL_PLACE_MOUSE, FL_FULLBORDER,
2327 _("Insert Figure"));
2332 void TableCB(FL_OBJECT *, long)
2334 if (fd_form_table->form_table->visible) {
2335 fl_raise_form(fd_form_table->form_table);
2337 fl_show_form(fd_form_table->form_table,
2338 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
2344 void CopyEnvironmentCB()
2346 if (current_view->available()) {
2347 current_view->currentBuffer()->text->copyEnvironmentType();
2348 /* clear the selection, even if mark_set */
2349 current_view->getScreen()->ToggleSelection();
2350 current_view->currentBuffer()->text->ClearSelection();
2351 current_view->currentBuffer()->update(-2);
2352 minibuffer->Set(_("Paragraph environment type copied"));
2357 void PasteEnvironmentCB()
2359 if (current_view->available()) {
2360 current_view->currentBuffer()->text->pasteEnvironmentType();
2361 minibuffer->Set(_("Paragraph environment type set"));
2362 current_view->currentBuffer()->update(1);
2369 if (current_view->available()) {
2370 current_view->currentBuffer()->text->CopySelection();
2371 /* clear the selection, even if mark_set */
2372 current_view->getScreen()->ToggleSelection();
2373 current_view->currentBuffer()->text->ClearSelection();
2374 current_view->currentBuffer()->update(-2);
2375 minibuffer->Set(_("Copy"));
2382 if (current_view->available()) {
2383 current_view->getScreen()->HideCursor();
2384 current_view->currentBuffer()->update(-2);
2385 current_view->currentBuffer()->text->CutSelection();
2386 current_view->currentBuffer()->update(1);
2387 minibuffer->Set(_("Cut"));
2394 if (!current_view->available()) return;
2396 minibuffer->Set(_("Paste"));
2397 current_view->getScreen()->HideCursor();
2398 /* clear the selection */
2399 current_view->getScreen()->ToggleSelection();
2400 current_view->currentBuffer()->text->ClearSelection();
2401 current_view->currentBuffer()->update(-2);
2404 current_view->currentBuffer()->text->PasteSelection();
2405 current_view->currentBuffer()->update(1);
2407 /* clear the selection */
2408 current_view->getScreen()->ToggleSelection();
2409 current_view->currentBuffer()->text->ClearSelection();
2410 current_view->currentBuffer()->update(-2);
2414 void MeltCB(FL_OBJECT *, long)
2416 if (!current_view->available()) return;
2418 minibuffer->Set(_("Melt"));
2419 current_view->getScreen()->HideCursor();
2421 current_view->currentBuffer()->update(-2);
2422 current_view->currentBuffer()->text->MeltFootnoteEnvironment();
2423 current_view->currentBuffer()->update(1);
2427 // Change environment depth.
2428 // if decInc == 0, depth change taking mouse button number into account
2429 // if decInc == 1, increment depth
2430 // if decInc == -1, decrement depth
2431 void DepthCB(FL_OBJECT *ob, long decInc)
2435 /* When decInc != 0, fake a mouse button. This allows us to
2436 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2437 /* check out wether ob is defined, too (Matthias) */
2440 else if (!decInc && ob) {
2441 button = fl_get_button_numb(ob);
2444 if (current_view->available()) {
2445 current_view->getScreen()->HideCursor();
2446 current_view->currentBuffer()->update(-2);
2448 current_view->currentBuffer()->text->IncDepth();
2450 current_view->currentBuffer()->text->DecDepth();
2451 current_view->currentBuffer()->update(1);
2452 minibuffer->Set(_("Changed environment depth"
2453 " (in possible range, maybe not)"));
2458 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2459 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2460 LyXFont UserFreeFont()
2462 LyXFont font(LyXFont::ALL_IGNORE);
2465 pos = fl_get_choice(fd_form_character->choice_family);
2467 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2468 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2469 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2470 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2471 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2474 pos = fl_get_choice(fd_form_character->choice_series);
2476 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2477 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2478 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2479 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2482 pos = fl_get_choice(fd_form_character->choice_shape);
2484 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2485 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2486 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2487 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2488 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2489 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2492 pos = fl_get_choice(fd_form_character->choice_size);
2494 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2495 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2496 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2497 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2498 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2499 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2500 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2501 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2502 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2503 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2504 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2505 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2506 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2507 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2510 pos = fl_get_choice(fd_form_character->choice_bar);
2512 case 1: font.setEmph(LyXFont::IGNORE);
2513 font.setUnderbar(LyXFont::IGNORE);
2514 font.setNoun(LyXFont::IGNORE);
2515 font.setLatex(LyXFont::IGNORE);
2517 case 2: font.setEmph(LyXFont::TOGGLE); break;
2518 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2519 case 4: font.setNoun(LyXFont::TOGGLE); break;
2520 case 5: font.setLatex(LyXFont::TOGGLE); break;
2521 case 6: font.setEmph(LyXFont::INHERIT);
2522 font.setUnderbar(LyXFont::INHERIT);
2523 font.setNoun(LyXFont::INHERIT);
2524 font.setLatex(LyXFont::INHERIT);
2528 pos = fl_get_choice(fd_form_character->choice_color);
2530 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2531 case 2: font.setColor(LyXFont::NONE); break;
2532 case 3: font.setColor(LyXFont::BLACK); break;
2533 case 4: font.setColor(LyXFont::WHITE); break;
2534 case 5: font.setColor(LyXFont::RED); break;
2535 case 6: font.setColor(LyXFont::GREEN); break;
2536 case 7: font.setColor(LyXFont::BLUE); break;
2537 case 8: font.setColor(LyXFont::CYAN); break;
2538 case 9: font.setColor(LyXFont::MAGENTA); break;
2539 case 10: font.setColor(LyXFont::YELLOW); break;
2540 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2549 ToggleAndShow(UserFreeFont());
2553 /* callbacks for form form_title */
2554 void TimerCB(FL_OBJECT *, long)
2556 // only if the form still exists
2557 if (fd_form_title->form_title != 0) {
2558 if (fd_form_title->form_title->visible) {
2559 fl_hide_form(fd_form_title->form_title);
2561 fl_free_form(fd_form_title->form_title);
2562 fd_form_title->form_title = 0;
2567 /* callbacks for form form_paragraph */
2569 void ParagraphVSpaceCB(FL_OBJECT* obj, long )
2571 // "Synchronize" the choices and input fields, making it
2572 // impossible to commit senseless data.
2574 const FD_form_paragraph* fp = fd_form_paragraph;
2576 if (obj == fp->choice_space_above) {
2577 if (fl_get_choice (fp->choice_space_above) != 7) {
2578 fl_set_input (fp->input_space_above, "");
2579 ActivateParagraphButtons();
2581 } else if (obj == fp->choice_space_below) {
2582 if (fl_get_choice (fp->choice_space_below) != 7) {
2583 fl_set_input (fp->input_space_below, "");
2584 ActivateParagraphButtons();
2586 } else if (obj == fp->input_space_above) {
2587 string input = fl_get_input (fp->input_space_above);
2589 if (input.empty()) {
2590 fl_set_choice (fp->choice_space_above, 1);
2591 ActivateParagraphButtons();
2593 else if (isValidGlueLength (input)) {
2594 fl_set_choice (fp->choice_space_above, 7);
2595 ActivateParagraphButtons();
2598 fl_set_choice (fp->choice_space_above, 7);
2599 DeactivateParagraphButtons();
2601 } else if (obj == fp->input_space_below) {
2602 string input = fl_get_input (fp->input_space_below);
2604 if (input.empty()) {
2605 fl_set_choice (fp->choice_space_below, 1);
2606 ActivateParagraphButtons();
2608 else if (isValidGlueLength (input)) {
2609 fl_set_choice (fp->choice_space_below, 7);
2610 ActivateParagraphButtons();
2613 fl_set_choice (fp->choice_space_below, 7);
2614 DeactivateParagraphButtons();
2620 void ParagraphApplyCB(FL_OBJECT *, long)
2622 if (!current_view->available())
2625 bool line_top, line_bottom;
2626 bool pagebreak_top, pagebreak_bottom;
2627 VSpace space_top, space_bottom;
2629 string labelwidthstring;
2632 // If a vspace kind is "Length" but there's no text in
2633 // the input field, reset the kind to "None".
2634 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2635 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2636 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2638 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2639 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2640 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2643 line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2644 line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2645 pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2646 pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2647 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2648 case 1: space_top = VSpace(VSpace::NONE); break;
2649 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2650 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2651 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2652 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2653 case 6: space_top = VSpace(VSpace::VFILL); break;
2654 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2656 if (fl_get_button (fd_form_paragraph->check_space_above))
2657 space_top.setKeep (true);
2658 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2659 case 1: space_bottom = VSpace(VSpace::NONE); break;
2660 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2661 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2662 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2663 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2664 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2665 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2667 if (fl_get_button (fd_form_paragraph->check_space_below))
2668 space_bottom.setKeep (true);
2670 if (fl_get_button(fd_form_paragraph->radio_align_left))
2671 align = LYX_ALIGN_LEFT;
2672 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2673 align = LYX_ALIGN_RIGHT;
2674 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2675 align = LYX_ALIGN_CENTER;
2677 align = LYX_ALIGN_BLOCK;
2679 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2680 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2682 current_view->currentBuffer()->text->SetParagraph(line_top,
2691 current_view->currentBuffer()->update(1);
2692 minibuffer->Set(_("Paragraph layout set"));
2696 void ParagraphCancelCB(FL_OBJECT *, long)
2698 fl_hide_form(fd_form_paragraph->form_paragraph);
2702 void ParagraphOKCB(FL_OBJECT *ob, long data)
2704 ParagraphApplyCB(ob, data);
2705 ParagraphCancelCB(ob, data);
2709 /* callbacks for form form_character */
2711 void CharacterApplyCB(FL_OBJECT *, long)
2713 // we set toggleall locally here, since it should be true for
2714 // all other uses of ToggleAndShow() (JMarc)
2715 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2716 ToggleAndShow( UserFreeFont());
2721 void CharacterCloseCB(FL_OBJECT *, long)
2723 fl_hide_form(fd_form_character->form_character);
2727 void CharacterOKCB(FL_OBJECT *ob, long data)
2729 CharacterApplyCB(ob,data);
2730 CharacterCloseCB(ob,data);
2734 /* callbacks for form form_document */
2736 void UpdateDocumentButtons(BufferParams const ¶ms)
2738 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2740 if (params.sides == 2)
2741 fl_set_button(fd_form_document->radio_sides_two, 1);
2743 fl_set_button(fd_form_document->radio_sides_one, 1);
2745 if (params.columns == 2)
2746 fl_set_button(fd_form_document->radio_columns_two, 1);
2748 fl_set_button(fd_form_document->radio_columns_one, 1);
2750 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2751 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2752 params.secnumdepth);
2753 fl_set_counter_value(fd_form_document->slider_tocdepth,
2758 void ChoiceClassCB(FL_OBJECT *ob, long)
2761 if (lyxstyle.Load(fl_get_choice(ob)-1)) {
2762 if (AskQuestion(_("Should I set some parameters to"),
2763 fl_get_choice_text(ob),
2764 _("the defaults of this document class?"))) {
2765 BufferParams params = BufferParams();
2766 params.textclass = fl_get_choice(ob)-1;
2767 params.useClassDefaults();
2768 UpdateLayoutDocument(¶ms);
2769 UpdateDocumentButtons(params);
2772 // unable to load new style
2773 WriteAlert(_("Conversion Errors!"),
2774 _("Unable to switch to new document class."),
2775 _("Reverting to original document class."));
2776 fl_set_choice(fd_form_document->choice_class,
2777 GetCurrentTextClass() + 1);
2783 void DocumentDefskipCB(FL_OBJECT *obj, long)
2785 // "Synchronize" the choice and the input field, so that it
2786 // is impossible to commit senseless data.
2787 const FD_form_document* fd = fd_form_document;
2789 if (obj == fd->choice_default_skip) {
2790 if (fl_get_choice (fd->choice_default_skip) != 4) {
2791 fl_set_input (fd->input_default_skip, "");
2792 ActivateDocumentButtons();
2794 } else if (obj == fd->input_default_skip) {
2796 const char* input = fl_get_input (fd->input_default_skip);
2799 fl_set_choice (fd->choice_default_skip, 2);
2800 ActivateDocumentButtons();
2801 } else if (isValidGlueLength (input)) {
2802 fl_set_choice (fd->choice_default_skip, 4);
2803 ActivateDocumentButtons();
2805 fl_set_choice (fd->choice_default_skip, 4);
2806 DeactivateDocumentButtons();
2812 void DocumentSpacingCB(FL_OBJECT *obj, long)
2814 // "Synchronize" the choice and the input field, so that it
2815 // is impossible to commit senseless data.
2816 const FD_form_document* fd = fd_form_document;
2818 if (obj == fd->choice_spacing
2819 && fl_get_choice (fd->choice_spacing) != 4) {
2820 fl_set_input(fd->input_spacing, "");
2821 } else if (obj == fd->input_spacing) {
2823 const char* input = fl_get_input (fd->input_spacing);
2826 fl_set_choice (fd->choice_spacing, 1);
2828 fl_set_choice (fd->choice_spacing, 4);
2834 void DocumentApplyCB(FL_OBJECT *, long)
2837 BufferParams *params = &(current_view->currentBuffer()->params);
2838 current_view->currentBuffer()->params.language =
2839 combo_language->getline();
2841 // If default skip is a "Length" but there's no text in the
2842 // input field, reset the kind to "Medskip", which is the default.
2843 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2844 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2845 fl_set_choice (fd_form_document->choice_default_skip, 2);
2848 /* this shouldn't be done automatically IMO. For example I write german
2849 * documents with an american keyboard very often. Matthias */
2851 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2852 fl_get_choice(fd_form_document->choice_language)); */
2854 fl_get_choice_text(fd_form_document->choice_fonts);
2856 fl_get_choice_text(fd_form_document->choice_inputenc);
2858 fl_get_choice_text(fd_form_document->choice_fontsize);
2860 fl_get_choice_text(fd_form_document->choice_pagestyle);
2861 params->graphicsDriver =
2862 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2863 params->use_amsmath =
2864 fl_get_button(fd_form_document->check_use_amsmath);
2866 if (!current_view->available())
2869 char new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2870 if (params->textclass != new_class) {
2871 // try to load new_class
2872 if (lyxstyle.Load(new_class)) {
2873 // successfully loaded
2875 minibuffer->Set(_("Converting document to new document class..."));
2876 int ret = current_view->currentBuffer()->
2878 SwitchLayoutsBetweenClasses(current_view->currentBuffer()->
2881 current_view->currentBuffer()->
2887 s= _("One paragraph couldn't be converted");
2890 s += _(" paragraphs couldn't be converted");
2892 WriteAlert(_("Conversion Errors!"),s,
2893 _("into chosen document class"));
2896 params->textclass = new_class;
2898 // problem changing class -- warn user and retain old style
2899 WriteAlert(_("Conversion Errors!"),
2900 _("Unable to switch to new document class."),
2901 _("Reverting to original document class."));
2902 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2906 char tmpsep = params->paragraph_separation;
2907 if (fl_get_button(fd_form_document->radio_indent))
2908 params->paragraph_separation = LYX_PARSEP_INDENT;
2910 params->paragraph_separation = LYX_PARSEP_SKIP;
2911 if (tmpsep != params->paragraph_separation)
2914 VSpace tmpdefskip = params->getDefSkip();
2915 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2916 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2917 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2918 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2919 case 4: params->setDefSkip(
2920 VSpace (LyXGlueLength (fl_get_input
2921 (fd_form_document->input_default_skip))));
2923 // DocumentDefskipCB assures that this never happens
2924 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2926 if (!(tmpdefskip == params->getDefSkip()))
2929 if (fl_get_button(fd_form_document->radio_columns_two))
2930 params->columns = 2;
2932 params->columns = 1;
2933 if (fl_get_button(fd_form_document->radio_sides_two))
2938 Spacing tmpSpacing = params->spacing;
2939 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2941 lyxerr.debug() << "Spacing: SINGLE" << endl;
2942 params->spacing.set(Spacing::Single);
2945 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2946 params->spacing.set(Spacing::Onehalf);
2949 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2950 params->spacing.set(Spacing::Double);
2953 lyxerr.debug() << "Spacing: OTHER" << endl;
2954 params->spacing.set(Spacing::Other,
2955 fl_get_input(fd_form_document->input_spacing));
2958 if (tmpSpacing != params->spacing)
2961 signed char tmpchar = (signed char)
2962 fl_get_counter_value(fd_form_document->slider_secnumdepth);;
2963 if (params->secnumdepth != tmpchar)
2965 params->secnumdepth = tmpchar;
2967 params->tocdepth = (signed char)
2968 fl_get_counter_value(fd_form_document->slider_tocdepth);;
2970 params->float_placement =
2971 fl_get_input(fd_form_document->input_float_placement);
2973 // More checking should be done to ensure the string doesn't have
2974 // spaces or illegal placement characters in it. (thornley)
2977 current_view->redoCurrentBuffer();
2979 minibuffer->Set(_("Document layout set"));
2980 current_view->currentBuffer()->markDirty();
2983 fl_get_input(fd_form_document->input_extra);
2988 void DocumentCancelCB(FL_OBJECT *, long)
2990 fl_hide_form(fd_form_document->form_document);
2994 void DocumentOKCB(FL_OBJECT *ob, long data)
2996 DocumentCancelCB(ob,data);
2997 DocumentApplyCB(ob,data);
3001 void DocumentBulletsCB(FL_OBJECT *, long)
3004 // bullet callbacks etc. in bullet_panel.C -- ARRae
3010 if (!current_view->getScreen())
3013 current_view->getScreen()->HideCursor();
3015 current_view->currentBuffer()->update(-2);
3018 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3019 if (current_view->currentBuffer()->text->cursor.pos
3020 || current_view->currentBuffer()->text->cursor.par !=
3021 current_view->currentBuffer()->text->FirstParagraph())
3023 tmp = current_view->currentBuffer()->text->cursor;
3024 current_view->currentBuffer()->text->cursor.par =
3025 current_view->currentBuffer()->text->FirstParagraph();
3026 current_view->currentBuffer()->text->cursor.pos = 0;
3027 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3028 current_view->currentBuffer()->text->cursor = tmp;
3029 minibuffer->Set(_("No more notes"));
3033 minibuffer->Set(_("No more notes"));
3037 current_view->currentBuffer()->update(0);
3038 current_view->currentBuffer()->text->sel_cursor =
3039 current_view->currentBuffer()->text->cursor;
3043 void InsertCorrectQuote()
3045 Buffer *cbuffer = current_view->currentBuffer();
3048 if (cbuffer->text->cursor.pos )
3049 c = cbuffer->text->cursor.par->GetChar(cbuffer->text->cursor.pos - 1);
3053 cbuffer->insertInset(new InsetQuotes(c, cbuffer->params));
3057 /* callbacks for form form_quotes */
3059 void QuotesApplyCB(FL_OBJECT *, long)
3061 if (!current_view->available())
3064 minibuffer->Set(_("Quotes type set"));
3065 //current_view->currentBuffer()->params.quotes_language =
3066 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3067 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3068 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3070 lga = InsetQuotes::EnglishQ;
3073 lga = InsetQuotes::SwedishQ;
3076 lga = InsetQuotes::GermanQ;
3079 lga = InsetQuotes::PolishQ;
3082 lga = InsetQuotes::FrenchQ;
3085 lga = InsetQuotes::DanishQ;
3088 current_view->currentBuffer()->params.quotes_language = lga;
3089 if (fl_get_button(fd_form_quotes->radio_single))
3090 current_view->currentBuffer()->
3091 params.quotes_times = InsetQuotes::SingleQ;
3093 current_view->currentBuffer()->
3094 params.quotes_times = InsetQuotes::DoubleQ;
3098 void QuotesCancelCB(FL_OBJECT *, long)
3100 fl_hide_form(fd_form_quotes->form_quotes);
3104 void QuotesOKCB(FL_OBJECT *ob, long data)
3106 QuotesApplyCB(ob, data);
3107 QuotesCancelCB(ob, data);
3112 /* callbacks for form form_preamble */
3114 void PreambleCancelCB(FL_OBJECT *, long)
3116 fl_hide_form(fd_form_preamble->form_preamble);
3120 void PreambleApplyCB(FL_OBJECT *, long)
3122 if (!current_view->available())
3125 current_view->currentBuffer()->params.preamble =
3126 fl_get_input(fd_form_preamble->input_preamble);
3127 current_view->currentBuffer()->markDirty();
3128 minibuffer->Set(_("LaTeX preamble set"));
3132 void PreambleOKCB(FL_OBJECT *ob, long data)
3134 PreambleApplyCB(ob, data);
3135 PreambleCancelCB(ob, data);
3139 /* callbacks for form form_table */
3141 void TableApplyCB(FL_OBJECT *, long)
3144 if (!current_view->getScreen())
3147 // check for tables in tables
3148 if (current_view->currentBuffer()->text->cursor.par->table){
3149 WriteAlert(_("Impossible Operation!"),
3150 _("Cannot insert table in table."),
3155 minibuffer->Set(_("Inserting table..."));
3157 ysize = (int)(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3158 xsize = (int)(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3161 current_view->getScreen()->HideCursor();
3163 current_view->currentBuffer()->update(-2);
3165 current_view->currentBuffer()->text->SetCursorParUndo();
3166 current_view->currentBuffer()->text->FreezeUndo();
3168 current_view->currentBuffer()->text->BreakParagraph();
3169 current_view->currentBuffer()->update(-1);
3171 if (current_view->currentBuffer()->text->cursor.par->Last()) {
3172 current_view->currentBuffer()->text->CursorLeft();
3174 current_view->currentBuffer()->text->BreakParagraph();
3175 current_view->currentBuffer()->update(-1);
3178 current_view->currentBuffer()->text->current_font.setLatex(LyXFont::OFF);
3179 //if (!fl_get_button(fd_form_table->check_latex)){
3180 // insert the new wysiwy table
3181 current_view->currentBuffer()->text->SetLayout(0); // standard layout
3182 if (current_view->currentBuffer()->text->cursor.par->footnoteflag ==
3183 LyXParagraph::NO_FOOTNOTE) {
3184 current_view->currentBuffer()->
3185 text->SetParagraph(0, 0,
3187 VSpace (0.3 * current_view->currentBuffer()->
3188 params.spacing.getValue(),
3190 VSpace (0.3 * current_view->currentBuffer()->
3191 params.spacing.getValue(),
3198 current_view->currentBuffer()->text->SetParagraph(0, 0,
3200 VSpace(VSpace::NONE),
3201 VSpace(VSpace::NONE),
3206 current_view->currentBuffer()->text->cursor.par->table = new LyXTable(xsize, ysize);
3208 for (i=0; i<xsize * ysize - 1; i++)
3209 current_view->currentBuffer()->text->cursor.par->InsertChar(0,LYX_META_NEWLINE);
3210 current_view->currentBuffer()->text->RedoParagraph();
3212 current_view->currentBuffer()->text->UnFreezeUndo();
3214 current_view->currentBuffer()->update(1);
3215 minibuffer->Set(_("Table inserted"));
3219 void TableCancelCB(FL_OBJECT *, long)
3221 fl_hide_form(fd_form_table->form_table);
3225 void TableOKCB(FL_OBJECT *ob, long data)
3227 TableApplyCB(ob,data);
3228 TableCancelCB(ob,data);
3232 /* callbacks for form form_print */
3234 void PrintCancelCB(FL_OBJECT *, long)
3236 fl_hide_form(fd_form_print->form_print);
3239 static bool stringOnlyContains (string const & LStr, const char * cset)
3241 const char * cstr = LStr.c_str() ;
3243 return strspn(cstr,cset) == strlen(cstr) ;
3246 void PrintApplyCB(FL_OBJECT *, long)
3248 if (!current_view->available())
3250 Buffer *buffer = current_view->currentBuffer();
3251 string path = OnlyPath(buffer->getFileName());
3254 if (fl_get_button(fd_form_print->radio_even_pages))
3255 pageflag = lyxrc->print_evenpage_flag + ' ';
3256 else if (fl_get_button(fd_form_print->radio_odd_pages))
3257 pageflag = lyxrc->print_oddpage_flag + ' ';
3259 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3260 // User may give a page (range) list
3261 // User may print multiple (unsorted) copies
3262 string pages = fl_get_input(fd_form_print->input_pages);
3263 subst(pages, ';',',');
3264 subst(pages, '+',',');
3265 pages = strip (pages) ;
3266 pages = frontStrip (pages) ;
3267 while (!pages.empty()) { // a page range was given
3269 pages = split (pages, piece, ',') ;
3270 piece = strip(piece) ;
3271 piece = frontStrip(piece) ;
3272 if ( !stringOnlyContains (piece, "0123456789-") ) {
3273 WriteAlert(_("ERROR! Unable to print!"),
3274 _("Check 'range of pages'!"));
3277 if (piece.find('-') == string::npos) { // not found
3278 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3279 } else if (suffixIs(piece, "-") ) { // missing last page
3280 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3281 } else if (prefixIs(piece, "-") ) { // missing first page
3282 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3284 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3288 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3289 if (!copies.empty()) { // a number of copies was given
3290 if ( !stringOnlyContains (copies, "0123456789") ) {
3291 WriteAlert(_("ERROR! Unable to print!"),
3292 _("Check 'number of copies'!"));
3295 if (fl_get_button(fd_form_print->do_unsorted))
3296 pageflag += lyxrc->print_copies_flag;
3298 pageflag += lyxrc->print_collcopies_flag;
3299 pageflag += " " + copies + ' ' ;
3303 if (fl_get_button(fd_form_print->radio_order_reverse))
3304 reverseflag = lyxrc->print_reverse_flag + ' ';
3306 string orientationflag;
3307 if (buffer->params.orientation == ORIENTATION_LANDSCAPE)
3308 orientationflag = lyxrc->print_landscape_flag + ' ';
3310 string ps_file = SpaceLess(fl_get_input(fd_form_print->input_file));
3311 string printer = strip(fl_get_input(fd_form_print->input_printer));
3314 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3315 && ! printer.empty()) // a printer name has been given
3316 printerflag = lyxrc->print_to_printer + printer + ' ';
3319 if (!lyxrc->print_extra_options.empty())
3320 extraflags = lyxrc->print_extra_options + ' ';
3322 string command = lyxrc->print_command + ' '
3323 + printerflag + pageflag + reverseflag
3324 + orientationflag + extraflags;
3326 char real_papersize = buffer->params.papersize;
3327 if (real_papersize == PAPER_DEFAULT)
3328 real_papersize = lyxrc->default_papersize;
3332 switch (real_papersize) {
3333 case PAPER_USLETTER:
3348 case PAPER_EXECUTIVEPAPER:
3351 case PAPER_LEGALPAPER:
3354 default: /* If nothing else fits, keep an empty value... */
3358 if (buffer->params.use_geometry
3359 && buffer->params.papersize2 == VM_PAPER_CUSTOM
3360 && !lyxrc->print_paper_dimension_flag.empty()
3361 && !buffer->params.paperwidth.empty()
3362 && !buffer->params.paperheight.empty()) {
3363 // using a custom papersize
3365 command += lyxrc->print_paper_dimension_flag + ' ';
3366 command += buffer->params.paperwidth + ',';
3367 command += buffer->params.paperheight + ' ';
3368 } else if (!lyxrc->print_paper_flag.empty()
3370 && (real_papersize != PAPER_USLETTER ||
3371 buffer->params.orientation == ORIENTATION_PORTRAIT)) {
3372 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3374 if (fl_get_button(fd_form_print->radio_file))
3375 command += lyxrc->print_to_file + '\"'
3376 + MakeAbsPath(ps_file, path)
3378 else if (!lyxrc->print_spool_command.empty())
3379 command += lyxrc->print_to_file
3380 + '\"' + ps_file + '\"';
3382 // push directorypath, if necessary
3383 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3384 path = buffer->tmppath;
3389 if (!lyxrc->print_spool_command.empty() &&
3390 !fl_get_button(fd_form_print->radio_file)) {
3391 string command2 = lyxrc->print_spool_command + ' ';
3392 if (!printer.empty())
3393 command2 += lyxrc->print_spool_printerprefix
3395 // First run dvips and, if succesful, then spool command
3396 if ((result = RunScript(buffer, true, command))) {
3397 result = RunScript(buffer, false, command2, ps_file);
3400 result = RunScript(buffer, false, command);
3403 WriteAlert(_("Error:"),
3404 _("Unable to print"),
3405 _("Check that your parameters are correct"));
3409 void PrintOKCB(FL_OBJECT *ob, long data)
3411 PrintCancelCB(ob, data);
3412 PrintApplyCB(ob,data);
3416 /* callbacks for form form_figure */
3418 void FigureApplyCB(FL_OBJECT *, long)
3420 if (!current_view->available())
3423 Buffer * buffer = current_view->currentBuffer();
3424 if(buffer->isReadonly()) // paranoia
3427 minibuffer->Set(_("Inserting figure..."));
3428 if (fl_get_button(fd_form_figure->radio_inline)
3429 || buffer->text->cursor.par->table) {
3430 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3431 buffer->insertInset(new_inset);
3432 minibuffer->Set(_("Figure inserted"));
3433 new_inset->Edit(0, 0);
3437 current_view->getScreen()->HideCursor();
3441 buffer->text->SetCursorParUndo();
3442 buffer->text->FreezeUndo();
3444 buffer->text->BreakParagraph();
3447 if (buffer->text->cursor.par->Last()) {
3448 buffer->text->CursorLeft();
3450 buffer->text->BreakParagraph();
3454 // The standard layout should always be numer 0;
3455 buffer->text->SetLayout(0);
3457 if (buffer->text->cursor.par->footnoteflag ==
3458 LyXParagraph::NO_FOOTNOTE) {
3459 buffer->text->SetParagraph(0, 0,
3461 VSpace (0.3 * buffer->params.spacing.getValue(),
3464 buffer->params.spacing.getValue(),
3466 LYX_ALIGN_CENTER, string(), 0);
3468 buffer->text->SetParagraph(0, 0,
3470 VSpace(VSpace::NONE),
3471 VSpace(VSpace::NONE),
3478 Inset *new_inset = 0;
3480 new_inset = new InsetFig(100, 100, buffer);
3481 buffer->insertInset(new_inset);
3482 new_inset->Edit(0, 0);
3484 minibuffer->Set(_("Figure inserted"));
3485 buffer->text->UnFreezeUndo();
3489 void FigureCancelCB(FL_OBJECT *, long)
3491 fl_hide_form(fd_form_figure->form_figure);
3495 void FigureOKCB(FL_OBJECT *ob, long data)
3497 FigureApplyCB(ob,data);
3498 FigureCancelCB(ob,data);
3501 void ScreenApplyCB(FL_OBJECT *, long)
3503 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3504 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3505 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3506 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3507 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3508 fontloader.update();
3510 // All buffers will need resize
3511 bufferlist.resize();
3513 minibuffer->Set(_("Screen options set"));
3517 void ScreenCancelCB(FL_OBJECT *, long)
3519 fl_hide_form(fd_form_screen->form_screen);
3523 void ScreenOKCB(FL_OBJECT *ob, long data)
3525 ScreenCancelCB(ob,data);
3526 ScreenApplyCB(ob,data);
3532 if (!current_view->available())
3535 fl_set_button(fd_latex_options->accents,
3536 (int)current_view->currentBuffer()->params.allowAccents);
3538 if (fd_latex_options->LaTeXOptions->visible) {
3539 fl_raise_form(fd_latex_options->LaTeXOptions);
3541 fl_show_form(fd_latex_options->LaTeXOptions,
3542 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
3543 _("LaTeX Options"));
3548 // This function runs "configure" and then rereads lyx.defaults to
3549 // reconfigure the automatic settings.
3552 minibuffer->Set(_("Running configure..."));
3554 // Run configure in user lyx directory
3555 Path p(user_lyxdir);
3556 Systemcalls one(Systemcalls::System,
3557 AddName(system_lyxdir,"configure"));
3559 minibuffer->Set(_("Reloading configuration..."));
3560 lyxrc->Read(LibFileSearch(string(), "lyxrc.defaults"));
3561 WriteAlert(_("The system has been reconfigured."),
3562 _("You need to restart LyX to make use of any"),
3563 _("updated document class specifications."));
3567 /* these functions are for the spellchecker */
3568 char* NextWord(float &value)
3570 if (!current_view->available()){
3575 char* string = current_view->currentBuffer()->text->SelectNextWord(value);
3581 void SelectLastWord()
3583 if (!current_view->available())
3586 current_view->getScreen()->HideCursor();
3588 current_view->currentBuffer()->text->SelectSelectedWord();
3589 current_view->getScreen()->ToggleSelection(false);
3590 current_view->currentBuffer()->update(0);
3594 void EndOfSpellCheck()
3596 if (!current_view->available())
3599 current_view->getScreen()->HideCursor();
3601 current_view->currentBuffer()->text->SelectSelectedWord();
3602 current_view->currentBuffer()->text->ClearSelection();
3603 current_view->currentBuffer()->update(0);
3607 void ReplaceWord(string const & replacestring)
3609 if (!current_view->getScreen())
3612 current_view->getScreen()->HideCursor();
3613 current_view->currentBuffer()->update(-2);
3615 /* clear the selection (if there is any) */
3616 current_view->getScreen()->ToggleSelection(false);
3617 current_view->currentBuffer()->text->
3618 ReplaceSelectionWithString(replacestring.c_str());
3620 current_view->currentBuffer()->text->SetSelectionOverString(replacestring.c_str());
3622 // Go back so that replacement string is also spellchecked
3623 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3624 current_view->currentBuffer()->text->CursorLeftIntern();
3626 current_view->currentBuffer()->update(1);
3628 // End of spellchecker stuff
3633 // Table of Contents
3643 static TocList* toclist = 0;
3646 void TocSelectCB(FL_OBJECT *ob, long)
3648 if (!current_view->available())
3651 TocList* tmptoclist = toclist;
3652 int i = fl_get_browser(ob);
3655 for (a=1; a<i && tmptoclist->next; a++){
3656 tmptoclist = tmptoclist->next;
3663 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3664 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3665 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3666 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3667 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3668 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3669 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3670 par->appendix != tmptoclist->appendix)) {
3671 par = par->LastPhysicalPar()->Next();
3676 current_view->currentBuffer()->text->SetCursor(par, 0);
3677 current_view->currentBuffer()->text->sel_cursor =
3678 current_view->currentBuffer()->text->cursor;
3679 current_view->currentBuffer()->update(0);
3682 WriteAlert(_("Error"),
3683 _("Couldn't find this label"),
3684 _("in current document."));
3690 void TocCancelCB(FL_OBJECT *, long)
3692 fl_hide_form(fd_form_toc->form_toc);
3696 void TocUpdateCB(FL_OBJECT *, long)
3698 static LyXParagraph* stapar = 0;
3699 TocList *tmptoclist = 0;
3701 /* deleted the toclist */
3704 tmptoclist = toclist->next;
3706 toclist = tmptoclist;
3710 tmptoclist = toclist;
3713 fl_clear_browser(fd_form_toc->browser_toc);
3714 if (!current_view->available()) {
3715 fl_add_browser_line(fd_form_toc->browser_toc, _("*** No Document ***"));
3718 fl_hide_object(fd_form_toc->browser_toc);
3719 /* get the table of contents */
3720 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3722 char* line = new char[200];
3729 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3733 labeltype = lyxstyle.Style(current_view->currentBuffer()->params.textclass,
3734 par->GetLayout())->labeltype;
3736 if (labeltype >= LABEL_COUNTER_CHAPTER
3737 && labeltype <= LABEL_COUNTER_CHAPTER +
3738 current_view->currentBuffer()->params.tocdepth) {
3739 /* insert this into the table of contents */
3740 /* first indent a little bit */
3744 lyxstyle.TextClass(current_view->currentBuffer()->
3745 params.textclass)->maxcounter) * 4 + 2;
3749 // Then the labestring
3751 if (!par->labelstring.empty()) {
3752 string::size_type i = 0;
3753 while (pos < 199 && i < par->labelstring.length()) {
3754 line[pos] = par->labelstring[i];
3763 /* now the contents */
3765 while (pos < 199 && i < par->last) {
3766 c = par->GetChar(i);
3767 if (isprint((unsigned char) c) || c >= 128) {
3774 fl_add_browser_line(fd_form_toc->browser_toc, line);
3776 /* make a toclist entry */
3778 tmptoclist = new TocList;
3779 toclist = tmptoclist;
3781 tmptoclist->next = new TocList;
3782 tmptoclist = tmptoclist->next;
3785 tmptoclist->next = 0;
3787 for (a=0; a<6; a++){
3788 tmptoclist->counter[a] = par->GetFirstCounter(a);
3790 tmptoclist->appendix = par->appendix;
3792 par = par->LastPhysicalPar()->Next();
3796 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3797 fl_show_object(fd_form_toc->browser_toc);
3801 /* callbacks for form form_ref */
3802 void RefSelectCB(FL_OBJECT *, long data)
3804 if (!current_view->available())
3808 fl_get_browser_line(fd_form_ref->browser_ref,
3809 fl_get_browser(fd_form_ref->browser_ref));
3810 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3816 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3826 if(current_view->currentBuffer()->isSGML())
3827 t += "[" + u + "]" + "{" + s + "}";
3832 new InsetRef(t, current_view->currentBuffer());
3833 current_view->currentBuffer()->insertInset(new_inset);
3837 void RefUpdateCB(FL_OBJECT *, long)
3839 if (!current_view->available()) {
3840 fl_clear_browser(fd_form_ref->browser_ref);
3844 FL_OBJECT * brow = fd_form_ref->browser_ref;
3846 // Get the current line, in order to restore it later
3847 char const * const btmp=fl_get_browser_line(brow,
3848 fl_get_browser(brow));
3849 string currentstr=btmp ? btmp : "";
3850 //string currentstr = fl_get_browser_line(brow,
3851 // fl_get_browser(brow));
3853 fl_clear_browser(brow);
3855 string refs = current_view->currentBuffer()->getReferenceList('\n');
3858 #if FL_REVISION > 85
3859 fl_addto_browser_chars(brow,refs.c_str());
3860 int total_lines = fl_get_browser_maxline(brow);
3861 for (int i = 1; i <= total_lines ; i++) {
3862 if (fl_get_browser_line(brow, i) == currentstr) {
3867 fl_set_browser_topline(brow, topline);
3869 // Keep the old ugly code for xforms 0.81 compatibility
3874 curr_ref = refs.token('\n',ref_num);
3875 if (curr_ref.empty())
3877 fl_add_browser_line(brow,curr_ref.c_str());
3882 if (!fl_get_browser_maxline(brow)) {
3883 fl_add_browser_line(brow,
3884 _("*** No labels found in document ***"));
3885 fl_deactivate_object(brow);
3887 fl_select_browser_line(brow, topline);
3888 fl_activate_object(brow);
3890 if (current_view->currentBuffer()->isReadonly()) {
3891 // would be better to de/activate insert buttons
3892 // but that's more work... besides this works. ARRae
3893 fl_hide_form(fd_form_ref->form_ref);
3895 if (!current_view->currentBuffer()->isSGML()) {
3896 fl_deactivate_object(fd_form_ref->ref_name);
3897 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3900 fl_activate_object(fd_form_ref->ref_name);
3901 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3906 void RefHideCB(FL_OBJECT *, long)
3908 fl_hide_form(fd_form_ref->form_ref);
3912 void UpdateInset(Inset* inset, bool mark_dirty)
3917 /* very first check for locking insets*/
3918 if (current_view->currentBuffer()->the_locking_inset == inset){
3919 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3920 current_view->update();
3922 if (current_view->currentBuffer()->isLyxClean())
3923 minibuffer->setTimer(4);
3924 current_view->currentBuffer()->markDirty();
3926 current_view->updateScrollbar();
3931 /* first check the current buffer */
3932 if (current_view->available()){
3933 current_view->getScreen()->HideCursor();
3934 current_view->currentBuffer()->update(-3);
3935 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3937 current_view->currentBuffer()->update(1);
3939 current_view->currentBuffer()->update(3);
3944 // check all buffers
3945 bufferlist.updateInset(inset, mark_dirty);
3950 /* these functions return 1 if an error occured,
3952 int LockInset(UpdatableInset* inset)
3954 if (!current_view->currentBuffer()->the_locking_inset && inset){
3955 current_view->currentBuffer()->the_locking_inset = inset;
3962 void ShowLockedInsetCursor(long x, long y, int asc, int desc)
3964 if (current_view->currentBuffer()->the_locking_inset &&
3965 current_view->getScreen()){
3966 y += current_view->currentBuffer()->text->cursor.y;
3967 current_view->getScreen()->ShowManualCursor(x, y,
3973 void HideLockedInsetCursor(long x, long y, int asc, int desc)
3975 if (current_view->currentBuffer()->the_locking_inset &&
3976 current_view->getScreen()){
3977 y += current_view->currentBuffer()->text->cursor.y;
3978 current_view->getScreen()->HideManualCursor(x, y,
3984 void FitLockedInsetCursor(long x, long y, int asc, int desc)
3986 if (current_view->currentBuffer()->the_locking_inset &&
3987 current_view->getScreen()){
3988 y += current_view->currentBuffer()->text->cursor.y;
3989 if (current_view->getScreen()->FitManualCursor(x, y, asc, desc))
3990 current_view->updateScrollbar();
3995 int UnlockInset(UpdatableInset* inset)
3998 current_view->currentBuffer()->the_locking_inset == inset){
3999 inset->InsetUnlock();
4000 current_view->currentBuffer()->the_locking_inset = 0;
4001 current_view->currentBuffer()->text->FinishUndo();
4004 return bufferlist.unlockInset(inset);
4008 void LockedInsetStoreUndo(Undo::undo_kind kind)
4010 if (!current_view->currentBuffer()->the_locking_inset)
4011 return; // shouldn't happen
4012 if (kind == Undo::EDIT) // in this case insets would not be stored!
4013 kind = Undo::FINISH;
4014 current_view->currentBuffer()->text->SetUndo(kind,
4015 current_view->currentBuffer()->text->cursor.par->
4016 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->previous,
4017 current_view->currentBuffer()->text->cursor.par->
4018 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->next);
4022 void PutInsetIntoInsetUpdateList(Inset* inset)
4025 InsetUpdateStruct* tmp = new InsetUpdateStruct();
4027 tmp->next = InsetUpdateList;
4028 InsetUpdateList = tmp;
4033 void UpdateInsetUpdateList()
4035 InsetUpdateStruct *tmp = InsetUpdateList;
4037 UpdateInset(tmp->inset, false); // "false" because no document change
4041 /* delete the update list */
4042 while (InsetUpdateList) {
4043 tmp = InsetUpdateList;
4044 InsetUpdateList = InsetUpdateList->next;
4047 InsetUpdateList = 0;
4051 // I know we shouldn't put anything in here but this seems the fastest
4052 // way to do this (and the cleanest for now). This function just inserts
4053 // a newline in the string and the inserts 'depth'-spaces so that the
4054 // code is indented in the right way!!!
4055 void addNewlineAndDepth(string &file, int const depth)
4058 for (int j=0;j< depth;j++)