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"));
1186 fl_set_form_minsize(fd_form_ref->form_ref,
1187 fd_form_ref->form_ref->w,
1188 fd_form_ref->form_ref->h);
1193 void MenuPasteSelection(char at)
1195 if (!current_view->getScreen())
1200 Atom data_prop = XInternAtom(fl_display,
1203 if (data_prop == None)
1205 XConvertSelection(fl_display,
1206 XA_PRIMARY, XA_STRING, data_prop,
1207 fd_form_main->form_main->window, 0);
1212 extern "C" void FootCB(FL_OBJECT*, long)
1214 if (!current_view->available())
1217 minibuffer->Set(_("Inserting Footnote..."));
1218 current_view->getScreen()->HideCursor();
1219 current_view->currentBuffer()->update(-2);
1220 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1221 current_view->currentBuffer()->update(1);
1225 void LayoutsCB(int sel, void *)
1227 string tmp = tostr(sel);
1228 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1234 * SGML Linuxdoc support:
1235 * (flag == -1) import SGML file
1236 * (flag == 0) make TeX output
1237 * (flag == 1) make dvi output
1239 int RunLinuxDoc(int flag, string const & filename)
1248 /* generate a path-less extension name */
1249 name = ChangeExtension (filename, ".sgml", true);
1250 path = OnlyPath (filename);
1251 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1252 path = current_view->currentBuffer()->tmppath;
1257 if (!current_view->available())
1259 current_view->currentBuffer()->makeLinuxDocFile(name,0);
1260 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1262 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1263 case PAPER_USLETTER: add_flags = "-p letter"; break;
1264 default: /* nothing to be done yet ;-) */ break;
1272 case -1: /* Import file */
1273 minibuffer->Set(_("Importing LinuxDoc SGML file `"),
1274 MakeDisplayPath(filename), "'...");
1275 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1277 if (one.startscript(Systemcalls::System, s2))
1280 case 0: /* TeX output asked */
1281 minibuffer->Set(_("Converting LinuxDoc SGML to TeX file..."));
1282 s2 = "sgml2latex " + add_flags + " -o tex "
1283 + lyxrc->sgml_extra_options + ' ' + name;
1284 if (one.startscript(Systemcalls::System, s2))
1287 case 1: /* dvi output asked */
1288 minibuffer->Set(_("Converting LinuxDoc SGML to dvi file..."));
1289 s2 = "sgml2latex " + add_flags + " -o dvi "
1290 + lyxrc->sgml_extra_options + ' ' + name;
1291 if (one.startscript(Systemcalls::System, s2)) {
1294 current_view->currentBuffer()->markDviClean();
1296 default: /* unknown output */
1302 current_view->currentBuffer()->redraw();
1308 * SGML DocBook support:
1309 * (flag == 1) make dvi output
1311 int RunDocBook(int flag, string const & filename)
1319 /* generate a path-less extension name */
1320 name = ChangeExtension (filename, ".sgml", true);
1321 path = OnlyPath (filename);
1322 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1323 path = current_view->currentBuffer()->tmppath;
1327 if (!current_view->available())
1330 current_view->currentBuffer()->makeDocBookFile(name,0);
1333 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1335 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1336 case PAPER_USLETTER: add_flags = "-p letter"; break;
1337 default: /* nothing to be done yet ;-) */ break;
1344 case 1: /* dvi output asked */
1345 minibuffer->Set(_("Converting DocBook SGML to dvi file..."));
1346 s2 = "sgmltools --backend dvi " + name;
1347 if (one.startscript(Systemcalls::System, s2)) {
1350 current_view->currentBuffer()->markDviClean();
1352 default: /* unknown output */
1358 current_view->currentBuffer()->redraw();
1363 void AllFloats(char flag, char figmar)
1365 if (!current_view->available())
1368 LyXCursor cursor = current_view->currentBuffer()->text->cursor;
1370 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1372 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1373 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1375 && cursor.par->footnotekind != LyXParagraph::FIG
1376 && cursor.par->footnotekind != LyXParagraph::TAB
1377 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1378 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1379 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1384 LyXCursor tmpcursor = cursor;
1385 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1386 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1388 LyXParagraph *par = current_view->currentBuffer()->paragraph;
1391 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1395 par->footnotekind != LyXParagraph::FOOTNOTE
1397 par->footnotekind != LyXParagraph::MARGIN
1402 par->footnotekind != LyXParagraph::FIG
1404 par->footnotekind != LyXParagraph::TAB
1406 par->footnotekind != LyXParagraph::WIDE_FIG
1408 par->footnotekind != LyXParagraph::WIDE_TAB
1410 par->footnotekind != LyXParagraph::ALGORITHM
1415 && par->previous->footnoteflag !=
1416 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1417 current_view->currentBuffer()->text->SetCursorIntern(par->previous,
1419 current_view->currentBuffer()->text->OpenFootnote();
1424 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1428 par->footnotekind != LyXParagraph::FOOTNOTE
1430 par->footnotekind != LyXParagraph::MARGIN
1435 par->footnotekind != LyXParagraph::FIG
1437 par->footnotekind != LyXParagraph::TAB
1439 par->footnotekind != LyXParagraph::WIDE_FIG
1441 par->footnotekind != LyXParagraph::WIDE_TAB
1443 par->footnotekind != LyXParagraph::ALGORITHM
1447 current_view->currentBuffer()->text->SetCursorIntern(par, 0);
1448 current_view->currentBuffer()->text->CloseFootnote();
1454 current_view->currentBuffer()->text->SetCursorIntern(cursor.par, cursor.pos);
1455 current_view->redraw();
1456 current_view->fitCursor();
1457 current_view->updateScrollbar();
1461 void MenuLayoutCharacter()
1463 if (fd_form_character->form_character->visible) {
1464 fl_raise_form(fd_form_character->form_character);
1466 fl_show_form(fd_form_character->form_character,
1467 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
1468 _("Character Style"));
1473 inline void DeactivateParagraphButtons ()
1475 fl_deactivate_object (fd_form_paragraph->button_ok);
1476 fl_deactivate_object (fd_form_paragraph->button_apply);
1477 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1478 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1481 inline void ActivateParagraphButtons ()
1483 fl_activate_object (fd_form_paragraph->button_ok);
1484 fl_activate_object (fd_form_paragraph->button_apply);
1485 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1486 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1489 inline void DisableParagraphLayout ()
1491 DeactivateParagraphButtons();
1492 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1493 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1494 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1495 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1496 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1497 fl_deactivate_object (fd_form_paragraph->check_noindent);
1498 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1499 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1500 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1501 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1502 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1503 fl_deactivate_object (fd_form_paragraph->input_space_above);
1504 fl_deactivate_object (fd_form_paragraph->input_space_below);
1505 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1506 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1507 fl_deactivate_object (fd_form_paragraph->check_space_above);
1508 fl_deactivate_object (fd_form_paragraph->check_space_below);
1511 inline void EnableParagraphLayout ()
1513 ActivateParagraphButtons();
1514 fl_activate_object (fd_form_paragraph->input_labelwidth);
1515 fl_activate_object (fd_form_paragraph->check_lines_top);
1516 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1517 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1518 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1519 fl_activate_object (fd_form_paragraph->check_noindent);
1520 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1521 fl_activate_object (fd_form_paragraph->radio_align_right);
1522 fl_activate_object (fd_form_paragraph->radio_align_left);
1523 fl_activate_object (fd_form_paragraph->radio_align_block);
1524 fl_activate_object (fd_form_paragraph->radio_align_center);
1525 fl_activate_object (fd_form_paragraph->input_space_above);
1526 fl_activate_object (fd_form_paragraph->input_space_below);
1527 fl_activate_object (fd_form_paragraph->choice_space_above);
1528 fl_activate_object (fd_form_paragraph->choice_space_below);
1529 fl_activate_object (fd_form_paragraph->check_space_above);
1530 fl_activate_object (fd_form_paragraph->check_space_below);
1533 bool UpdateLayoutParagraph()
1535 if (!current_view->getScreen() || !current_view->available()) {
1536 if (fd_form_paragraph->form_paragraph->visible)
1537 fl_hide_form(fd_form_paragraph->form_paragraph);
1541 Buffer * buf = current_view->currentBuffer();
1543 fl_set_input(fd_form_paragraph->input_labelwidth,
1544 buf->text->cursor.par->GetLabelWidthString().c_str());
1545 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1546 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1547 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1548 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1550 int align = buf->text->cursor.par->GetAlign();
1551 if (align == LYX_ALIGN_LAYOUT)
1552 align = lyxstyle.Style(buf->params.textclass,
1553 buf->text->cursor.par->GetLayout())->align;
1556 case LYX_ALIGN_RIGHT:
1557 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1559 case LYX_ALIGN_LEFT:
1560 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1562 case LYX_ALIGN_CENTER:
1563 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1566 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1570 fl_set_button(fd_form_paragraph->check_lines_top,
1571 buf->text->cursor.par->FirstPhysicalPar()->line_top);
1572 fl_set_button(fd_form_paragraph->check_lines_bottom,
1573 buf->text->cursor.par->FirstPhysicalPar()->line_bottom);
1574 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1575 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1576 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1577 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1578 fl_set_button(fd_form_paragraph->check_noindent,
1579 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1580 fl_set_input (fd_form_paragraph->input_space_above, "");
1582 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1584 fl_set_choice (fd_form_paragraph->choice_space_above,
1587 case VSpace::DEFSKIP:
1588 fl_set_choice (fd_form_paragraph->choice_space_above,
1591 case VSpace::SMALLSKIP:
1592 fl_set_choice (fd_form_paragraph->choice_space_above,
1595 case VSpace::MEDSKIP:
1596 fl_set_choice (fd_form_paragraph->choice_space_above,
1599 case VSpace::BIGSKIP:
1600 fl_set_choice (fd_form_paragraph->choice_space_above,
1604 fl_set_choice (fd_form_paragraph->choice_space_above,
1607 case VSpace::LENGTH:
1608 fl_set_choice (fd_form_paragraph->choice_space_above,
1610 fl_set_input (fd_form_paragraph->input_space_above,
1611 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1614 fl_set_button (fd_form_paragraph->check_space_above,
1615 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1616 fl_set_input (fd_form_paragraph->input_space_below, "");
1617 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1619 fl_set_choice (fd_form_paragraph->choice_space_below,
1622 case VSpace::DEFSKIP:
1623 fl_set_choice (fd_form_paragraph->choice_space_below,
1626 case VSpace::SMALLSKIP:
1627 fl_set_choice (fd_form_paragraph->choice_space_below,
1630 case VSpace::MEDSKIP:
1631 fl_set_choice (fd_form_paragraph->choice_space_below,
1634 case VSpace::BIGSKIP:
1635 fl_set_choice (fd_form_paragraph->choice_space_below,
1639 fl_set_choice (fd_form_paragraph->choice_space_below,
1642 case VSpace::LENGTH:
1643 fl_set_choice (fd_form_paragraph->choice_space_below,
1645 fl_set_input (fd_form_paragraph->input_space_below,
1646 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1649 fl_set_button (fd_form_paragraph->check_space_below,
1650 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1652 fl_set_button(fd_form_paragraph->check_noindent,
1653 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1655 if (current_view->currentBuffer()->isReadonly()) {
1656 DisableParagraphLayout();
1658 EnableParagraphLayout();
1663 void MenuLayoutParagraph()
1665 if (UpdateLayoutParagraph()) {
1666 if (fd_form_paragraph->form_paragraph->visible) {
1667 fl_raise_form(fd_form_paragraph->form_paragraph);
1669 fl_show_form(fd_form_paragraph->form_paragraph,
1670 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
1671 _("Paragraph Environment"));
1678 void DeactivateDocumentButtons ()
1680 fl_deactivate_object (fd_form_document->button_ok);
1681 fl_deactivate_object (fd_form_document->button_apply);
1682 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1683 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1688 void ActivateDocumentButtons ()
1690 fl_activate_object (fd_form_document->button_ok);
1691 fl_activate_object (fd_form_document->button_apply);
1692 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1693 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1697 void DisableDocumentLayout ()
1699 DeactivateDocumentButtons ();
1700 fl_deactivate_object (fd_form_document->group_radio_separation);
1701 fl_deactivate_object (fd_form_document->radio_indent);
1702 fl_deactivate_object (fd_form_document->radio_skip);
1703 fl_deactivate_object (fd_form_document->choice_class);
1704 fl_deactivate_object (fd_form_document->choice_pagestyle);
1705 fl_deactivate_object (fd_form_document->choice_fonts);
1706 fl_deactivate_object (fd_form_document->choice_fontsize);
1707 fl_deactivate_object (fd_form_document->input_float_placement);
1708 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1709 fl_deactivate_object (fd_form_document->choice_inputenc);
1710 fl_deactivate_object (fd_form_document->group_radio_sides);
1711 fl_deactivate_object (fd_form_document->radio_sides_one);
1712 fl_deactivate_object (fd_form_document->radio_sides_two);
1713 fl_deactivate_object (fd_form_document->group_radio_columns);
1714 fl_deactivate_object (fd_form_document->radio_columns_one);
1715 fl_deactivate_object (fd_form_document->radio_columns_two);
1716 fl_deactivate_object (fd_form_document->input_extra);
1717 fl_deactivate_object (fd_form_document->choice_language);
1718 combo_language->deactivate();
1719 fl_deactivate_object (fd_form_document->input_default_skip);
1720 fl_deactivate_object (fd_form_document->choice_default_skip);
1721 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1722 fl_deactivate_object (fd_form_document->slider_tocdepth);
1723 fl_deactivate_object (fd_form_document->choice_spacing);
1724 fl_deactivate_object (fd_form_document->input_spacing);
1725 fl_deactivate_object (fd_form_document->check_use_amsmath);
1729 void EnableDocumentLayout ()
1731 ActivateDocumentButtons ();
1732 fl_activate_object (fd_form_document->group_radio_separation);
1733 fl_activate_object (fd_form_document->radio_indent);
1734 fl_activate_object (fd_form_document->radio_skip);
1735 fl_activate_object (fd_form_document->choice_class);
1736 fl_activate_object (fd_form_document->choice_pagestyle);
1737 fl_activate_object (fd_form_document->choice_fonts);
1738 fl_activate_object (fd_form_document->choice_fontsize);
1739 fl_activate_object (fd_form_document->input_float_placement);
1740 fl_activate_object (fd_form_document->choice_postscript_driver);
1741 fl_activate_object (fd_form_document->choice_inputenc);
1742 fl_activate_object (fd_form_document->group_radio_sides);
1743 fl_activate_object (fd_form_document->radio_sides_one);
1744 fl_activate_object (fd_form_document->radio_sides_two);
1745 fl_activate_object (fd_form_document->group_radio_columns);
1746 fl_activate_object (fd_form_document->radio_columns_one);
1747 fl_activate_object (fd_form_document->radio_columns_two);
1748 fl_activate_object (fd_form_document->input_extra);
1749 fl_activate_object (fd_form_document->choice_language);
1750 combo_language->activate();
1751 fl_activate_object (fd_form_document->input_default_skip);
1752 fl_activate_object (fd_form_document->choice_default_skip);
1753 fl_activate_object (fd_form_document->slider_secnumdepth);
1754 fl_activate_object (fd_form_document->slider_tocdepth);
1755 fl_activate_object (fd_form_document->choice_spacing);
1756 fl_activate_object (fd_form_document->input_spacing);
1757 fl_activate_object (fd_form_document->check_use_amsmath);
1760 bool UpdateLayoutDocument(BufferParams *params)
1762 if (!current_view->getScreen() || !current_view->available()) {
1763 if (fd_form_document->form_document->visible)
1764 fl_hide_form(fd_form_document->form_document);
1769 params = ¤t_view->currentBuffer()->params;
1770 LyXTextClass *tclass = lyxstyle.TextClass(params->textclass);
1772 fl_set_choice_text(fd_form_document->choice_class,
1773 lyxstyle.DescOfClass(params->textclass).c_str());
1774 combo_language->select_text(params->language.c_str());
1776 fl_set_choice_text(fd_form_document->choice_fonts,
1777 params->fonts.c_str());
1778 fl_set_choice_text(fd_form_document->choice_inputenc,
1779 params->inputenc.c_str());
1780 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1781 params->graphicsDriver.c_str());
1783 // ale970405+lasgoutt970513
1784 fl_clear_choice(fd_form_document->choice_fontsize);
1785 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1786 fl_addto_choice(fd_form_document->choice_fontsize,
1787 tclass->opt_fontsize.c_str());
1788 fl_set_choice(fd_form_document->choice_fontsize,
1789 tokenPos(tclass->opt_fontsize, '|', params->fontsize) + 2);
1791 // ale970405+lasgoutt970513
1792 fl_clear_choice(fd_form_document->choice_pagestyle);
1793 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1794 fl_addto_choice(fd_form_document->choice_pagestyle,
1795 tclass->opt_pagestyle.c_str());
1797 fl_set_choice(fd_form_document->choice_pagestyle,
1798 tokenPos(tclass->opt_pagestyle, '|', params->pagestyle) + 2);
1800 fl_set_button(fd_form_document->radio_indent, 0);
1801 fl_set_button(fd_form_document->radio_skip, 0);
1804 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1806 if (params->paragraph_separation == LYX_PARSEP_INDENT)
1807 fl_set_button(fd_form_document->radio_indent, 1);
1809 fl_set_button(fd_form_document->radio_skip, 1);
1811 switch (params->getDefSkip().kind()) {
1812 case VSpace::SMALLSKIP:
1813 fl_set_choice (fd_form_document->choice_default_skip, 1);
1815 case VSpace::MEDSKIP:
1816 fl_set_choice (fd_form_document->choice_default_skip, 2);
1818 case VSpace::BIGSKIP:
1819 fl_set_choice (fd_form_document->choice_default_skip, 3);
1821 case VSpace::LENGTH:
1822 fl_set_choice (fd_form_document->choice_default_skip, 4);
1823 fl_set_input (fd_form_document->input_default_skip,
1824 params->getDefSkip().asLyXCommand().c_str());
1827 fl_set_choice (fd_form_document->choice_default_skip, 2);
1831 fl_set_button(fd_form_document->radio_sides_one, 0);
1832 fl_set_button(fd_form_document->radio_sides_two, 0);
1834 if (params->sides == 2)
1835 fl_set_button(fd_form_document->radio_sides_two, 1);
1837 fl_set_button(fd_form_document->radio_sides_one, 1);
1839 fl_set_button(fd_form_document->radio_columns_one, 0);
1840 fl_set_button(fd_form_document->radio_columns_two, 0);
1842 if (params->columns == 2)
1843 fl_set_button(fd_form_document->radio_columns_two, 1);
1845 fl_set_button(fd_form_document->radio_columns_one, 1);
1847 fl_set_input(fd_form_document->input_spacing, "");
1848 switch (params->spacing.getSpace()) {
1849 case Spacing::Single:
1852 fl_set_choice(fd_form_document->choice_spacing, 1);
1855 case Spacing::Onehalf:
1858 fl_set_choice(fd_form_document->choice_spacing, 2);
1861 case Spacing::Double:
1864 fl_set_choice(fd_form_document->choice_spacing, 3);
1867 case Spacing::Other:
1869 fl_set_choice(fd_form_document->choice_spacing, 4);
1871 sprintf(sval,"%g",params->spacing.getValue());
1872 fl_set_input(fd_form_document->input_spacing, sval);
1878 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1879 params->secnumdepth);
1880 fl_set_counter_value(fd_form_document->slider_tocdepth,
1882 if (!params->float_placement.empty()) { // buffer local (Lgb)
1883 fl_set_input(fd_form_document->input_float_placement,
1884 params->float_placement.c_str());
1886 fl_set_input(fd_form_document->input_float_placement, "");
1888 if (!params->options.empty())
1889 fl_set_input(fd_form_document->input_extra,
1890 params->options.c_str());
1892 fl_set_input(fd_form_document->input_extra, "");
1894 if (current_view->currentBuffer()->isSGML()) {
1895 // bullets not used in SGML derived documents
1896 fl_deactivate_object(fd_form_document->button_bullets);
1897 fl_set_object_lcol(fd_form_document->button_bullets,
1900 fl_activate_object(fd_form_document->button_bullets);
1901 fl_set_object_lcol(fd_form_document->button_bullets,
1905 if (current_view->currentBuffer()->isReadonly()) {
1906 DisableDocumentLayout();
1908 EnableDocumentLayout();
1914 void MenuLayoutDocument()
1916 if (UpdateLayoutDocument()) {
1917 if (fd_form_document->form_document->visible) {
1918 fl_raise_form(fd_form_document->form_document);
1920 fl_show_form(fd_form_document->form_document,
1921 FL_PLACE_MOUSE | FL_FREE_SIZE,
1923 _("Document Layout"));
1929 bool UpdateLayoutQuotes()
1932 if (!current_view->getScreen()
1933 || !current_view->available()
1934 || current_view->currentBuffer()->isReadonly())
1938 fl_set_choice(fd_form_quotes->choice_quotes_language,
1939 current_view->currentBuffer()->params.quotes_language + 1);
1940 fl_set_button(fd_form_quotes->radio_single, 0);
1941 fl_set_button(fd_form_quotes->radio_double, 0);
1943 if (current_view->currentBuffer()->params.quotes_times == InsetQuotes::SingleQ)
1944 fl_set_button(fd_form_quotes->radio_single, 1);
1946 fl_set_button(fd_form_quotes->radio_double, 1);
1947 } else if (fd_form_quotes->form_quotes->visible) {
1948 fl_hide_form(fd_form_quotes->form_quotes);
1953 void MenuLayoutQuotes()
1955 if (UpdateLayoutQuotes()) {
1956 if (fd_form_quotes->form_quotes->visible) {
1957 fl_raise_form(fd_form_quotes->form_quotes);
1959 fl_show_form(fd_form_quotes->form_quotes,
1960 FL_PLACE_MOUSE | FL_FREE_SIZE,
1968 bool UpdateLayoutPreamble()
1971 if (!current_view->getScreen() || ! current_view->available())
1975 fl_set_input(fd_form_preamble->input_preamble,
1976 current_view->currentBuffer()->params.preamble.c_str());
1978 if (current_view->currentBuffer()->isReadonly()) {
1979 fl_deactivate_object(fd_form_preamble->input_preamble);
1980 fl_deactivate_object(fd_form_preamble->button_ok);
1981 fl_deactivate_object(fd_form_preamble->button_apply);
1982 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
1983 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
1986 fl_activate_object(fd_form_preamble->input_preamble);
1987 fl_activate_object(fd_form_preamble->button_ok);
1988 fl_activate_object(fd_form_preamble->button_apply);
1989 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
1990 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
1992 } else if (fd_form_preamble->form_preamble->visible) {
1993 fl_hide_form(fd_form_preamble->form_preamble);
1998 void MenuLayoutPreamble()
2000 if (UpdateLayoutPreamble()) {
2001 if (fd_form_preamble->form_preamble->visible) {
2002 fl_raise_form(fd_form_preamble->form_preamble);
2004 fl_show_form(fd_form_preamble->form_preamble,
2005 FL_PLACE_MOUSE | FL_FREE_SIZE,
2007 _("LaTeX Preamble"));
2012 void MenuLayoutSave()
2014 if (!current_view->getScreen() || ! current_view->available())
2017 if (AskQuestion(_("Do you want to save the current settings"),
2018 _("for Character, Document, Paper and Quotes"),
2019 _("as default for new documents?")))
2020 current_view->currentBuffer()->saveParamsAsDefaults();
2026 InsetInfo *new_inset = new InsetInfo();
2027 current_view->currentBuffer()->insertInset(new_inset);
2028 new_inset->Edit(0,0);
2029 //current_view->currentBuffer()->update(-1);
2035 if (current_view->available()) {
2036 minibuffer->Set(_("Open/Close..."));
2037 current_view->getScreen()->HideCursor();
2039 current_view->currentBuffer()->update(-2);
2040 current_view->currentBuffer()->text->OpenStuff();
2041 current_view->currentBuffer()->update(0);
2047 if (current_view->available()) {
2048 minibuffer->Set(_("Open/Close..."));
2049 current_view->getScreen()->HideCursor();
2051 current_view->currentBuffer()->update(-2);
2052 current_view->currentBuffer()->text->ToggleFootnote();
2053 current_view->currentBuffer()->update(0);
2060 /* if (current_view->currentBuffer()->the_locking_inset) {
2061 minibuffer->Set(_("Undo not yet supported in math mode"));
2065 if (current_view->available()) {
2066 minibuffer->Set(_("Undo"));
2067 current_view->getScreen()->HideCursor();
2069 current_view->currentBuffer()->update(-2);
2070 if (!current_view->currentBuffer()->text->TextUndo())
2071 minibuffer->Set(_("No further undo information"));
2073 current_view->currentBuffer()->update(-1);
2080 if (current_view->currentBuffer()->the_locking_inset) {
2081 minibuffer->Set(_("Redo not yet supported in math mode"));
2085 if (current_view->available()) {
2086 minibuffer->Set(_("Redo"));
2087 current_view->getScreen()->HideCursor();
2089 current_view->currentBuffer()->update(-2);
2090 if (!current_view->currentBuffer()->text->TextRedo())
2091 minibuffer->Set(_("No further redo information"));
2093 current_view->currentBuffer()->update(-1);
2098 void HyphenationPoint()
2100 if (current_view->available()) {
2101 current_view->getScreen()->HideCursor();
2102 current_view->currentBuffer()->update(-2);
2103 InsetSpecialChar *new_inset =
2104 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2105 current_view->currentBuffer()->insertInset(new_inset);
2106 //current_view->currentBuffer()->update(-1);
2113 if (current_view->available()) {
2114 current_view->getScreen()->HideCursor();
2115 current_view->currentBuffer()->update(-2);
2116 InsetSpecialChar *new_inset =
2117 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2118 current_view->currentBuffer()->insertInset(new_inset);
2123 void EndOfSentenceDot()
2125 if (current_view->available()) {
2126 current_view->getScreen()->HideCursor();
2127 current_view->currentBuffer()->update(-2);
2128 InsetSpecialChar *new_inset =
2129 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2130 current_view->currentBuffer()->insertInset(new_inset);
2135 void MenuSeparator()
2137 if (current_view->available()) {
2138 current_view->getScreen()->HideCursor();
2139 current_view->currentBuffer()->update(-2);
2140 InsetSpecialChar *new_inset =
2141 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2142 current_view->currentBuffer()->insertInset(new_inset);
2143 //current_view->currentBuffer()->update(-1);
2150 if (current_view->available()) {
2151 current_view->getScreen()->HideCursor();
2152 current_view->currentBuffer()->update(-2);
2153 current_view->currentBuffer()->text->InsertChar(LYX_META_NEWLINE);
2154 current_view->currentBuffer()->update(-1);
2159 void ProtectedBlank()
2161 if (current_view->available()) {
2162 current_view->getScreen()->HideCursor();
2163 current_view->currentBuffer()->update(-2);
2164 current_view->currentBuffer()->text->InsertChar(LYX_META_PROTECTED_SEPARATOR);
2165 current_view->currentBuffer()->update(-1);
2172 if (current_view->available()) {
2173 current_view->getScreen()->HideCursor();
2174 current_view->currentBuffer()->update(-2);
2175 current_view->currentBuffer()->text->InsertChar(LYX_META_HFILL);
2176 current_view->currentBuffer()->update(-1);
2181 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2182 They also show the current font state. */
2185 void ToggleAndShow(LyXFont const &);
2188 void FontSizeCB(string const & size)
2190 LyXFont font(LyXFont::ALL_IGNORE);
2191 font.setGUISize(size);
2192 ToggleAndShow(font);
2198 LyXFont font(LyXFont::ALL_IGNORE);
2199 font.setEmph(LyXFont::TOGGLE);
2200 ToggleAndShow(font);
2206 LyXFont font(LyXFont::ALL_IGNORE);
2207 font.setNoun(LyXFont::TOGGLE);
2208 ToggleAndShow(font);
2214 LyXFont font(LyXFont::ALL_IGNORE);
2215 font.setSeries(LyXFont::BOLD_SERIES);
2216 ToggleAndShow(font);
2222 LyXFont font(LyXFont::ALL_IGNORE);
2223 font.setUnderbar(LyXFont::TOGGLE);
2224 ToggleAndShow(font);
2230 LyXFont font(LyXFont::ALL_IGNORE);
2231 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2232 ToggleAndShow(font);
2238 LyXFont font(LyXFont::ALL_IGNORE);
2239 font.setFamily(LyXFont::SANS_FAMILY);
2240 ToggleAndShow(font);
2246 LyXFont font(LyXFont::ALL_IGNORE);
2247 font.setFamily(LyXFont::ROMAN_FAMILY);
2248 ToggleAndShow(font);
2254 LyXFont font(LyXFont::ALL_IGNORE);
2255 font.setLatex (LyXFont::TOGGLE);
2256 ToggleAndShow(font);
2262 LyXFont font(LyXFont::ALL_INHERIT);
2263 ToggleAndShow(font);
2267 /* -------> Returns the current font and depth by printing a message. In the
2268 * future perhaps we could try to implement a callback to the button-bar.
2269 * That is, `light' the bold button when the font is currently bold, etc.
2271 string CurrentState()
2274 if (current_view->available()) {
2275 // I think we should only show changes from the default
2277 Buffer * buffer = current_view->currentBuffer();
2278 LyXFont font = buffer->text->real_current_font;
2279 LyXFont defaultfont = lyxstyle.TextClass(buffer->
2280 params.textclass)->defaultfont;
2281 font.reduce(defaultfont);
2282 state = _("Font: ") + font.stateText();
2284 int depth = buffer->text->GetDepth();
2286 state += string(_(", Depth: ")) + tostr(depth);
2292 /* -------> Does the actual toggle job of the XxxCB() calls above.
2293 * Also shows the current font state.
2296 void ToggleAndShow(LyXFont const & font)
2298 if (current_view->available()) {
2299 current_view->getScreen()->HideCursor();
2300 current_view->currentBuffer()->update(-2);
2301 current_view->currentBuffer()->text->ToggleFree(font, toggleall);
2302 current_view->currentBuffer()->update(1);
2304 // removed since it overrides the ToggleFree Message about the style
2305 // Since Styles are more "High Level" than raw fonts I think the user
2306 // prefers it like this Matthias
2307 // FontStateShowCB( 0, 0 );
2311 extern "C" void MarginCB(FL_OBJECT *, long)
2313 if (current_view->available()) {
2314 minibuffer->Set(_("Inserting margin note..."));
2315 current_view->getScreen()->HideCursor();
2316 current_view->currentBuffer()->update(-2);
2317 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2318 current_view->currentBuffer()->update(1);
2323 extern "C" void FigureCB(FL_OBJECT *, long)
2325 if (fd_form_figure->form_figure->visible) {
2326 fl_raise_form(fd_form_figure->form_figure);
2328 fl_show_form(fd_form_figure->form_figure,
2329 FL_PLACE_MOUSE, FL_FULLBORDER,
2330 _("Insert Figure"));
2335 extern "C" void TableCB(FL_OBJECT *, long)
2337 if (fd_form_table->form_table->visible) {
2338 fl_raise_form(fd_form_table->form_table);
2340 fl_show_form(fd_form_table->form_table,
2341 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
2347 void CopyEnvironmentCB()
2349 if (current_view->available()) {
2350 current_view->currentBuffer()->text->copyEnvironmentType();
2351 /* clear the selection, even if mark_set */
2352 current_view->getScreen()->ToggleSelection();
2353 current_view->currentBuffer()->text->ClearSelection();
2354 current_view->currentBuffer()->update(-2);
2355 minibuffer->Set(_("Paragraph environment type copied"));
2360 void PasteEnvironmentCB()
2362 if (current_view->available()) {
2363 current_view->currentBuffer()->text->pasteEnvironmentType();
2364 minibuffer->Set(_("Paragraph environment type set"));
2365 current_view->currentBuffer()->update(1);
2372 if (current_view->available()) {
2373 current_view->currentBuffer()->text->CopySelection();
2374 /* clear the selection, even if mark_set */
2375 current_view->getScreen()->ToggleSelection();
2376 current_view->currentBuffer()->text->ClearSelection();
2377 current_view->currentBuffer()->update(-2);
2378 minibuffer->Set(_("Copy"));
2385 if (current_view->available()) {
2386 current_view->getScreen()->HideCursor();
2387 current_view->currentBuffer()->update(-2);
2388 current_view->currentBuffer()->text->CutSelection();
2389 current_view->currentBuffer()->update(1);
2390 minibuffer->Set(_("Cut"));
2397 if (!current_view->available()) return;
2399 minibuffer->Set(_("Paste"));
2400 current_view->getScreen()->HideCursor();
2401 /* clear the selection */
2402 current_view->getScreen()->ToggleSelection();
2403 current_view->currentBuffer()->text->ClearSelection();
2404 current_view->currentBuffer()->update(-2);
2407 current_view->currentBuffer()->text->PasteSelection();
2408 current_view->currentBuffer()->update(1);
2410 /* clear the selection */
2411 current_view->getScreen()->ToggleSelection();
2412 current_view->currentBuffer()->text->ClearSelection();
2413 current_view->currentBuffer()->update(-2);
2417 extern "C" void MeltCB(FL_OBJECT *, long)
2419 if (!current_view->available()) return;
2421 minibuffer->Set(_("Melt"));
2422 current_view->getScreen()->HideCursor();
2424 current_view->currentBuffer()->update(-2);
2425 current_view->currentBuffer()->text->MeltFootnoteEnvironment();
2426 current_view->currentBuffer()->update(1);
2430 // Change environment depth.
2431 // if decInc == 0, depth change taking mouse button number into account
2432 // if decInc == 1, increment depth
2433 // if decInc == -1, decrement depth
2434 extern "C" void DepthCB(FL_OBJECT *ob, long decInc)
2438 /* When decInc != 0, fake a mouse button. This allows us to
2439 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2440 /* check out wether ob is defined, too (Matthias) */
2443 else if (!decInc && ob) {
2444 button = fl_get_button_numb(ob);
2447 if (current_view->available()) {
2448 current_view->getScreen()->HideCursor();
2449 current_view->currentBuffer()->update(-2);
2451 current_view->currentBuffer()->text->IncDepth();
2453 current_view->currentBuffer()->text->DecDepth();
2454 current_view->currentBuffer()->update(1);
2455 minibuffer->Set(_("Changed environment depth"
2456 " (in possible range, maybe not)"));
2461 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2462 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2463 LyXFont UserFreeFont()
2465 LyXFont font(LyXFont::ALL_IGNORE);
2468 pos = fl_get_choice(fd_form_character->choice_family);
2470 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2471 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2472 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2473 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2474 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2477 pos = fl_get_choice(fd_form_character->choice_series);
2479 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2480 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2481 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2482 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2485 pos = fl_get_choice(fd_form_character->choice_shape);
2487 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2488 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2489 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2490 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2491 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2492 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2495 pos = fl_get_choice(fd_form_character->choice_size);
2497 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2498 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2499 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2500 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2501 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2502 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2503 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2504 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2505 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2506 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2507 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2508 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2509 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2510 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2513 pos = fl_get_choice(fd_form_character->choice_bar);
2515 case 1: font.setEmph(LyXFont::IGNORE);
2516 font.setUnderbar(LyXFont::IGNORE);
2517 font.setNoun(LyXFont::IGNORE);
2518 font.setLatex(LyXFont::IGNORE);
2520 case 2: font.setEmph(LyXFont::TOGGLE); break;
2521 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2522 case 4: font.setNoun(LyXFont::TOGGLE); break;
2523 case 5: font.setLatex(LyXFont::TOGGLE); break;
2524 case 6: font.setEmph(LyXFont::INHERIT);
2525 font.setUnderbar(LyXFont::INHERIT);
2526 font.setNoun(LyXFont::INHERIT);
2527 font.setLatex(LyXFont::INHERIT);
2531 pos = fl_get_choice(fd_form_character->choice_color);
2533 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2534 case 2: font.setColor(LyXFont::NONE); break;
2535 case 3: font.setColor(LyXFont::BLACK); break;
2536 case 4: font.setColor(LyXFont::WHITE); break;
2537 case 5: font.setColor(LyXFont::RED); break;
2538 case 6: font.setColor(LyXFont::GREEN); break;
2539 case 7: font.setColor(LyXFont::BLUE); break;
2540 case 8: font.setColor(LyXFont::CYAN); break;
2541 case 9: font.setColor(LyXFont::MAGENTA); break;
2542 case 10: font.setColor(LyXFont::YELLOW); break;
2543 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2552 ToggleAndShow(UserFreeFont());
2556 /* callbacks for form form_title */
2557 extern "C" void TimerCB(FL_OBJECT *, long)
2559 // only if the form still exists
2560 if (fd_form_title->form_title != 0) {
2561 if (fd_form_title->form_title->visible) {
2562 fl_hide_form(fd_form_title->form_title);
2564 fl_free_form(fd_form_title->form_title);
2565 fd_form_title->form_title = 0;
2570 /* callbacks for form form_paragraph */
2572 extern "C" void ParagraphVSpaceCB(FL_OBJECT* obj, long )
2574 // "Synchronize" the choices and input fields, making it
2575 // impossible to commit senseless data.
2577 const FD_form_paragraph* fp = fd_form_paragraph;
2579 if (obj == fp->choice_space_above) {
2580 if (fl_get_choice (fp->choice_space_above) != 7) {
2581 fl_set_input (fp->input_space_above, "");
2582 ActivateParagraphButtons();
2584 } else if (obj == fp->choice_space_below) {
2585 if (fl_get_choice (fp->choice_space_below) != 7) {
2586 fl_set_input (fp->input_space_below, "");
2587 ActivateParagraphButtons();
2589 } else if (obj == fp->input_space_above) {
2590 string input = fl_get_input (fp->input_space_above);
2592 if (input.empty()) {
2593 fl_set_choice (fp->choice_space_above, 1);
2594 ActivateParagraphButtons();
2596 else if (isValidGlueLength (input)) {
2597 fl_set_choice (fp->choice_space_above, 7);
2598 ActivateParagraphButtons();
2601 fl_set_choice (fp->choice_space_above, 7);
2602 DeactivateParagraphButtons();
2604 } else if (obj == fp->input_space_below) {
2605 string input = fl_get_input (fp->input_space_below);
2607 if (input.empty()) {
2608 fl_set_choice (fp->choice_space_below, 1);
2609 ActivateParagraphButtons();
2611 else if (isValidGlueLength (input)) {
2612 fl_set_choice (fp->choice_space_below, 7);
2613 ActivateParagraphButtons();
2616 fl_set_choice (fp->choice_space_below, 7);
2617 DeactivateParagraphButtons();
2623 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2625 if (!current_view->available())
2628 bool line_top, line_bottom;
2629 bool pagebreak_top, pagebreak_bottom;
2630 VSpace space_top, space_bottom;
2632 string labelwidthstring;
2635 // If a vspace kind is "Length" but there's no text in
2636 // the input field, reset the kind to "None".
2637 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2638 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2639 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2641 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2642 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2643 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2646 line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2647 line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2648 pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2649 pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2650 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2651 case 1: space_top = VSpace(VSpace::NONE); break;
2652 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2653 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2654 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2655 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2656 case 6: space_top = VSpace(VSpace::VFILL); break;
2657 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2659 if (fl_get_button (fd_form_paragraph->check_space_above))
2660 space_top.setKeep (true);
2661 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2662 case 1: space_bottom = VSpace(VSpace::NONE); break;
2663 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2664 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2665 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2666 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2667 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2668 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2670 if (fl_get_button (fd_form_paragraph->check_space_below))
2671 space_bottom.setKeep (true);
2673 if (fl_get_button(fd_form_paragraph->radio_align_left))
2674 align = LYX_ALIGN_LEFT;
2675 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2676 align = LYX_ALIGN_RIGHT;
2677 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2678 align = LYX_ALIGN_CENTER;
2680 align = LYX_ALIGN_BLOCK;
2682 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2683 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2685 current_view->currentBuffer()->text->SetParagraph(line_top,
2694 current_view->currentBuffer()->update(1);
2695 minibuffer->Set(_("Paragraph layout set"));
2699 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2701 fl_hide_form(fd_form_paragraph->form_paragraph);
2705 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2707 ParagraphApplyCB(ob, data);
2708 ParagraphCancelCB(ob, data);
2712 /* callbacks for form form_character */
2714 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2716 // we set toggleall locally here, since it should be true for
2717 // all other uses of ToggleAndShow() (JMarc)
2718 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2719 ToggleAndShow( UserFreeFont());
2724 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2726 fl_hide_form(fd_form_character->form_character);
2730 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2732 CharacterApplyCB(ob,data);
2733 CharacterCloseCB(ob,data);
2737 /* callbacks for form form_document */
2739 void UpdateDocumentButtons(BufferParams const ¶ms)
2741 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2743 if (params.sides == 2)
2744 fl_set_button(fd_form_document->radio_sides_two, 1);
2746 fl_set_button(fd_form_document->radio_sides_one, 1);
2748 if (params.columns == 2)
2749 fl_set_button(fd_form_document->radio_columns_two, 1);
2751 fl_set_button(fd_form_document->radio_columns_one, 1);
2753 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2754 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2755 params.secnumdepth);
2756 fl_set_counter_value(fd_form_document->slider_tocdepth,
2761 extern "C" void ChoiceClassCB(FL_OBJECT *ob, long)
2764 if (lyxstyle.Load(fl_get_choice(ob)-1)) {
2765 if (AskQuestion(_("Should I set some parameters to"),
2766 fl_get_choice_text(ob),
2767 _("the defaults of this document class?"))) {
2768 BufferParams params = BufferParams();
2769 params.textclass = fl_get_choice(ob)-1;
2770 params.useClassDefaults();
2771 UpdateLayoutDocument(¶ms);
2772 UpdateDocumentButtons(params);
2775 // unable to load new style
2776 WriteAlert(_("Conversion Errors!"),
2777 _("Unable to switch to new document class."),
2778 _("Reverting to original document class."));
2779 fl_set_choice(fd_form_document->choice_class,
2780 GetCurrentTextClass() + 1);
2786 extern "C" void DocumentDefskipCB(FL_OBJECT *obj, long)
2788 // "Synchronize" the choice and the input field, so that it
2789 // is impossible to commit senseless data.
2790 const FD_form_document* fd = fd_form_document;
2792 if (obj == fd->choice_default_skip) {
2793 if (fl_get_choice (fd->choice_default_skip) != 4) {
2794 fl_set_input (fd->input_default_skip, "");
2795 ActivateDocumentButtons();
2797 } else if (obj == fd->input_default_skip) {
2799 const char* input = fl_get_input (fd->input_default_skip);
2802 fl_set_choice (fd->choice_default_skip, 2);
2803 ActivateDocumentButtons();
2804 } else if (isValidGlueLength (input)) {
2805 fl_set_choice (fd->choice_default_skip, 4);
2806 ActivateDocumentButtons();
2808 fl_set_choice (fd->choice_default_skip, 4);
2809 DeactivateDocumentButtons();
2815 extern "C" void DocumentSpacingCB(FL_OBJECT *obj, long)
2817 // "Synchronize" the choice and the input field, so that it
2818 // is impossible to commit senseless data.
2819 const FD_form_document* fd = fd_form_document;
2821 if (obj == fd->choice_spacing
2822 && fl_get_choice (fd->choice_spacing) != 4) {
2823 fl_set_input(fd->input_spacing, "");
2824 } else if (obj == fd->input_spacing) {
2826 const char* input = fl_get_input (fd->input_spacing);
2829 fl_set_choice (fd->choice_spacing, 1);
2831 fl_set_choice (fd->choice_spacing, 4);
2837 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2840 BufferParams *params = &(current_view->currentBuffer()->params);
2841 current_view->currentBuffer()->params.language =
2842 combo_language->getline();
2844 // If default skip is a "Length" but there's no text in the
2845 // input field, reset the kind to "Medskip", which is the default.
2846 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2847 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2848 fl_set_choice (fd_form_document->choice_default_skip, 2);
2851 /* this shouldn't be done automatically IMO. For example I write german
2852 * documents with an american keyboard very often. Matthias */
2854 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2855 fl_get_choice(fd_form_document->choice_language)); */
2857 fl_get_choice_text(fd_form_document->choice_fonts);
2859 fl_get_choice_text(fd_form_document->choice_inputenc);
2861 fl_get_choice_text(fd_form_document->choice_fontsize);
2863 fl_get_choice_text(fd_form_document->choice_pagestyle);
2864 params->graphicsDriver =
2865 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2866 params->use_amsmath =
2867 fl_get_button(fd_form_document->check_use_amsmath);
2869 if (!current_view->available())
2872 char new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2873 if (params->textclass != new_class) {
2874 // try to load new_class
2875 if (lyxstyle.Load(new_class)) {
2876 // successfully loaded
2878 minibuffer->Set(_("Converting document to new document class..."));
2879 int ret = current_view->currentBuffer()->
2881 SwitchLayoutsBetweenClasses(current_view->currentBuffer()->
2884 current_view->currentBuffer()->
2890 s= _("One paragraph couldn't be converted");
2893 s += _(" paragraphs couldn't be converted");
2895 WriteAlert(_("Conversion Errors!"),s,
2896 _("into chosen document class"));
2899 params->textclass = new_class;
2901 // problem changing class -- warn user and retain old style
2902 WriteAlert(_("Conversion Errors!"),
2903 _("Unable to switch to new document class."),
2904 _("Reverting to original document class."));
2905 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2909 char tmpsep = params->paragraph_separation;
2910 if (fl_get_button(fd_form_document->radio_indent))
2911 params->paragraph_separation = LYX_PARSEP_INDENT;
2913 params->paragraph_separation = LYX_PARSEP_SKIP;
2914 if (tmpsep != params->paragraph_separation)
2917 VSpace tmpdefskip = params->getDefSkip();
2918 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2919 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2920 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2921 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2922 case 4: params->setDefSkip(
2923 VSpace (LyXGlueLength (fl_get_input
2924 (fd_form_document->input_default_skip))));
2926 // DocumentDefskipCB assures that this never happens
2927 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2929 if (!(tmpdefskip == params->getDefSkip()))
2932 if (fl_get_button(fd_form_document->radio_columns_two))
2933 params->columns = 2;
2935 params->columns = 1;
2936 if (fl_get_button(fd_form_document->radio_sides_two))
2941 Spacing tmpSpacing = params->spacing;
2942 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2944 lyxerr.debug() << "Spacing: SINGLE" << endl;
2945 params->spacing.set(Spacing::Single);
2948 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2949 params->spacing.set(Spacing::Onehalf);
2952 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2953 params->spacing.set(Spacing::Double);
2956 lyxerr.debug() << "Spacing: OTHER" << endl;
2957 params->spacing.set(Spacing::Other,
2958 fl_get_input(fd_form_document->input_spacing));
2961 if (tmpSpacing != params->spacing)
2964 signed char tmpchar = (signed char)
2965 fl_get_counter_value(fd_form_document->slider_secnumdepth);;
2966 if (params->secnumdepth != tmpchar)
2968 params->secnumdepth = tmpchar;
2970 params->tocdepth = (signed char)
2971 fl_get_counter_value(fd_form_document->slider_tocdepth);;
2973 params->float_placement =
2974 fl_get_input(fd_form_document->input_float_placement);
2976 // More checking should be done to ensure the string doesn't have
2977 // spaces or illegal placement characters in it. (thornley)
2980 current_view->redoCurrentBuffer();
2982 minibuffer->Set(_("Document layout set"));
2983 current_view->currentBuffer()->markDirty();
2986 fl_get_input(fd_form_document->input_extra);
2991 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
2993 fl_hide_form(fd_form_document->form_document);
2997 extern "C" void DocumentOKCB(FL_OBJECT *ob, long data)
2999 DocumentCancelCB(ob,data);
3000 DocumentApplyCB(ob,data);
3004 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
3007 // bullet callbacks etc. in bullet_panel.C -- ARRae
3013 if (!current_view->getScreen())
3016 current_view->getScreen()->HideCursor();
3018 current_view->currentBuffer()->update(-2);
3021 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3022 if (current_view->currentBuffer()->text->cursor.pos
3023 || current_view->currentBuffer()->text->cursor.par !=
3024 current_view->currentBuffer()->text->FirstParagraph())
3026 tmp = current_view->currentBuffer()->text->cursor;
3027 current_view->currentBuffer()->text->cursor.par =
3028 current_view->currentBuffer()->text->FirstParagraph();
3029 current_view->currentBuffer()->text->cursor.pos = 0;
3030 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3031 current_view->currentBuffer()->text->cursor = tmp;
3032 minibuffer->Set(_("No more notes"));
3036 minibuffer->Set(_("No more notes"));
3040 current_view->currentBuffer()->update(0);
3041 current_view->currentBuffer()->text->sel_cursor =
3042 current_view->currentBuffer()->text->cursor;
3046 void InsertCorrectQuote()
3048 Buffer *cbuffer = current_view->currentBuffer();
3051 if (cbuffer->text->cursor.pos )
3052 c = cbuffer->text->cursor.par->GetChar(cbuffer->text->cursor.pos - 1);
3056 cbuffer->insertInset(new InsetQuotes(c, cbuffer->params));
3060 /* callbacks for form form_quotes */
3062 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
3064 if (!current_view->available())
3067 minibuffer->Set(_("Quotes type set"));
3068 //current_view->currentBuffer()->params.quotes_language =
3069 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3070 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3071 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3073 lga = InsetQuotes::EnglishQ;
3076 lga = InsetQuotes::SwedishQ;
3079 lga = InsetQuotes::GermanQ;
3082 lga = InsetQuotes::PolishQ;
3085 lga = InsetQuotes::FrenchQ;
3088 lga = InsetQuotes::DanishQ;
3091 current_view->currentBuffer()->params.quotes_language = lga;
3092 if (fl_get_button(fd_form_quotes->radio_single))
3093 current_view->currentBuffer()->
3094 params.quotes_times = InsetQuotes::SingleQ;
3096 current_view->currentBuffer()->
3097 params.quotes_times = InsetQuotes::DoubleQ;
3101 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
3103 fl_hide_form(fd_form_quotes->form_quotes);
3107 extern "C" void QuotesOKCB(FL_OBJECT *ob, long data)
3109 QuotesApplyCB(ob, data);
3110 QuotesCancelCB(ob, data);
3115 /* callbacks for form form_preamble */
3117 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
3119 fl_hide_form(fd_form_preamble->form_preamble);
3123 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
3125 if (!current_view->available())
3128 current_view->currentBuffer()->params.preamble =
3129 fl_get_input(fd_form_preamble->input_preamble);
3130 current_view->currentBuffer()->markDirty();
3131 minibuffer->Set(_("LaTeX preamble set"));
3135 extern "C" void PreambleOKCB(FL_OBJECT *ob, long data)
3137 PreambleApplyCB(ob, data);
3138 PreambleCancelCB(ob, data);
3142 /* callbacks for form form_table */
3144 extern "C" void TableApplyCB(FL_OBJECT *, long)
3147 if (!current_view->getScreen())
3150 // check for tables in tables
3151 if (current_view->currentBuffer()->text->cursor.par->table){
3152 WriteAlert(_("Impossible Operation!"),
3153 _("Cannot insert table in table."),
3158 minibuffer->Set(_("Inserting table..."));
3160 ysize = (int)(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3161 xsize = (int)(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3164 current_view->getScreen()->HideCursor();
3166 current_view->currentBuffer()->update(-2);
3168 current_view->currentBuffer()->text->SetCursorParUndo();
3169 current_view->currentBuffer()->text->FreezeUndo();
3171 current_view->currentBuffer()->text->BreakParagraph();
3172 current_view->currentBuffer()->update(-1);
3174 if (current_view->currentBuffer()->text->cursor.par->Last()) {
3175 current_view->currentBuffer()->text->CursorLeft();
3177 current_view->currentBuffer()->text->BreakParagraph();
3178 current_view->currentBuffer()->update(-1);
3181 current_view->currentBuffer()->text->current_font.setLatex(LyXFont::OFF);
3182 //if (!fl_get_button(fd_form_table->check_latex)){
3183 // insert the new wysiwy table
3184 current_view->currentBuffer()->text->SetLayout(0); // standard layout
3185 if (current_view->currentBuffer()->text->cursor.par->footnoteflag ==
3186 LyXParagraph::NO_FOOTNOTE) {
3187 current_view->currentBuffer()->
3188 text->SetParagraph(0, 0,
3190 VSpace (0.3 * current_view->currentBuffer()->
3191 params.spacing.getValue(),
3193 VSpace (0.3 * current_view->currentBuffer()->
3194 params.spacing.getValue(),
3201 current_view->currentBuffer()->text->SetParagraph(0, 0,
3203 VSpace(VSpace::NONE),
3204 VSpace(VSpace::NONE),
3209 current_view->currentBuffer()->text->cursor.par->table = new LyXTable(xsize, ysize);
3211 for (i=0; i<xsize * ysize - 1; i++)
3212 current_view->currentBuffer()->text->cursor.par->InsertChar(0,LYX_META_NEWLINE);
3213 current_view->currentBuffer()->text->RedoParagraph();
3215 current_view->currentBuffer()->text->UnFreezeUndo();
3217 current_view->currentBuffer()->update(1);
3218 minibuffer->Set(_("Table inserted"));
3222 extern "C" void TableCancelCB(FL_OBJECT *, long)
3224 fl_hide_form(fd_form_table->form_table);
3228 extern "C" void TableOKCB(FL_OBJECT *ob, long data)
3230 TableApplyCB(ob,data);
3231 TableCancelCB(ob,data);
3235 /* callbacks for form form_print */
3237 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3239 fl_hide_form(fd_form_print->form_print);
3242 static bool stringOnlyContains (string const & LStr, const char * cset)
3244 const char * cstr = LStr.c_str() ;
3246 return strspn(cstr,cset) == strlen(cstr) ;
3249 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3251 if (!current_view->available())
3253 Buffer *buffer = current_view->currentBuffer();
3254 string path = OnlyPath(buffer->getFileName());
3257 if (fl_get_button(fd_form_print->radio_even_pages))
3258 pageflag = lyxrc->print_evenpage_flag + ' ';
3259 else if (fl_get_button(fd_form_print->radio_odd_pages))
3260 pageflag = lyxrc->print_oddpage_flag + ' ';
3262 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3263 // User may give a page (range) list
3264 // User may print multiple (unsorted) copies
3265 string pages = fl_get_input(fd_form_print->input_pages);
3266 subst(pages, ';',',');
3267 subst(pages, '+',',');
3268 pages = strip (pages) ;
3269 pages = frontStrip (pages) ;
3270 while (!pages.empty()) { // a page range was given
3272 pages = split (pages, piece, ',') ;
3273 piece = strip(piece) ;
3274 piece = frontStrip(piece) ;
3275 if ( !stringOnlyContains (piece, "0123456789-") ) {
3276 WriteAlert(_("ERROR! Unable to print!"),
3277 _("Check 'range of pages'!"));
3280 if (piece.find('-') == string::npos) { // not found
3281 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3282 } else if (suffixIs(piece, "-") ) { // missing last page
3283 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3284 } else if (prefixIs(piece, "-") ) { // missing first page
3285 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3287 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3291 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3292 if (!copies.empty()) { // a number of copies was given
3293 if ( !stringOnlyContains (copies, "0123456789") ) {
3294 WriteAlert(_("ERROR! Unable to print!"),
3295 _("Check 'number of copies'!"));
3298 if (fl_get_button(fd_form_print->do_unsorted))
3299 pageflag += lyxrc->print_copies_flag;
3301 pageflag += lyxrc->print_collcopies_flag;
3302 pageflag += " " + copies + ' ' ;
3306 if (fl_get_button(fd_form_print->radio_order_reverse))
3307 reverseflag = lyxrc->print_reverse_flag + ' ';
3309 string orientationflag;
3310 if (buffer->params.orientation == ORIENTATION_LANDSCAPE)
3311 orientationflag = lyxrc->print_landscape_flag + ' ';
3313 string ps_file = SpaceLess(fl_get_input(fd_form_print->input_file));
3314 string printer = strip(fl_get_input(fd_form_print->input_printer));
3317 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3318 && ! printer.empty()) // a printer name has been given
3319 printerflag = lyxrc->print_to_printer + printer + ' ';
3322 if (!lyxrc->print_extra_options.empty())
3323 extraflags = lyxrc->print_extra_options + ' ';
3325 string command = lyxrc->print_command + ' '
3326 + printerflag + pageflag + reverseflag
3327 + orientationflag + extraflags;
3329 char real_papersize = buffer->params.papersize;
3330 if (real_papersize == PAPER_DEFAULT)
3331 real_papersize = lyxrc->default_papersize;
3335 switch (real_papersize) {
3336 case PAPER_USLETTER:
3351 case PAPER_EXECUTIVEPAPER:
3354 case PAPER_LEGALPAPER:
3357 default: /* If nothing else fits, keep an empty value... */
3361 if (buffer->params.use_geometry
3362 && buffer->params.papersize2 == VM_PAPER_CUSTOM
3363 && !lyxrc->print_paper_dimension_flag.empty()
3364 && !buffer->params.paperwidth.empty()
3365 && !buffer->params.paperheight.empty()) {
3366 // using a custom papersize
3368 command += lyxrc->print_paper_dimension_flag + ' ';
3369 command += buffer->params.paperwidth + ',';
3370 command += buffer->params.paperheight + ' ';
3371 } else if (!lyxrc->print_paper_flag.empty()
3373 && (real_papersize != PAPER_USLETTER ||
3374 buffer->params.orientation == ORIENTATION_PORTRAIT)) {
3375 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3377 if (fl_get_button(fd_form_print->radio_file))
3378 command += lyxrc->print_to_file + '\"'
3379 + MakeAbsPath(ps_file, path)
3381 else if (!lyxrc->print_spool_command.empty())
3382 command += lyxrc->print_to_file
3383 + '\"' + ps_file + '\"';
3385 // push directorypath, if necessary
3386 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3387 path = buffer->tmppath;
3392 if (!lyxrc->print_spool_command.empty() &&
3393 !fl_get_button(fd_form_print->radio_file)) {
3394 string command2 = lyxrc->print_spool_command + ' ';
3395 if (!printer.empty())
3396 command2 += lyxrc->print_spool_printerprefix
3398 // First run dvips and, if succesful, then spool command
3399 if ((result = RunScript(buffer, true, command))) {
3400 result = RunScript(buffer, false, command2, ps_file);
3403 result = RunScript(buffer, false, command);
3406 WriteAlert(_("Error:"),
3407 _("Unable to print"),
3408 _("Check that your parameters are correct"));
3412 extern "C" void PrintOKCB(FL_OBJECT *ob, long data)
3414 PrintCancelCB(ob, data);
3415 PrintApplyCB(ob,data);
3419 /* callbacks for form form_figure */
3421 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3423 if (!current_view->available())
3426 Buffer * buffer = current_view->currentBuffer();
3427 if(buffer->isReadonly()) // paranoia
3430 minibuffer->Set(_("Inserting figure..."));
3431 if (fl_get_button(fd_form_figure->radio_inline)
3432 || buffer->text->cursor.par->table) {
3433 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3434 buffer->insertInset(new_inset);
3435 minibuffer->Set(_("Figure inserted"));
3436 new_inset->Edit(0, 0);
3440 current_view->getScreen()->HideCursor();
3444 buffer->text->SetCursorParUndo();
3445 buffer->text->FreezeUndo();
3447 buffer->text->BreakParagraph();
3450 if (buffer->text->cursor.par->Last()) {
3451 buffer->text->CursorLeft();
3453 buffer->text->BreakParagraph();
3457 // The standard layout should always be numer 0;
3458 buffer->text->SetLayout(0);
3460 if (buffer->text->cursor.par->footnoteflag ==
3461 LyXParagraph::NO_FOOTNOTE) {
3462 buffer->text->SetParagraph(0, 0,
3464 VSpace (0.3 * buffer->params.spacing.getValue(),
3467 buffer->params.spacing.getValue(),
3469 LYX_ALIGN_CENTER, string(), 0);
3471 buffer->text->SetParagraph(0, 0,
3473 VSpace(VSpace::NONE),
3474 VSpace(VSpace::NONE),
3481 Inset *new_inset = 0;
3483 new_inset = new InsetFig(100, 100, buffer);
3484 buffer->insertInset(new_inset);
3485 new_inset->Edit(0, 0);
3487 minibuffer->Set(_("Figure inserted"));
3488 buffer->text->UnFreezeUndo();
3492 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3494 fl_hide_form(fd_form_figure->form_figure);
3498 extern "C" void FigureOKCB(FL_OBJECT *ob, long data)
3500 FigureApplyCB(ob,data);
3501 FigureCancelCB(ob,data);
3504 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3506 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3507 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3508 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3509 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3510 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3511 fontloader.update();
3513 // All buffers will need resize
3514 bufferlist.resize();
3516 minibuffer->Set(_("Screen options set"));
3520 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3522 fl_hide_form(fd_form_screen->form_screen);
3526 extern "C" void ScreenOKCB(FL_OBJECT *ob, long data)
3528 ScreenCancelCB(ob,data);
3529 ScreenApplyCB(ob,data);
3535 if (!current_view->available())
3538 fl_set_button(fd_latex_options->accents,
3539 (int)current_view->currentBuffer()->params.allowAccents);
3541 if (fd_latex_options->LaTeXOptions->visible) {
3542 fl_raise_form(fd_latex_options->LaTeXOptions);
3544 fl_show_form(fd_latex_options->LaTeXOptions,
3545 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
3546 _("LaTeX Options"));
3551 // This function runs "configure" and then rereads lyx.defaults to
3552 // reconfigure the automatic settings.
3555 minibuffer->Set(_("Running configure..."));
3557 // Run configure in user lyx directory
3558 Path p(user_lyxdir);
3559 Systemcalls one(Systemcalls::System,
3560 AddName(system_lyxdir,"configure"));
3562 minibuffer->Set(_("Reloading configuration..."));
3563 lyxrc->Read(LibFileSearch(string(), "lyxrc.defaults"));
3564 WriteAlert(_("The system has been reconfigured."),
3565 _("You need to restart LyX to make use of any"),
3566 _("updated document class specifications."));
3570 /* these functions are for the spellchecker */
3571 char* NextWord(float &value)
3573 if (!current_view->available()){
3578 char* string = current_view->currentBuffer()->text->SelectNextWord(value);
3584 void SelectLastWord()
3586 if (!current_view->available())
3589 current_view->getScreen()->HideCursor();
3591 current_view->currentBuffer()->text->SelectSelectedWord();
3592 current_view->getScreen()->ToggleSelection(false);
3593 current_view->currentBuffer()->update(0);
3597 void EndOfSpellCheck()
3599 if (!current_view->available())
3602 current_view->getScreen()->HideCursor();
3604 current_view->currentBuffer()->text->SelectSelectedWord();
3605 current_view->currentBuffer()->text->ClearSelection();
3606 current_view->currentBuffer()->update(0);
3610 void ReplaceWord(string const & replacestring)
3612 if (!current_view->getScreen())
3615 current_view->getScreen()->HideCursor();
3616 current_view->currentBuffer()->update(-2);
3618 /* clear the selection (if there is any) */
3619 current_view->getScreen()->ToggleSelection(false);
3620 current_view->currentBuffer()->text->
3621 ReplaceSelectionWithString(replacestring.c_str());
3623 current_view->currentBuffer()->text->SetSelectionOverString(replacestring.c_str());
3625 // Go back so that replacement string is also spellchecked
3626 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3627 current_view->currentBuffer()->text->CursorLeftIntern();
3629 current_view->currentBuffer()->update(1);
3631 // End of spellchecker stuff
3636 // Table of Contents
3646 static TocList* toclist = 0;
3649 extern "C" void TocSelectCB(FL_OBJECT *ob, long)
3651 if (!current_view->available())
3654 TocList* tmptoclist = toclist;
3655 int i = fl_get_browser(ob);
3658 for (a=1; a<i && tmptoclist->next; a++){
3659 tmptoclist = tmptoclist->next;
3666 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3667 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3668 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3669 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3670 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3671 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3672 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3673 par->appendix != tmptoclist->appendix)) {
3674 par = par->LastPhysicalPar()->Next();
3679 current_view->currentBuffer()->text->SetCursor(par, 0);
3680 current_view->currentBuffer()->text->sel_cursor =
3681 current_view->currentBuffer()->text->cursor;
3682 current_view->currentBuffer()->update(0);
3685 WriteAlert(_("Error"),
3686 _("Couldn't find this label"),
3687 _("in current document."));
3693 extern "C" void TocCancelCB(FL_OBJECT *, long)
3695 fl_hide_form(fd_form_toc->form_toc);
3699 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3701 static LyXParagraph* stapar = 0;
3702 TocList *tmptoclist = 0;
3704 /* deleted the toclist */
3707 tmptoclist = toclist->next;
3709 toclist = tmptoclist;
3713 tmptoclist = toclist;
3716 fl_clear_browser(fd_form_toc->browser_toc);
3717 if (!current_view->available()) {
3718 fl_add_browser_line(fd_form_toc->browser_toc, _("*** No Document ***"));
3721 fl_hide_object(fd_form_toc->browser_toc);
3722 /* get the table of contents */
3723 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3725 char* line = new char[200];
3732 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3736 labeltype = lyxstyle.Style(current_view->currentBuffer()->params.textclass,
3737 par->GetLayout())->labeltype;
3739 if (labeltype >= LABEL_COUNTER_CHAPTER
3740 && labeltype <= LABEL_COUNTER_CHAPTER +
3741 current_view->currentBuffer()->params.tocdepth) {
3742 /* insert this into the table of contents */
3743 /* first indent a little bit */
3747 lyxstyle.TextClass(current_view->currentBuffer()->
3748 params.textclass)->maxcounter) * 4 + 2;
3752 // Then the labestring
3754 if (!par->labelstring.empty()) {
3755 string::size_type i = 0;
3756 while (pos < 199 && i < par->labelstring.length()) {
3757 line[pos] = par->labelstring[i];
3766 /* now the contents */
3768 while (pos < 199 && i < par->last) {
3769 c = par->GetChar(i);
3770 if (isprint((unsigned char) c) || c >= 128) {
3777 fl_add_browser_line(fd_form_toc->browser_toc, line);
3779 /* make a toclist entry */
3781 tmptoclist = new TocList;
3782 toclist = tmptoclist;
3784 tmptoclist->next = new TocList;
3785 tmptoclist = tmptoclist->next;
3788 tmptoclist->next = 0;
3790 for (a=0; a<6; a++){
3791 tmptoclist->counter[a] = par->GetFirstCounter(a);
3793 tmptoclist->appendix = par->appendix;
3795 par = par->LastPhysicalPar()->Next();
3799 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3800 fl_show_object(fd_form_toc->browser_toc);
3804 /* callbacks for form form_ref */
3805 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3807 if (!current_view->available())
3811 fl_get_browser_line(fd_form_ref->browser_ref,
3812 fl_get_browser(fd_form_ref->browser_ref));
3813 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3819 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3829 if(current_view->currentBuffer()->isSGML())
3830 t += "[" + u + "]" + "{" + s + "}";
3835 new InsetRef(t, current_view->currentBuffer());
3836 current_view->currentBuffer()->insertInset(new_inset);
3840 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3842 if (!current_view->available()) {
3843 fl_clear_browser(fd_form_ref->browser_ref);
3847 FL_OBJECT * brow = fd_form_ref->browser_ref;
3849 // Get the current line, in order to restore it later
3850 char const * const btmp=fl_get_browser_line(brow,
3851 fl_get_browser(brow));
3852 string currentstr=btmp ? btmp : "";
3853 //string currentstr = fl_get_browser_line(brow,
3854 // fl_get_browser(brow));
3856 fl_clear_browser(brow);
3858 string refs = current_view->currentBuffer()->getReferenceList('\n');
3861 #if FL_REVISION > 85
3862 fl_addto_browser_chars(brow,refs.c_str());
3863 int total_lines = fl_get_browser_maxline(brow);
3864 for (int i = 1; i <= total_lines ; i++) {
3865 if (fl_get_browser_line(brow, i) == currentstr) {
3870 fl_set_browser_topline(brow, topline);
3872 // Keep the old ugly code for xforms 0.81 compatibility
3877 curr_ref = refs.token('\n',ref_num);
3878 if (curr_ref.empty())
3880 fl_add_browser_line(brow,curr_ref.c_str());
3885 if (!fl_get_browser_maxline(brow)) {
3886 fl_add_browser_line(brow,
3887 _("*** No labels found in document ***"));
3888 fl_deactivate_object(brow);
3890 fl_select_browser_line(brow, topline);
3891 fl_activate_object(brow);
3893 if (current_view->currentBuffer()->isReadonly()) {
3894 // would be better to de/activate insert buttons
3895 // but that's more work... besides this works. ARRae
3896 fl_hide_form(fd_form_ref->form_ref);
3898 if (!current_view->currentBuffer()->isSGML()) {
3899 fl_deactivate_object(fd_form_ref->ref_name);
3900 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3903 fl_activate_object(fd_form_ref->ref_name);
3904 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3909 extern "C" void RefHideCB(FL_OBJECT *, long)
3911 fl_hide_form(fd_form_ref->form_ref);
3915 void UpdateInset(Inset* inset, bool mark_dirty)
3920 /* very first check for locking insets*/
3921 if (current_view->currentBuffer()->the_locking_inset == inset){
3922 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3923 current_view->update();
3925 if (current_view->currentBuffer()->isLyxClean())
3926 minibuffer->setTimer(4);
3927 current_view->currentBuffer()->markDirty();
3929 current_view->updateScrollbar();
3934 /* first check the current buffer */
3935 if (current_view->available()){
3936 current_view->getScreen()->HideCursor();
3937 current_view->currentBuffer()->update(-3);
3938 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3940 current_view->currentBuffer()->update(1);
3942 current_view->currentBuffer()->update(3);
3947 // check all buffers
3948 bufferlist.updateInset(inset, mark_dirty);
3953 /* these functions return 1 if an error occured,
3955 int LockInset(UpdatableInset* inset)
3957 if (!current_view->currentBuffer()->the_locking_inset && inset){
3958 current_view->currentBuffer()->the_locking_inset = inset;
3965 void ShowLockedInsetCursor(long x, long y, int asc, int desc)
3967 if (current_view->currentBuffer()->the_locking_inset &&
3968 current_view->getScreen()){
3969 y += current_view->currentBuffer()->text->cursor.y;
3970 current_view->getScreen()->ShowManualCursor(x, y,
3976 void HideLockedInsetCursor(long x, long y, int asc, int desc)
3978 if (current_view->currentBuffer()->the_locking_inset &&
3979 current_view->getScreen()){
3980 y += current_view->currentBuffer()->text->cursor.y;
3981 current_view->getScreen()->HideManualCursor(x, y,
3987 void FitLockedInsetCursor(long x, long y, int asc, int desc)
3989 if (current_view->currentBuffer()->the_locking_inset &&
3990 current_view->getScreen()){
3991 y += current_view->currentBuffer()->text->cursor.y;
3992 if (current_view->getScreen()->FitManualCursor(x, y, asc, desc))
3993 current_view->updateScrollbar();
3998 int UnlockInset(UpdatableInset* inset)
4001 current_view->currentBuffer()->the_locking_inset == inset){
4002 inset->InsetUnlock();
4003 current_view->currentBuffer()->the_locking_inset = 0;
4004 current_view->currentBuffer()->text->FinishUndo();
4007 return bufferlist.unlockInset(inset);
4011 void LockedInsetStoreUndo(Undo::undo_kind kind)
4013 if (!current_view->currentBuffer()->the_locking_inset)
4014 return; // shouldn't happen
4015 if (kind == Undo::EDIT) // in this case insets would not be stored!
4016 kind = Undo::FINISH;
4017 current_view->currentBuffer()->text->SetUndo(kind,
4018 current_view->currentBuffer()->text->cursor.par->
4019 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->previous,
4020 current_view->currentBuffer()->text->cursor.par->
4021 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->next);
4025 void PutInsetIntoInsetUpdateList(Inset* inset)
4028 InsetUpdateStruct* tmp = new InsetUpdateStruct();
4030 tmp->next = InsetUpdateList;
4031 InsetUpdateList = tmp;
4036 void UpdateInsetUpdateList()
4038 InsetUpdateStruct *tmp = InsetUpdateList;
4040 UpdateInset(tmp->inset, false); // "false" because no document change
4044 /* delete the update list */
4045 while (InsetUpdateList) {
4046 tmp = InsetUpdateList;
4047 InsetUpdateList = InsetUpdateList->next;
4050 InsetUpdateList = 0;
4054 // I know we shouldn't put anything in here but this seems the fastest
4055 // way to do this (and the cleanest for now). This function just inserts
4056 // a newline in the string and the inserts 'depth'-spaces so that the
4057 // code is indented in the right way!!!
4058 void addNewlineAndDepth(string &file, int const depth)
4061 file.append(' ', depth);