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 (contains(sh, "cmd.exe")
606 || contains(sh, "4os2.exe"))
607 cmd = "start /min/n " + cmd;
612 // It seems that, if wait is false, we never get back
613 // the return code of the command. This means that all
614 // the code I added in PrintApplyCB is currently
617 #warning What should we do here?
619 minibuffer->Set(_("Executing command:"), cmd);
620 result = one.startscript(Systemcalls::System, cmd);
622 minibuffer->Set(_("Executing command:"), cmd);
623 result = one.startscript(wait ? Systemcalls::Wait
624 : Systemcalls::DontWait, cmd);
630 // Returns false if we fail
631 bool MenuRunDvips(Buffer *buffer, bool wait=false)
639 if (MakeDVIOutput(buffer) > 0) {
643 // Generate postscript file
644 string ps = ChangeExtension (buffer->getFileName(),
649 char real_papersize = buffer->params.papersize;
650 if (real_papersize == PAPER_DEFAULT)
651 real_papersize = lyxrc->default_papersize;
653 switch (real_papersize) {
669 case PAPER_EXECUTIVEPAPER:
672 case PAPER_LEGALPAPER:
675 default: /* If nothing else fits, keep an empty value... */
679 // Make postscript file.
680 string command = "dvips " + lyxrc->print_to_file + ' ';
681 command += SpaceLess(ps);
682 if (buffer->params.use_geometry
683 && buffer->params.papersize2 == VM_PAPER_CUSTOM
684 && !lyxrc->print_paper_dimension_flag.empty()
685 && !buffer->params.paperwidth.empty()
686 && !buffer->params.paperheight.empty()) {
687 // using a custom papersize
689 command += lyxrc->print_paper_dimension_flag + ' ';
690 command += buffer->params.paperwidth + ',';
691 command += buffer->params.paperheight;
692 } else if (!paper.empty()
693 && (real_papersize != PAPER_USLETTER ||
694 buffer->params.orientation == ORIENTATION_PORTRAIT)) {
695 // dvips won't accept -t letter -t landscape. In all other
696 // cases, include the paper size explicitly.
698 command += lyxrc->print_paper_flag + ' ' + paper;
700 if (buffer->params.orientation == ORIENTATION_LANDSCAPE) {
702 command += lyxrc->print_landscape_flag;
704 // push directorypath, if necessary
705 string path = OnlyPath(buffer->getFileName());
706 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
707 path = buffer->tmppath;
710 bool ret = RunScript(buffer, wait, command);
716 // Returns false if we fail
717 bool MenuPreviewPS(Buffer *buffer)
722 // Generate postscript file
723 if (!MenuRunDvips(buffer, true)) {
727 // Start postscript viewer
729 string ps = ChangeExtension (buffer->getFileName(),
731 // push directorypath, if necessary
732 string path = OnlyPath(buffer->getFileName());
733 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
734 path = buffer->tmppath;
737 bool ret = RunScript(buffer, false, lyxrc->view_ps_command, ps);
743 void MenuFax(Buffer *buffer)
748 // Generate postscript file
749 if (!MenuRunDvips(buffer, true)) {
754 string ps = ChangeExtension (buffer->getFileName(), ".ps_tmp", true);
755 string path = OnlyPath (buffer->getFileName());
756 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
757 path = buffer->tmppath;
760 if (!lyxrc->fax_program.empty()) {
761 string help2 = subst(lyxrc->fax_program, "$$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_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
1083 && isalpha(static_cast<unsigned char>(name[0]))
1084 && (prefixIs(tmpname, "/") || prefixIs(tmpname, "\\"))) {
1086 name += token(tmpname, ':', 0);
1087 tmpname = split(tmpname, ':');
1090 lyxerr.debug() << "Arg is " << filename
1091 << "\nName is " << name
1092 << "\nTemplate is " << tmpname << endl;
1094 // find a free buffer
1095 Buffer *tmpbuf = bufferlist.newFile(name,tmpname);
1097 lastfiles->newFile(tmpbuf->getFileName());
1102 // Insert ascii file (if filename is empty, prompt for one)
1103 void InsertAsciiFile(string const & f, bool asParagraph)
1106 LyXParagraph *tmppar;
1109 if (!current_view->getScreen()) return;
1111 if (fname.empty()) {
1113 fname = fileDlg.Select(_("File to Insert"),
1114 current_view->getOwner()->currentBuffer()->filepath,
1117 if (fname.empty()) return;
1121 FilePtr myfile(fname, FilePtr::read);
1123 if (!fi.exist() || !fi.readable() || !myfile()) {
1124 WriteFSAlert(_("Error! Cannot open specified file:"),
1125 MakeDisplayPath(fname,50));
1129 tmppar = new LyXParagraph();
1130 tmppar->readSimpleWholeFile(myfile);
1132 // set the end of the string
1133 tmppar->InsertChar(tmppar->last-1,'\0');
1135 // insert the string
1136 current_view->getScreen()->HideCursor();
1138 // clear the selection
1141 current_view->currentBuffer()->text->InsertStringA(tmppar->text);
1143 current_view->currentBuffer()->text->InsertStringB(tmppar->text);
1145 current_view->currentBuffer()->update(1);
1149 void MenuShowTableOfContents()
1151 static int ow = -1, oh;
1154 if (fd_form_toc->form_toc->visible) {
1155 fl_raise_form(fd_form_toc->form_toc);
1157 fl_show_form(fd_form_toc->form_toc,
1158 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1159 _("Table Of Contents"));
1161 ow = fd_form_toc->form_toc->w;
1162 oh = fd_form_toc->form_toc->h;
1164 fl_set_form_minsize(fd_form_toc->form_toc,ow,oh);
1169 void MenuInsertLabel(const char *arg)
1173 //string label = fl_show_input(_("Enter new label to insert:"),"");
1175 label = frontStrip(strip(askForText(_("Enter new label to insert:"))));
1176 if (!label.empty()) {
1177 InsetLabel *new_inset = new InsetLabel;
1178 new_inset->setContents(label);
1179 current_view->currentBuffer()->insertInset(new_inset);
1185 void MenuInsertRef()
1187 static int ow = -1, oh;
1190 if (fd_form_ref->form_ref->visible) {
1191 fl_raise_form(fd_form_ref->form_ref);
1193 fl_show_form(fd_form_ref->form_ref,
1194 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
1195 _("Insert Reference"));
1197 ow = fd_form_ref->form_ref->w;
1198 oh = fd_form_ref->form_ref->h;
1200 fl_set_form_minsize(fd_form_ref->form_ref,ow,oh);
1205 void MenuPasteSelection(char at)
1207 if (!current_view->getScreen())
1212 Atom data_prop = XInternAtom(fl_display,
1215 if (data_prop == None)
1217 XConvertSelection(fl_display,
1218 XA_PRIMARY, XA_STRING, data_prop,
1219 fd_form_main->form_main->window, 0);
1224 extern "C" void FootCB(FL_OBJECT*, long)
1226 if (!current_view->available())
1229 minibuffer->Set(_("Inserting Footnote..."));
1230 current_view->getScreen()->HideCursor();
1231 current_view->currentBuffer()->update(-2);
1232 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
1233 current_view->currentBuffer()->update(1);
1237 void LayoutsCB(int sel, void *)
1239 string tmp = tostr(sel);
1240 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_LAYOUTNO,
1246 * SGML Linuxdoc support:
1247 * (flag == -1) import SGML file
1248 * (flag == 0) make TeX output
1249 * (flag == 1) make dvi output
1251 int RunLinuxDoc(int flag, string const & filename)
1260 /* generate a path-less extension name */
1261 name = ChangeExtension (filename, ".sgml", true);
1262 path = OnlyPath (filename);
1263 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1264 path = current_view->currentBuffer()->tmppath;
1269 if (!current_view->available())
1271 current_view->currentBuffer()->makeLinuxDocFile(name,0);
1272 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1274 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1275 case PAPER_USLETTER: add_flags = "-p letter"; break;
1276 default: /* nothing to be done yet ;-) */ break;
1284 case -1: /* Import file */
1285 minibuffer->Set(_("Importing LinuxDoc SGML file `"),
1286 MakeDisplayPath(filename), "'...");
1287 s2 = "sgml2lyx " + lyxrc->sgml_extra_options + ' '
1289 if (one.startscript(Systemcalls::System, s2))
1292 case 0: /* TeX output asked */
1293 minibuffer->Set(_("Converting LinuxDoc SGML to TeX file..."));
1294 s2 = "sgml2latex " + add_flags + " -o tex "
1295 + lyxrc->sgml_extra_options + ' ' + name;
1296 if (one.startscript(Systemcalls::System, s2))
1299 case 1: /* dvi output asked */
1300 minibuffer->Set(_("Converting LinuxDoc SGML to dvi file..."));
1301 s2 = "sgml2latex " + add_flags + " -o dvi "
1302 + lyxrc->sgml_extra_options + ' ' + name;
1303 if (one.startscript(Systemcalls::System, s2)) {
1306 current_view->currentBuffer()->markDviClean();
1308 default: /* unknown output */
1314 current_view->currentBuffer()->redraw();
1320 * SGML DocBook support:
1321 * (flag == 1) make dvi output
1323 int RunDocBook(int flag, string const & filename)
1331 /* generate a path-less extension name */
1332 name = ChangeExtension (filename, ".sgml", true);
1333 path = OnlyPath (filename);
1334 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)) {
1335 path = current_view->currentBuffer()->tmppath;
1339 if (!current_view->available())
1342 current_view->currentBuffer()->makeDocBookFile(name,0);
1345 LYX_PAPER_SIZE ps = (LYX_PAPER_SIZE) current_view->currentBuffer()->params.papersize;
1347 case PAPER_A4PAPER: add_flags = "-p a4"; break;
1348 case PAPER_USLETTER: add_flags = "-p letter"; break;
1349 default: /* nothing to be done yet ;-) */ break;
1356 case 1: /* dvi output asked */
1357 minibuffer->Set(_("Converting DocBook SGML to dvi file..."));
1358 s2 = "sgmltools --backend dvi " + name;
1359 if (one.startscript(Systemcalls::System, s2)) {
1362 current_view->currentBuffer()->markDviClean();
1364 default: /* unknown output */
1370 current_view->currentBuffer()->redraw();
1375 void AllFloats(char flag, char figmar)
1377 if (!current_view->available())
1380 LyXCursor cursor = current_view->currentBuffer()->text->cursor;
1382 if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
1384 && cursor.par->footnotekind != LyXParagraph::FOOTNOTE
1385 && cursor.par->footnotekind != LyXParagraph::MARGIN)
1387 && cursor.par->footnotekind != LyXParagraph::FIG
1388 && cursor.par->footnotekind != LyXParagraph::TAB
1389 && cursor.par->footnotekind != LyXParagraph::WIDE_FIG
1390 && cursor.par->footnotekind != LyXParagraph::WIDE_TAB
1391 && cursor.par->footnotekind != LyXParagraph::ALGORITHM)))
1396 LyXCursor tmpcursor = cursor;
1397 cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos);
1398 cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos);
1400 LyXParagraph *par = current_view->currentBuffer()->paragraph;
1403 if (par->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
1407 par->footnotekind != LyXParagraph::FOOTNOTE
1409 par->footnotekind != LyXParagraph::MARGIN
1414 par->footnotekind != LyXParagraph::FIG
1416 par->footnotekind != LyXParagraph::TAB
1418 par->footnotekind != LyXParagraph::WIDE_FIG
1420 par->footnotekind != LyXParagraph::WIDE_TAB
1422 par->footnotekind != LyXParagraph::ALGORITHM
1427 && par->previous->footnoteflag !=
1428 LyXParagraph::CLOSED_FOOTNOTE){ /* should be */
1429 current_view->currentBuffer()->text->SetCursorIntern(par->previous,
1431 current_view->currentBuffer()->text->OpenFootnote();
1436 if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
1440 par->footnotekind != LyXParagraph::FOOTNOTE
1442 par->footnotekind != LyXParagraph::MARGIN
1447 par->footnotekind != LyXParagraph::FIG
1449 par->footnotekind != LyXParagraph::TAB
1451 par->footnotekind != LyXParagraph::WIDE_FIG
1453 par->footnotekind != LyXParagraph::WIDE_TAB
1455 par->footnotekind != LyXParagraph::ALGORITHM
1459 current_view->currentBuffer()->text->SetCursorIntern(par, 0);
1460 current_view->currentBuffer()->text->CloseFootnote();
1466 current_view->currentBuffer()->text->SetCursorIntern(cursor.par, cursor.pos);
1467 current_view->redraw();
1468 current_view->fitCursor();
1469 current_view->updateScrollbar();
1473 void MenuLayoutCharacter()
1475 static int ow = -1, oh;
1477 if (fd_form_character->form_character->visible) {
1478 fl_raise_form(fd_form_character->form_character);
1480 fl_show_form(fd_form_character->form_character,
1481 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
1482 _("Character Style"));
1484 ow = fd_form_character->form_character->w;
1485 oh = fd_form_character->form_character->h;
1487 fl_set_form_minsize(fd_form_character->form_character,ow,oh);
1492 inline void DeactivateParagraphButtons ()
1494 fl_deactivate_object (fd_form_paragraph->button_ok);
1495 fl_deactivate_object (fd_form_paragraph->button_apply);
1496 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_INACTIVE);
1497 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_INACTIVE);
1500 inline void ActivateParagraphButtons ()
1502 fl_activate_object (fd_form_paragraph->button_ok);
1503 fl_activate_object (fd_form_paragraph->button_apply);
1504 fl_set_object_lcol (fd_form_paragraph->button_ok, FL_BLACK);
1505 fl_set_object_lcol (fd_form_paragraph->button_apply, FL_BLACK);
1508 inline void DisableParagraphLayout ()
1510 DeactivateParagraphButtons();
1511 fl_deactivate_object (fd_form_paragraph->input_labelwidth);
1512 fl_deactivate_object (fd_form_paragraph->check_lines_top);
1513 fl_deactivate_object (fd_form_paragraph->check_lines_bottom);
1514 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_top);
1515 fl_deactivate_object (fd_form_paragraph->check_pagebreaks_bottom);
1516 fl_deactivate_object (fd_form_paragraph->check_noindent);
1517 fl_deactivate_object (fd_form_paragraph->group_radio_alignment);
1518 fl_deactivate_object (fd_form_paragraph->radio_align_right);
1519 fl_deactivate_object (fd_form_paragraph->radio_align_left);
1520 fl_deactivate_object (fd_form_paragraph->radio_align_block);
1521 fl_deactivate_object (fd_form_paragraph->radio_align_center);
1522 fl_deactivate_object (fd_form_paragraph->input_space_above);
1523 fl_deactivate_object (fd_form_paragraph->input_space_below);
1524 fl_deactivate_object (fd_form_paragraph->choice_space_above);
1525 fl_deactivate_object (fd_form_paragraph->choice_space_below);
1526 fl_deactivate_object (fd_form_paragraph->check_space_above);
1527 fl_deactivate_object (fd_form_paragraph->check_space_below);
1530 inline void EnableParagraphLayout ()
1532 ActivateParagraphButtons();
1533 fl_activate_object (fd_form_paragraph->input_labelwidth);
1534 fl_activate_object (fd_form_paragraph->check_lines_top);
1535 fl_activate_object (fd_form_paragraph->check_lines_bottom);
1536 fl_activate_object (fd_form_paragraph->check_pagebreaks_top);
1537 fl_activate_object (fd_form_paragraph->check_pagebreaks_bottom);
1538 fl_activate_object (fd_form_paragraph->check_noindent);
1539 fl_activate_object (fd_form_paragraph->group_radio_alignment);
1540 fl_activate_object (fd_form_paragraph->radio_align_right);
1541 fl_activate_object (fd_form_paragraph->radio_align_left);
1542 fl_activate_object (fd_form_paragraph->radio_align_block);
1543 fl_activate_object (fd_form_paragraph->radio_align_center);
1544 fl_activate_object (fd_form_paragraph->input_space_above);
1545 fl_activate_object (fd_form_paragraph->input_space_below);
1546 fl_activate_object (fd_form_paragraph->choice_space_above);
1547 fl_activate_object (fd_form_paragraph->choice_space_below);
1548 fl_activate_object (fd_form_paragraph->check_space_above);
1549 fl_activate_object (fd_form_paragraph->check_space_below);
1552 bool UpdateLayoutParagraph()
1554 if (!current_view->getScreen() || !current_view->available()) {
1555 if (fd_form_paragraph->form_paragraph->visible)
1556 fl_hide_form(fd_form_paragraph->form_paragraph);
1560 Buffer * buf = current_view->currentBuffer();
1562 fl_set_input(fd_form_paragraph->input_labelwidth,
1563 buf->text->cursor.par->GetLabelWidthString().c_str());
1564 fl_set_button(fd_form_paragraph->radio_align_right, 0);
1565 fl_set_button(fd_form_paragraph->radio_align_left, 0);
1566 fl_set_button(fd_form_paragraph->radio_align_center, 0);
1567 fl_set_button(fd_form_paragraph->radio_align_block, 0);
1569 int align = buf->text->cursor.par->GetAlign();
1570 if (align == LYX_ALIGN_LAYOUT)
1571 align = lyxstyle.Style(buf->params.textclass,
1572 buf->text->cursor.par->GetLayout())->align;
1575 case LYX_ALIGN_RIGHT:
1576 fl_set_button(fd_form_paragraph->radio_align_right, 1);
1578 case LYX_ALIGN_LEFT:
1579 fl_set_button(fd_form_paragraph->radio_align_left, 1);
1581 case LYX_ALIGN_CENTER:
1582 fl_set_button(fd_form_paragraph->radio_align_center, 1);
1585 fl_set_button(fd_form_paragraph->radio_align_block, 1);
1589 fl_set_button(fd_form_paragraph->check_lines_top,
1590 buf->text->cursor.par->FirstPhysicalPar()->line_top);
1591 fl_set_button(fd_form_paragraph->check_lines_bottom,
1592 buf->text->cursor.par->FirstPhysicalPar()->line_bottom);
1593 fl_set_button(fd_form_paragraph->check_pagebreaks_top,
1594 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
1595 fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
1596 buf->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
1597 fl_set_button(fd_form_paragraph->check_noindent,
1598 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1599 fl_set_input (fd_form_paragraph->input_space_above, "");
1601 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
1603 fl_set_choice (fd_form_paragraph->choice_space_above,
1606 case VSpace::DEFSKIP:
1607 fl_set_choice (fd_form_paragraph->choice_space_above,
1610 case VSpace::SMALLSKIP:
1611 fl_set_choice (fd_form_paragraph->choice_space_above,
1614 case VSpace::MEDSKIP:
1615 fl_set_choice (fd_form_paragraph->choice_space_above,
1618 case VSpace::BIGSKIP:
1619 fl_set_choice (fd_form_paragraph->choice_space_above,
1623 fl_set_choice (fd_form_paragraph->choice_space_above,
1626 case VSpace::LENGTH:
1627 fl_set_choice (fd_form_paragraph->choice_space_above,
1629 fl_set_input (fd_form_paragraph->input_space_above,
1630 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
1633 fl_set_button (fd_form_paragraph->check_space_above,
1634 buf->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
1635 fl_set_input (fd_form_paragraph->input_space_below, "");
1636 switch (buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
1638 fl_set_choice (fd_form_paragraph->choice_space_below,
1641 case VSpace::DEFSKIP:
1642 fl_set_choice (fd_form_paragraph->choice_space_below,
1645 case VSpace::SMALLSKIP:
1646 fl_set_choice (fd_form_paragraph->choice_space_below,
1649 case VSpace::MEDSKIP:
1650 fl_set_choice (fd_form_paragraph->choice_space_below,
1653 case VSpace::BIGSKIP:
1654 fl_set_choice (fd_form_paragraph->choice_space_below,
1658 fl_set_choice (fd_form_paragraph->choice_space_below,
1661 case VSpace::LENGTH:
1662 fl_set_choice (fd_form_paragraph->choice_space_below,
1664 fl_set_input (fd_form_paragraph->input_space_below,
1665 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
1668 fl_set_button (fd_form_paragraph->check_space_below,
1669 buf->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
1671 fl_set_button(fd_form_paragraph->check_noindent,
1672 buf->text->cursor.par->FirstPhysicalPar()->noindent);
1674 if (current_view->currentBuffer()->isReadonly()) {
1675 DisableParagraphLayout();
1677 EnableParagraphLayout();
1682 void MenuLayoutParagraph()
1684 if (UpdateLayoutParagraph()) {
1685 if (fd_form_paragraph->form_paragraph->visible) {
1686 fl_raise_form(fd_form_paragraph->form_paragraph);
1688 fl_show_form(fd_form_paragraph->form_paragraph,
1689 FL_PLACE_MOUSE, FL_FULLBORDER,
1690 _("Paragraph Environment"));
1697 void DeactivateDocumentButtons ()
1699 fl_deactivate_object (fd_form_document->button_ok);
1700 fl_deactivate_object (fd_form_document->button_apply);
1701 fl_set_object_lcol (fd_form_document->button_ok, FL_INACTIVE);
1702 fl_set_object_lcol (fd_form_document->button_apply, FL_INACTIVE);
1707 void ActivateDocumentButtons ()
1709 fl_activate_object (fd_form_document->button_ok);
1710 fl_activate_object (fd_form_document->button_apply);
1711 fl_set_object_lcol (fd_form_document->button_ok, FL_BLACK);
1712 fl_set_object_lcol (fd_form_document->button_apply, FL_BLACK);
1716 void DisableDocumentLayout ()
1718 DeactivateDocumentButtons ();
1719 fl_deactivate_object (fd_form_document->group_radio_separation);
1720 fl_deactivate_object (fd_form_document->radio_indent);
1721 fl_deactivate_object (fd_form_document->radio_skip);
1722 fl_deactivate_object (fd_form_document->choice_class);
1723 fl_deactivate_object (fd_form_document->choice_pagestyle);
1724 fl_deactivate_object (fd_form_document->choice_fonts);
1725 fl_deactivate_object (fd_form_document->choice_fontsize);
1726 fl_deactivate_object (fd_form_document->input_float_placement);
1727 fl_deactivate_object (fd_form_document->choice_postscript_driver);
1728 fl_deactivate_object (fd_form_document->choice_inputenc);
1729 fl_deactivate_object (fd_form_document->group_radio_sides);
1730 fl_deactivate_object (fd_form_document->radio_sides_one);
1731 fl_deactivate_object (fd_form_document->radio_sides_two);
1732 fl_deactivate_object (fd_form_document->group_radio_columns);
1733 fl_deactivate_object (fd_form_document->radio_columns_one);
1734 fl_deactivate_object (fd_form_document->radio_columns_two);
1735 fl_deactivate_object (fd_form_document->input_extra);
1736 fl_deactivate_object (fd_form_document->choice_language);
1737 combo_language->deactivate();
1738 fl_deactivate_object (fd_form_document->input_default_skip);
1739 fl_deactivate_object (fd_form_document->choice_default_skip);
1740 fl_deactivate_object (fd_form_document->slider_secnumdepth);
1741 fl_deactivate_object (fd_form_document->slider_tocdepth);
1742 fl_deactivate_object (fd_form_document->choice_spacing);
1743 fl_deactivate_object (fd_form_document->input_spacing);
1744 fl_deactivate_object (fd_form_document->check_use_amsmath);
1748 void EnableDocumentLayout ()
1750 ActivateDocumentButtons ();
1751 fl_activate_object (fd_form_document->group_radio_separation);
1752 fl_activate_object (fd_form_document->radio_indent);
1753 fl_activate_object (fd_form_document->radio_skip);
1754 fl_activate_object (fd_form_document->choice_class);
1755 fl_activate_object (fd_form_document->choice_pagestyle);
1756 fl_activate_object (fd_form_document->choice_fonts);
1757 fl_activate_object (fd_form_document->choice_fontsize);
1758 fl_activate_object (fd_form_document->input_float_placement);
1759 fl_activate_object (fd_form_document->choice_postscript_driver);
1760 fl_activate_object (fd_form_document->choice_inputenc);
1761 fl_activate_object (fd_form_document->group_radio_sides);
1762 fl_activate_object (fd_form_document->radio_sides_one);
1763 fl_activate_object (fd_form_document->radio_sides_two);
1764 fl_activate_object (fd_form_document->group_radio_columns);
1765 fl_activate_object (fd_form_document->radio_columns_one);
1766 fl_activate_object (fd_form_document->radio_columns_two);
1767 fl_activate_object (fd_form_document->input_extra);
1768 fl_activate_object (fd_form_document->choice_language);
1769 combo_language->activate();
1770 fl_activate_object (fd_form_document->input_default_skip);
1771 fl_activate_object (fd_form_document->choice_default_skip);
1772 fl_activate_object (fd_form_document->slider_secnumdepth);
1773 fl_activate_object (fd_form_document->slider_tocdepth);
1774 fl_activate_object (fd_form_document->choice_spacing);
1775 fl_activate_object (fd_form_document->input_spacing);
1776 fl_activate_object (fd_form_document->check_use_amsmath);
1779 bool UpdateLayoutDocument(BufferParams *params)
1781 if (!current_view->getScreen() || !current_view->available()) {
1782 if (fd_form_document->form_document->visible)
1783 fl_hide_form(fd_form_document->form_document);
1788 params = ¤t_view->currentBuffer()->params;
1789 LyXTextClass *tclass = lyxstyle.TextClass(params->textclass);
1791 fl_set_choice_text(fd_form_document->choice_class,
1792 lyxstyle.DescOfClass(params->textclass).c_str());
1793 combo_language->select_text(params->language.c_str());
1795 fl_set_choice_text(fd_form_document->choice_fonts,
1796 params->fonts.c_str());
1797 fl_set_choice_text(fd_form_document->choice_inputenc,
1798 params->inputenc.c_str());
1799 fl_set_choice_text(fd_form_document->choice_postscript_driver,
1800 params->graphicsDriver.c_str());
1802 // ale970405+lasgoutt970513
1803 fl_clear_choice(fd_form_document->choice_fontsize);
1804 fl_addto_choice(fd_form_document->choice_fontsize, "default");
1805 fl_addto_choice(fd_form_document->choice_fontsize,
1806 tclass->opt_fontsize.c_str());
1807 fl_set_choice(fd_form_document->choice_fontsize,
1808 tokenPos(tclass->opt_fontsize, '|', params->fontsize) + 2);
1810 // ale970405+lasgoutt970513
1811 fl_clear_choice(fd_form_document->choice_pagestyle);
1812 fl_addto_choice(fd_form_document->choice_pagestyle, "default");
1813 fl_addto_choice(fd_form_document->choice_pagestyle,
1814 tclass->opt_pagestyle.c_str());
1816 fl_set_choice(fd_form_document->choice_pagestyle,
1817 tokenPos(tclass->opt_pagestyle, '|', params->pagestyle) + 2);
1819 fl_set_button(fd_form_document->radio_indent, 0);
1820 fl_set_button(fd_form_document->radio_skip, 0);
1823 fl_set_button(fd_form_document->check_use_amsmath, params->use_amsmath);
1825 if (params->paragraph_separation == LYX_PARSEP_INDENT)
1826 fl_set_button(fd_form_document->radio_indent, 1);
1828 fl_set_button(fd_form_document->radio_skip, 1);
1830 switch (params->getDefSkip().kind()) {
1831 case VSpace::SMALLSKIP:
1832 fl_set_choice (fd_form_document->choice_default_skip, 1);
1834 case VSpace::MEDSKIP:
1835 fl_set_choice (fd_form_document->choice_default_skip, 2);
1837 case VSpace::BIGSKIP:
1838 fl_set_choice (fd_form_document->choice_default_skip, 3);
1840 case VSpace::LENGTH:
1841 fl_set_choice (fd_form_document->choice_default_skip, 4);
1842 fl_set_input (fd_form_document->input_default_skip,
1843 params->getDefSkip().asLyXCommand().c_str());
1846 fl_set_choice (fd_form_document->choice_default_skip, 2);
1850 fl_set_button(fd_form_document->radio_sides_one, 0);
1851 fl_set_button(fd_form_document->radio_sides_two, 0);
1853 if (params->sides == 2)
1854 fl_set_button(fd_form_document->radio_sides_two, 1);
1856 fl_set_button(fd_form_document->radio_sides_one, 1);
1858 fl_set_button(fd_form_document->radio_columns_one, 0);
1859 fl_set_button(fd_form_document->radio_columns_two, 0);
1861 if (params->columns == 2)
1862 fl_set_button(fd_form_document->radio_columns_two, 1);
1864 fl_set_button(fd_form_document->radio_columns_one, 1);
1866 fl_set_input(fd_form_document->input_spacing, "");
1867 switch (params->spacing.getSpace()) {
1868 case Spacing::Single:
1871 fl_set_choice(fd_form_document->choice_spacing, 1);
1874 case Spacing::Onehalf:
1877 fl_set_choice(fd_form_document->choice_spacing, 2);
1880 case Spacing::Double:
1883 fl_set_choice(fd_form_document->choice_spacing, 3);
1886 case Spacing::Other:
1888 fl_set_choice(fd_form_document->choice_spacing, 4);
1890 sprintf(sval,"%g",params->spacing.getValue());
1891 fl_set_input(fd_form_document->input_spacing, sval);
1897 fl_set_counter_value(fd_form_document->slider_secnumdepth,
1898 params->secnumdepth);
1899 fl_set_counter_value(fd_form_document->slider_tocdepth,
1901 if (!params->float_placement.empty()) { // buffer local (Lgb)
1902 fl_set_input(fd_form_document->input_float_placement,
1903 params->float_placement.c_str());
1905 fl_set_input(fd_form_document->input_float_placement, "");
1907 if (!params->options.empty())
1908 fl_set_input(fd_form_document->input_extra,
1909 params->options.c_str());
1911 fl_set_input(fd_form_document->input_extra, "");
1913 if (current_view->currentBuffer()->isSGML()) {
1914 // bullets not used in SGML derived documents
1915 fl_deactivate_object(fd_form_document->button_bullets);
1916 fl_set_object_lcol(fd_form_document->button_bullets,
1919 fl_activate_object(fd_form_document->button_bullets);
1920 fl_set_object_lcol(fd_form_document->button_bullets,
1924 if (current_view->currentBuffer()->isReadonly()) {
1925 DisableDocumentLayout();
1927 EnableDocumentLayout();
1933 void MenuLayoutDocument()
1935 if (UpdateLayoutDocument()) {
1936 if (fd_form_document->form_document->visible) {
1937 fl_raise_form(fd_form_document->form_document);
1939 fl_show_form(fd_form_document->form_document,
1940 FL_PLACE_MOUSE, FL_FULLBORDER,
1941 _("Document Layout"));
1947 bool UpdateLayoutQuotes()
1950 if (!current_view->getScreen()
1951 || !current_view->available()
1952 || current_view->currentBuffer()->isReadonly())
1956 fl_set_choice(fd_form_quotes->choice_quotes_language,
1957 current_view->currentBuffer()->params.quotes_language + 1);
1958 fl_set_button(fd_form_quotes->radio_single, 0);
1959 fl_set_button(fd_form_quotes->radio_double, 0);
1961 if (current_view->currentBuffer()->params.quotes_times == InsetQuotes::SingleQ)
1962 fl_set_button(fd_form_quotes->radio_single, 1);
1964 fl_set_button(fd_form_quotes->radio_double, 1);
1965 } else if (fd_form_quotes->form_quotes->visible) {
1966 fl_hide_form(fd_form_quotes->form_quotes);
1971 void MenuLayoutQuotes()
1973 if (UpdateLayoutQuotes()) {
1974 if (fd_form_quotes->form_quotes->visible) {
1975 fl_raise_form(fd_form_quotes->form_quotes);
1977 fl_show_form(fd_form_quotes->form_quotes,
1978 FL_PLACE_MOUSE, FL_FULLBORDER,
1985 bool UpdateLayoutPreamble()
1988 if (!current_view->getScreen() || ! current_view->available())
1992 fl_set_input(fd_form_preamble->input_preamble,
1993 current_view->currentBuffer()->params.preamble.c_str());
1995 if (current_view->currentBuffer()->isReadonly()) {
1996 fl_deactivate_object(fd_form_preamble->input_preamble);
1997 fl_deactivate_object(fd_form_preamble->button_ok);
1998 fl_deactivate_object(fd_form_preamble->button_apply);
1999 fl_set_object_lcol(fd_form_preamble->button_ok, FL_INACTIVE);
2000 fl_set_object_lcol(fd_form_preamble->button_apply, FL_INACTIVE);
2003 fl_activate_object(fd_form_preamble->input_preamble);
2004 fl_activate_object(fd_form_preamble->button_ok);
2005 fl_activate_object(fd_form_preamble->button_apply);
2006 fl_set_object_lcol(fd_form_preamble->button_ok, FL_BLACK);
2007 fl_set_object_lcol(fd_form_preamble->button_apply, FL_BLACK);
2009 } else if (fd_form_preamble->form_preamble->visible) {
2010 fl_hide_form(fd_form_preamble->form_preamble);
2015 void MenuLayoutPreamble()
2017 static int ow = -1, oh;
2019 if (UpdateLayoutPreamble()) {
2020 if (fd_form_preamble->form_preamble->visible) {
2021 fl_raise_form(fd_form_preamble->form_preamble);
2023 fl_show_form(fd_form_preamble->form_preamble,
2024 FL_PLACE_MOUSE | FL_FREE_SIZE,
2026 _("LaTeX Preamble"));
2028 ow = fd_form_preamble->form_preamble->w;
2029 oh = fd_form_preamble->form_preamble->h;
2031 fl_set_form_minsize(fd_form_preamble->form_preamble,
2037 void MenuLayoutSave()
2039 if (!current_view->getScreen() || ! current_view->available())
2042 if (AskQuestion(_("Do you want to save the current settings"),
2043 _("for Character, Document, Paper and Quotes"),
2044 _("as default for new documents?")))
2045 current_view->currentBuffer()->saveParamsAsDefaults();
2051 InsetInfo *new_inset = new InsetInfo();
2052 current_view->currentBuffer()->insertInset(new_inset);
2053 new_inset->Edit(0,0);
2054 //current_view->currentBuffer()->update(-1);
2060 if (current_view->available()) {
2061 minibuffer->Set(_("Open/Close..."));
2062 current_view->getScreen()->HideCursor();
2064 current_view->currentBuffer()->update(-2);
2065 current_view->currentBuffer()->text->OpenStuff();
2066 current_view->currentBuffer()->update(0);
2072 if (current_view->available()) {
2073 minibuffer->Set(_("Open/Close..."));
2074 current_view->getScreen()->HideCursor();
2076 current_view->currentBuffer()->update(-2);
2077 current_view->currentBuffer()->text->ToggleFootnote();
2078 current_view->currentBuffer()->update(0);
2085 /* if (current_view->currentBuffer()->the_locking_inset) {
2086 minibuffer->Set(_("Undo not yet supported in math mode"));
2090 if (current_view->available()) {
2091 minibuffer->Set(_("Undo"));
2092 current_view->getScreen()->HideCursor();
2094 current_view->currentBuffer()->update(-2);
2095 if (!current_view->currentBuffer()->text->TextUndo())
2096 minibuffer->Set(_("No further undo information"));
2098 current_view->currentBuffer()->update(-1);
2105 if (current_view->currentBuffer()->the_locking_inset) {
2106 minibuffer->Set(_("Redo not yet supported in math mode"));
2110 if (current_view->available()) {
2111 minibuffer->Set(_("Redo"));
2112 current_view->getScreen()->HideCursor();
2114 current_view->currentBuffer()->update(-2);
2115 if (!current_view->currentBuffer()->text->TextRedo())
2116 minibuffer->Set(_("No further redo information"));
2118 current_view->currentBuffer()->update(-1);
2123 void HyphenationPoint()
2125 if (current_view->available()) {
2126 current_view->getScreen()->HideCursor();
2127 current_view->currentBuffer()->update(-2);
2128 InsetSpecialChar *new_inset =
2129 new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
2130 current_view->currentBuffer()->insertInset(new_inset);
2131 //current_view->currentBuffer()->update(-1);
2138 if (current_view->available()) {
2139 current_view->getScreen()->HideCursor();
2140 current_view->currentBuffer()->update(-2);
2141 InsetSpecialChar *new_inset =
2142 new InsetSpecialChar(InsetSpecialChar::LDOTS);
2143 current_view->currentBuffer()->insertInset(new_inset);
2148 void EndOfSentenceDot()
2150 if (current_view->available()) {
2151 current_view->getScreen()->HideCursor();
2152 current_view->currentBuffer()->update(-2);
2153 InsetSpecialChar *new_inset =
2154 new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE);
2155 current_view->currentBuffer()->insertInset(new_inset);
2160 void MenuSeparator()
2162 if (current_view->available()) {
2163 current_view->getScreen()->HideCursor();
2164 current_view->currentBuffer()->update(-2);
2165 InsetSpecialChar *new_inset =
2166 new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR);
2167 current_view->currentBuffer()->insertInset(new_inset);
2168 //current_view->currentBuffer()->update(-1);
2175 if (current_view->available()) {
2176 current_view->getScreen()->HideCursor();
2177 current_view->currentBuffer()->update(-2);
2178 current_view->currentBuffer()->text->InsertChar(LYX_META_NEWLINE);
2179 current_view->currentBuffer()->update(-1);
2184 void ProtectedBlank()
2186 if (current_view->available()) {
2187 current_view->getScreen()->HideCursor();
2188 current_view->currentBuffer()->update(-2);
2189 current_view->currentBuffer()->text->InsertChar(LYX_META_PROTECTED_SEPARATOR);
2190 current_view->currentBuffer()->update(-1);
2197 if (current_view->available()) {
2198 current_view->getScreen()->HideCursor();
2199 current_view->currentBuffer()->update(-2);
2200 current_view->currentBuffer()->text->InsertChar(LYX_META_HFILL);
2201 current_view->currentBuffer()->update(-1);
2206 /* -------> These CB's use ToggleFree() as the (one and only?) font-changer.
2207 They also show the current font state. */
2210 void ToggleAndShow(LyXFont const &);
2213 void FontSizeCB(string const & size)
2215 LyXFont font(LyXFont::ALL_IGNORE);
2216 font.setGUISize(size);
2217 ToggleAndShow(font);
2223 LyXFont font(LyXFont::ALL_IGNORE);
2224 font.setEmph(LyXFont::TOGGLE);
2225 ToggleAndShow(font);
2231 LyXFont font(LyXFont::ALL_IGNORE);
2232 font.setNoun(LyXFont::TOGGLE);
2233 ToggleAndShow(font);
2239 LyXFont font(LyXFont::ALL_IGNORE);
2240 font.setSeries(LyXFont::BOLD_SERIES);
2241 ToggleAndShow(font);
2247 LyXFont font(LyXFont::ALL_IGNORE);
2248 font.setUnderbar(LyXFont::TOGGLE);
2249 ToggleAndShow(font);
2255 LyXFont font(LyXFont::ALL_IGNORE);
2256 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
2257 ToggleAndShow(font);
2263 LyXFont font(LyXFont::ALL_IGNORE);
2264 font.setFamily(LyXFont::SANS_FAMILY);
2265 ToggleAndShow(font);
2271 LyXFont font(LyXFont::ALL_IGNORE);
2272 font.setFamily(LyXFont::ROMAN_FAMILY);
2273 ToggleAndShow(font);
2279 LyXFont font(LyXFont::ALL_IGNORE);
2280 font.setLatex (LyXFont::TOGGLE);
2281 ToggleAndShow(font);
2287 LyXFont font(LyXFont::ALL_INHERIT);
2288 ToggleAndShow(font);
2292 /* -------> Returns the current font and depth by printing a message. In the
2293 * future perhaps we could try to implement a callback to the button-bar.
2294 * That is, `light' the bold button when the font is currently bold, etc.
2296 string CurrentState()
2299 if (current_view->available()) {
2300 // I think we should only show changes from the default
2302 Buffer * buffer = current_view->currentBuffer();
2303 LyXFont font = buffer->text->real_current_font;
2304 LyXFont defaultfont = lyxstyle.TextClass(buffer->
2305 params.textclass)->defaultfont;
2306 font.reduce(defaultfont);
2307 state = _("Font: ") + font.stateText();
2309 int depth = buffer->text->GetDepth();
2311 state += string(_(", Depth: ")) + tostr(depth);
2317 /* -------> Does the actual toggle job of the XxxCB() calls above.
2318 * Also shows the current font state.
2321 void ToggleAndShow(LyXFont const & font)
2323 if (current_view->available()) {
2324 current_view->getScreen()->HideCursor();
2325 current_view->currentBuffer()->update(-2);
2326 current_view->currentBuffer()->text->ToggleFree(font, toggleall);
2327 current_view->currentBuffer()->update(1);
2329 // removed since it overrides the ToggleFree Message about the style
2330 // Since Styles are more "High Level" than raw fonts I think the user
2331 // prefers it like this Matthias
2332 // FontStateShowCB( 0, 0 );
2336 extern "C" void MarginCB(FL_OBJECT *, long)
2338 if (current_view->available()) {
2339 minibuffer->Set(_("Inserting margin note..."));
2340 current_view->getScreen()->HideCursor();
2341 current_view->currentBuffer()->update(-2);
2342 current_view->currentBuffer()->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
2343 current_view->currentBuffer()->update(1);
2348 extern "C" void FigureCB(FL_OBJECT *, long)
2350 if (fd_form_figure->form_figure->visible) {
2351 fl_raise_form(fd_form_figure->form_figure);
2353 fl_show_form(fd_form_figure->form_figure,
2354 FL_PLACE_MOUSE, FL_FULLBORDER,
2355 _("Insert Figure"));
2360 extern "C" void TableCB(FL_OBJECT *, long)
2362 if (fd_form_table->form_table->visible) {
2363 fl_raise_form(fd_form_table->form_table);
2365 fl_show_form(fd_form_table->form_table,
2366 FL_PLACE_MOUSE, FL_FULLBORDER,
2372 void CopyEnvironmentCB()
2374 if (current_view->available()) {
2375 current_view->currentBuffer()->text->copyEnvironmentType();
2376 /* clear the selection, even if mark_set */
2377 current_view->getScreen()->ToggleSelection();
2378 current_view->currentBuffer()->text->ClearSelection();
2379 current_view->currentBuffer()->update(-2);
2380 minibuffer->Set(_("Paragraph environment type copied"));
2385 void PasteEnvironmentCB()
2387 if (current_view->available()) {
2388 current_view->currentBuffer()->text->pasteEnvironmentType();
2389 minibuffer->Set(_("Paragraph environment type set"));
2390 current_view->currentBuffer()->update(1);
2397 if (current_view->available()) {
2398 current_view->currentBuffer()->text->CopySelection();
2399 /* clear the selection, even if mark_set */
2400 current_view->getScreen()->ToggleSelection();
2401 current_view->currentBuffer()->text->ClearSelection();
2402 current_view->currentBuffer()->update(-2);
2403 minibuffer->Set(_("Copy"));
2410 if (current_view->available()) {
2411 current_view->getScreen()->HideCursor();
2412 current_view->currentBuffer()->update(-2);
2413 current_view->currentBuffer()->text->CutSelection();
2414 current_view->currentBuffer()->update(1);
2415 minibuffer->Set(_("Cut"));
2422 if (!current_view->available()) return;
2424 minibuffer->Set(_("Paste"));
2425 current_view->getScreen()->HideCursor();
2426 /* clear the selection */
2427 current_view->getScreen()->ToggleSelection();
2428 current_view->currentBuffer()->text->ClearSelection();
2429 current_view->currentBuffer()->update(-2);
2432 current_view->currentBuffer()->text->PasteSelection();
2433 current_view->currentBuffer()->update(1);
2435 /* clear the selection */
2436 current_view->getScreen()->ToggleSelection();
2437 current_view->currentBuffer()->text->ClearSelection();
2438 current_view->currentBuffer()->update(-2);
2442 extern "C" void MeltCB(FL_OBJECT *, long)
2444 if (!current_view->available()) return;
2446 minibuffer->Set(_("Melt"));
2447 current_view->getScreen()->HideCursor();
2449 current_view->currentBuffer()->update(-2);
2450 current_view->currentBuffer()->text->MeltFootnoteEnvironment();
2451 current_view->currentBuffer()->update(1);
2455 // Change environment depth.
2456 // if decInc == 0, depth change taking mouse button number into account
2457 // if decInc == 1, increment depth
2458 // if decInc == -1, decrement depth
2459 extern "C" void DepthCB(FL_OBJECT *ob, long decInc)
2463 /* When decInc != 0, fake a mouse button. This allows us to
2464 implement depth-plus and depth-min commands. RVDK_PATCH_5. */
2465 /* check out wether ob is defined, too (Matthias) */
2468 else if (!decInc && ob) {
2469 button = fl_get_button_numb(ob);
2472 if (current_view->available()) {
2473 current_view->getScreen()->HideCursor();
2474 current_view->currentBuffer()->update(-2);
2476 current_view->currentBuffer()->text->IncDepth();
2478 current_view->currentBuffer()->text->DecDepth();
2479 current_view->currentBuffer()->update(1);
2480 minibuffer->Set(_("Changed environment depth"
2481 " (in possible range, maybe not)"));
2486 // This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
2487 // Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
2488 LyXFont UserFreeFont()
2490 LyXFont font(LyXFont::ALL_IGNORE);
2493 pos = fl_get_choice(fd_form_character->choice_family);
2495 case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
2496 case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
2497 case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
2498 case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
2499 case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
2502 pos = fl_get_choice(fd_form_character->choice_series);
2504 case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
2505 case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
2506 case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
2507 case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
2510 pos = fl_get_choice(fd_form_character->choice_shape);
2512 case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
2513 case 2: font.setShape(LyXFont::UP_SHAPE); break;
2514 case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
2515 case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
2516 case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
2517 case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
2520 pos = fl_get_choice(fd_form_character->choice_size);
2522 case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
2523 case 2: font.setSize(LyXFont::SIZE_TINY); break;
2524 case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
2525 case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
2526 case 5: font.setSize(LyXFont::SIZE_SMALL); break;
2527 case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
2528 case 7: font.setSize(LyXFont::SIZE_LARGE); break;
2529 case 8: font.setSize(LyXFont::SIZE_LARGER); break;
2530 case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
2531 case 10: font.setSize(LyXFont::SIZE_HUGE); break;
2532 case 11: font.setSize(LyXFont::SIZE_HUGER); break;
2533 case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
2534 case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
2535 case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
2538 pos = fl_get_choice(fd_form_character->choice_bar);
2540 case 1: font.setEmph(LyXFont::IGNORE);
2541 font.setUnderbar(LyXFont::IGNORE);
2542 font.setNoun(LyXFont::IGNORE);
2543 font.setLatex(LyXFont::IGNORE);
2545 case 2: font.setEmph(LyXFont::TOGGLE); break;
2546 case 3: font.setUnderbar(LyXFont::TOGGLE); break;
2547 case 4: font.setNoun(LyXFont::TOGGLE); break;
2548 case 5: font.setLatex(LyXFont::TOGGLE); break;
2549 case 6: font.setEmph(LyXFont::INHERIT);
2550 font.setUnderbar(LyXFont::INHERIT);
2551 font.setNoun(LyXFont::INHERIT);
2552 font.setLatex(LyXFont::INHERIT);
2556 pos = fl_get_choice(fd_form_character->choice_color);
2558 case 1: font.setColor(LyXFont::IGNORE_COLOR); break;
2559 case 2: font.setColor(LyXFont::NONE); break;
2560 case 3: font.setColor(LyXFont::BLACK); break;
2561 case 4: font.setColor(LyXFont::WHITE); break;
2562 case 5: font.setColor(LyXFont::RED); break;
2563 case 6: font.setColor(LyXFont::GREEN); break;
2564 case 7: font.setColor(LyXFont::BLUE); break;
2565 case 8: font.setColor(LyXFont::CYAN); break;
2566 case 9: font.setColor(LyXFont::MAGENTA); break;
2567 case 10: font.setColor(LyXFont::YELLOW); break;
2568 case 11: font.setColor(LyXFont::INHERIT_COLOR); break;
2577 ToggleAndShow(UserFreeFont());
2581 /* callbacks for form form_title */
2582 extern "C" void TimerCB(FL_OBJECT *, long)
2584 // only if the form still exists
2585 if (fd_form_title->form_title != 0) {
2586 if (fd_form_title->form_title->visible) {
2587 fl_hide_form(fd_form_title->form_title);
2589 fl_free_form(fd_form_title->form_title);
2590 fd_form_title->form_title = 0;
2595 /* callbacks for form form_paragraph */
2597 extern "C" void ParagraphVSpaceCB(FL_OBJECT* obj, long )
2599 // "Synchronize" the choices and input fields, making it
2600 // impossible to commit senseless data.
2602 const FD_form_paragraph* fp = fd_form_paragraph;
2604 if (obj == fp->choice_space_above) {
2605 if (fl_get_choice (fp->choice_space_above) != 7) {
2606 fl_set_input (fp->input_space_above, "");
2607 ActivateParagraphButtons();
2609 } else if (obj == fp->choice_space_below) {
2610 if (fl_get_choice (fp->choice_space_below) != 7) {
2611 fl_set_input (fp->input_space_below, "");
2612 ActivateParagraphButtons();
2614 } else if (obj == fp->input_space_above) {
2615 string input = fl_get_input (fp->input_space_above);
2617 if (input.empty()) {
2618 fl_set_choice (fp->choice_space_above, 1);
2619 ActivateParagraphButtons();
2621 else if (isValidGlueLength (input)) {
2622 fl_set_choice (fp->choice_space_above, 7);
2623 ActivateParagraphButtons();
2626 fl_set_choice (fp->choice_space_above, 7);
2627 DeactivateParagraphButtons();
2629 } else if (obj == fp->input_space_below) {
2630 string input = fl_get_input (fp->input_space_below);
2632 if (input.empty()) {
2633 fl_set_choice (fp->choice_space_below, 1);
2634 ActivateParagraphButtons();
2636 else if (isValidGlueLength (input)) {
2637 fl_set_choice (fp->choice_space_below, 7);
2638 ActivateParagraphButtons();
2641 fl_set_choice (fp->choice_space_below, 7);
2642 DeactivateParagraphButtons();
2648 extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
2650 if (!current_view->available())
2653 bool line_top, line_bottom;
2654 bool pagebreak_top, pagebreak_bottom;
2655 VSpace space_top, space_bottom;
2657 string labelwidthstring;
2660 // If a vspace kind is "Length" but there's no text in
2661 // the input field, reset the kind to "None".
2662 if (fl_get_choice (fd_form_paragraph->choice_space_above) == 7
2663 && !*(fl_get_input (fd_form_paragraph->input_space_above))) {
2664 fl_set_choice (fd_form_paragraph->choice_space_above, 1);
2666 if (fl_get_choice (fd_form_paragraph->choice_space_below) == 7
2667 && !*(fl_get_input (fd_form_paragraph->input_space_below))) {
2668 fl_set_choice (fd_form_paragraph->choice_space_below, 1);
2671 line_top = fl_get_button(fd_form_paragraph->check_lines_top);
2672 line_bottom = fl_get_button(fd_form_paragraph->check_lines_bottom);
2673 pagebreak_top = fl_get_button(fd_form_paragraph->check_pagebreaks_top);
2674 pagebreak_bottom = fl_get_button(fd_form_paragraph->check_pagebreaks_bottom);
2675 switch (fl_get_choice (fd_form_paragraph->choice_space_above)) {
2676 case 1: space_top = VSpace(VSpace::NONE); break;
2677 case 2: space_top = VSpace(VSpace::DEFSKIP); break;
2678 case 3: space_top = VSpace(VSpace::SMALLSKIP); break;
2679 case 4: space_top = VSpace(VSpace::MEDSKIP); break;
2680 case 5: space_top = VSpace(VSpace::BIGSKIP); break;
2681 case 6: space_top = VSpace(VSpace::VFILL); break;
2682 case 7: space_top = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_above))); break;
2684 if (fl_get_button (fd_form_paragraph->check_space_above))
2685 space_top.setKeep (true);
2686 switch (fl_get_choice (fd_form_paragraph->choice_space_below)) {
2687 case 1: space_bottom = VSpace(VSpace::NONE); break;
2688 case 2: space_bottom = VSpace(VSpace::DEFSKIP); break;
2689 case 3: space_bottom = VSpace(VSpace::SMALLSKIP); break;
2690 case 4: space_bottom = VSpace(VSpace::MEDSKIP); break;
2691 case 5: space_bottom = VSpace(VSpace::BIGSKIP); break;
2692 case 6: space_bottom = VSpace(VSpace::VFILL); break;
2693 case 7: space_bottom = VSpace(LyXGlueLength (fl_get_input (fd_form_paragraph->input_space_below))); break;
2695 if (fl_get_button (fd_form_paragraph->check_space_below))
2696 space_bottom.setKeep (true);
2698 if (fl_get_button(fd_form_paragraph->radio_align_left))
2699 align = LYX_ALIGN_LEFT;
2700 else if (fl_get_button(fd_form_paragraph->radio_align_right))
2701 align = LYX_ALIGN_RIGHT;
2702 else if (fl_get_button(fd_form_paragraph->radio_align_center))
2703 align = LYX_ALIGN_CENTER;
2705 align = LYX_ALIGN_BLOCK;
2707 labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
2708 noindent = fl_get_button(fd_form_paragraph->check_noindent);
2710 current_view->currentBuffer()->text->SetParagraph(line_top,
2719 current_view->currentBuffer()->update(1);
2720 minibuffer->Set(_("Paragraph layout set"));
2724 extern "C" void ParagraphCancelCB(FL_OBJECT *, long)
2726 fl_hide_form(fd_form_paragraph->form_paragraph);
2730 extern "C" void ParagraphOKCB(FL_OBJECT *ob, long data)
2732 ParagraphApplyCB(ob, data);
2733 ParagraphCancelCB(ob, data);
2737 /* callbacks for form form_character */
2739 extern "C" void CharacterApplyCB(FL_OBJECT *, long)
2741 // we set toggleall locally here, since it should be true for
2742 // all other uses of ToggleAndShow() (JMarc)
2743 toggleall = fl_get_button(fd_form_character->check_toggle_all);
2744 ToggleAndShow( UserFreeFont());
2749 extern "C" void CharacterCloseCB(FL_OBJECT *, long)
2751 fl_hide_form(fd_form_character->form_character);
2755 extern "C" void CharacterOKCB(FL_OBJECT *ob, long data)
2757 CharacterApplyCB(ob,data);
2758 CharacterCloseCB(ob,data);
2762 /* callbacks for form form_document */
2764 void UpdateDocumentButtons(BufferParams const ¶ms)
2766 fl_set_choice(fd_form_document->choice_pagestyle, 1);
2768 if (params.sides == 2)
2769 fl_set_button(fd_form_document->radio_sides_two, 1);
2771 fl_set_button(fd_form_document->radio_sides_one, 1);
2773 if (params.columns == 2)
2774 fl_set_button(fd_form_document->radio_columns_two, 1);
2776 fl_set_button(fd_form_document->radio_columns_one, 1);
2778 fl_set_input(fd_form_document->input_extra, params.options.c_str());
2779 fl_set_counter_value(fd_form_document->slider_secnumdepth,
2780 params.secnumdepth);
2781 fl_set_counter_value(fd_form_document->slider_tocdepth,
2786 extern "C" void ChoiceClassCB(FL_OBJECT *ob, long)
2789 if (lyxstyle.Load(fl_get_choice(ob)-1)) {
2790 if (AskQuestion(_("Should I set some parameters to"),
2791 fl_get_choice_text(ob),
2792 _("the defaults of this document class?"))) {
2793 BufferParams params = BufferParams();
2794 params.textclass = fl_get_choice(ob)-1;
2795 params.useClassDefaults();
2796 UpdateLayoutDocument(¶ms);
2797 UpdateDocumentButtons(params);
2800 // unable to load new style
2801 WriteAlert(_("Conversion Errors!"),
2802 _("Unable to switch to new document class."),
2803 _("Reverting to original document class."));
2804 fl_set_choice(fd_form_document->choice_class,
2805 GetCurrentTextClass() + 1);
2811 extern "C" void DocumentDefskipCB(FL_OBJECT *obj, long)
2813 // "Synchronize" the choice and the input field, so that it
2814 // is impossible to commit senseless data.
2815 const FD_form_document* fd = fd_form_document;
2817 if (obj == fd->choice_default_skip) {
2818 if (fl_get_choice (fd->choice_default_skip) != 4) {
2819 fl_set_input (fd->input_default_skip, "");
2820 ActivateDocumentButtons();
2822 } else if (obj == fd->input_default_skip) {
2824 const char* input = fl_get_input (fd->input_default_skip);
2827 fl_set_choice (fd->choice_default_skip, 2);
2828 ActivateDocumentButtons();
2829 } else if (isValidGlueLength (input)) {
2830 fl_set_choice (fd->choice_default_skip, 4);
2831 ActivateDocumentButtons();
2833 fl_set_choice (fd->choice_default_skip, 4);
2834 DeactivateDocumentButtons();
2840 extern "C" void DocumentSpacingCB(FL_OBJECT *obj, long)
2842 // "Synchronize" the choice and the input field, so that it
2843 // is impossible to commit senseless data.
2844 const FD_form_document* fd = fd_form_document;
2846 if (obj == fd->choice_spacing
2847 && fl_get_choice (fd->choice_spacing) != 4) {
2848 fl_set_input(fd->input_spacing, "");
2849 } else if (obj == fd->input_spacing) {
2851 const char* input = fl_get_input (fd->input_spacing);
2854 fl_set_choice (fd->choice_spacing, 1);
2856 fl_set_choice (fd->choice_spacing, 4);
2862 extern "C" void DocumentApplyCB(FL_OBJECT *, long)
2865 BufferParams *params = &(current_view->currentBuffer()->params);
2866 current_view->currentBuffer()->params.language =
2867 combo_language->getline();
2869 // If default skip is a "Length" but there's no text in the
2870 // input field, reset the kind to "Medskip", which is the default.
2871 if (fl_get_choice (fd_form_document->choice_default_skip) == 4
2872 && !*(fl_get_input (fd_form_document->input_default_skip))) {
2873 fl_set_choice (fd_form_document->choice_default_skip, 2);
2876 /* this shouldn't be done automatically IMO. For example I write german
2877 * documents with an american keyboard very often. Matthias */
2879 /* ChangeKeymap(buffer->parameters.language, TRUE, false,
2880 fl_get_choice(fd_form_document->choice_language)); */
2882 fl_get_choice_text(fd_form_document->choice_fonts);
2884 fl_get_choice_text(fd_form_document->choice_inputenc);
2886 fl_get_choice_text(fd_form_document->choice_fontsize);
2888 fl_get_choice_text(fd_form_document->choice_pagestyle);
2889 params->graphicsDriver =
2890 fl_get_choice_text(fd_form_document->choice_postscript_driver);
2891 params->use_amsmath =
2892 fl_get_button(fd_form_document->check_use_amsmath);
2894 if (!current_view->available())
2897 char new_class = fl_get_choice(fd_form_document->choice_class) - 1;
2898 if (params->textclass != new_class) {
2899 // try to load new_class
2900 if (lyxstyle.Load(new_class)) {
2901 // successfully loaded
2903 minibuffer->Set(_("Converting document to new document class..."));
2904 int ret = current_view->currentBuffer()->
2906 SwitchLayoutsBetweenClasses(current_view->currentBuffer()->
2909 current_view->currentBuffer()->
2915 s= _("One paragraph couldn't be converted");
2918 s += _(" paragraphs couldn't be converted");
2920 WriteAlert(_("Conversion Errors!"),s,
2921 _("into chosen document class"));
2924 params->textclass = new_class;
2926 // problem changing class -- warn user and retain old style
2927 WriteAlert(_("Conversion Errors!"),
2928 _("Unable to switch to new document class."),
2929 _("Reverting to original document class."));
2930 fl_set_choice(fd_form_document->choice_class, params->textclass + 1);
2934 char tmpsep = params->paragraph_separation;
2935 if (fl_get_button(fd_form_document->radio_indent))
2936 params->paragraph_separation = LYX_PARSEP_INDENT;
2938 params->paragraph_separation = LYX_PARSEP_SKIP;
2939 if (tmpsep != params->paragraph_separation)
2942 VSpace tmpdefskip = params->getDefSkip();
2943 switch (fl_get_choice (fd_form_document->choice_default_skip)) {
2944 case 1: params->setDefSkip(VSpace(VSpace::SMALLSKIP)); break;
2945 case 2: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2946 case 3: params->setDefSkip(VSpace(VSpace::BIGSKIP)); break;
2947 case 4: params->setDefSkip(
2948 VSpace (LyXGlueLength (fl_get_input
2949 (fd_form_document->input_default_skip))));
2951 // DocumentDefskipCB assures that this never happens
2952 default: params->setDefSkip(VSpace(VSpace::MEDSKIP)); break;
2954 if (!(tmpdefskip == params->getDefSkip()))
2957 if (fl_get_button(fd_form_document->radio_columns_two))
2958 params->columns = 2;
2960 params->columns = 1;
2961 if (fl_get_button(fd_form_document->radio_sides_two))
2966 Spacing tmpSpacing = params->spacing;
2967 switch(fl_get_choice(fd_form_document->choice_spacing)) {
2969 lyxerr.debug() << "Spacing: SINGLE" << endl;
2970 params->spacing.set(Spacing::Single);
2973 lyxerr.debug() << "Spacing: ONEHALF" << endl;
2974 params->spacing.set(Spacing::Onehalf);
2977 lyxerr.debug() << "Spacing: DOUBLE" << endl;
2978 params->spacing.set(Spacing::Double);
2981 lyxerr.debug() << "Spacing: OTHER" << endl;
2982 params->spacing.set(Spacing::Other,
2983 fl_get_input(fd_form_document->input_spacing));
2986 if (tmpSpacing != params->spacing)
2989 signed char tmpchar = (signed char)
2990 fl_get_counter_value(fd_form_document->slider_secnumdepth);;
2991 if (params->secnumdepth != tmpchar)
2993 params->secnumdepth = tmpchar;
2995 params->tocdepth = (signed char)
2996 fl_get_counter_value(fd_form_document->slider_tocdepth);;
2998 params->float_placement =
2999 fl_get_input(fd_form_document->input_float_placement);
3001 // More checking should be done to ensure the string doesn't have
3002 // spaces or illegal placement characters in it. (thornley)
3005 current_view->redoCurrentBuffer();
3007 minibuffer->Set(_("Document layout set"));
3008 current_view->currentBuffer()->markDirty();
3011 fl_get_input(fd_form_document->input_extra);
3016 extern "C" void DocumentCancelCB(FL_OBJECT *, long)
3018 fl_hide_form(fd_form_document->form_document);
3022 extern "C" void DocumentOKCB(FL_OBJECT *ob, long data)
3024 DocumentCancelCB(ob,data);
3025 DocumentApplyCB(ob,data);
3029 extern "C" void DocumentBulletsCB(FL_OBJECT *, long)
3032 // bullet callbacks etc. in bullet_panel.C -- ARRae
3038 if (!current_view->getScreen())
3041 current_view->getScreen()->HideCursor();
3043 current_view->currentBuffer()->update(-2);
3046 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3047 if (current_view->currentBuffer()->text->cursor.pos
3048 || current_view->currentBuffer()->text->cursor.par !=
3049 current_view->currentBuffer()->text->FirstParagraph())
3051 tmp = current_view->currentBuffer()->text->cursor;
3052 current_view->currentBuffer()->text->cursor.par =
3053 current_view->currentBuffer()->text->FirstParagraph();
3054 current_view->currentBuffer()->text->cursor.pos = 0;
3055 if (!current_view->currentBuffer()->text->GotoNextNote()) {
3056 current_view->currentBuffer()->text->cursor = tmp;
3057 minibuffer->Set(_("No more notes"));
3061 minibuffer->Set(_("No more notes"));
3065 current_view->currentBuffer()->update(0);
3066 current_view->currentBuffer()->text->sel_cursor =
3067 current_view->currentBuffer()->text->cursor;
3071 void InsertCorrectQuote()
3073 Buffer *cbuffer = current_view->currentBuffer();
3076 if (cbuffer->text->cursor.pos )
3077 c = cbuffer->text->cursor.par->GetChar(cbuffer->text->cursor.pos - 1);
3081 cbuffer->insertInset(new InsetQuotes(c, cbuffer->params));
3085 /* callbacks for form form_quotes */
3087 extern "C" void QuotesApplyCB(FL_OBJECT *, long)
3089 if (!current_view->available())
3092 minibuffer->Set(_("Quotes type set"));
3093 //current_view->currentBuffer()->params.quotes_language =
3094 // fl_get_choice(fd_form_quotes->choice_quotes_language) - 1;
3095 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
3096 switch(fl_get_choice(fd_form_quotes->choice_quotes_language) - 1) {
3098 lga = InsetQuotes::EnglishQ;
3101 lga = InsetQuotes::SwedishQ;
3104 lga = InsetQuotes::GermanQ;
3107 lga = InsetQuotes::PolishQ;
3110 lga = InsetQuotes::FrenchQ;
3113 lga = InsetQuotes::DanishQ;
3116 current_view->currentBuffer()->params.quotes_language = lga;
3117 if (fl_get_button(fd_form_quotes->radio_single))
3118 current_view->currentBuffer()->
3119 params.quotes_times = InsetQuotes::SingleQ;
3121 current_view->currentBuffer()->
3122 params.quotes_times = InsetQuotes::DoubleQ;
3126 extern "C" void QuotesCancelCB(FL_OBJECT *, long)
3128 fl_hide_form(fd_form_quotes->form_quotes);
3132 extern "C" void QuotesOKCB(FL_OBJECT *ob, long data)
3134 QuotesApplyCB(ob, data);
3135 QuotesCancelCB(ob, data);
3140 /* callbacks for form form_preamble */
3142 extern "C" void PreambleCancelCB(FL_OBJECT *, long)
3144 fl_hide_form(fd_form_preamble->form_preamble);
3148 extern "C" void PreambleApplyCB(FL_OBJECT *, long)
3150 if (!current_view->available())
3153 current_view->currentBuffer()->params.preamble =
3154 fl_get_input(fd_form_preamble->input_preamble);
3155 current_view->currentBuffer()->markDirty();
3156 minibuffer->Set(_("LaTeX preamble set"));
3160 extern "C" void PreambleOKCB(FL_OBJECT *ob, long data)
3162 PreambleApplyCB(ob, data);
3163 PreambleCancelCB(ob, data);
3167 /* callbacks for form form_table */
3169 extern "C" void TableApplyCB(FL_OBJECT *, long)
3172 if (!current_view->getScreen())
3175 // check for tables in tables
3176 if (current_view->currentBuffer()->text->cursor.par->table){
3177 WriteAlert(_("Impossible Operation!"),
3178 _("Cannot insert table in table."),
3183 minibuffer->Set(_("Inserting table..."));
3185 ysize = (int)(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
3186 xsize = (int)(fl_get_slider_value(fd_form_table->slider_rows) + 0.5);
3189 current_view->getScreen()->HideCursor();
3191 current_view->currentBuffer()->update(-2);
3193 current_view->currentBuffer()->text->SetCursorParUndo();
3194 current_view->currentBuffer()->text->FreezeUndo();
3196 current_view->currentBuffer()->text->BreakParagraph();
3197 current_view->currentBuffer()->update(-1);
3199 if (current_view->currentBuffer()->text->cursor.par->Last()) {
3200 current_view->currentBuffer()->text->CursorLeft();
3202 current_view->currentBuffer()->text->BreakParagraph();
3203 current_view->currentBuffer()->update(-1);
3206 current_view->currentBuffer()->text->current_font.setLatex(LyXFont::OFF);
3207 //if (!fl_get_button(fd_form_table->check_latex)){
3208 // insert the new wysiwy table
3209 current_view->currentBuffer()->text->SetLayout(0); // standard layout
3210 if (current_view->currentBuffer()->text->cursor.par->footnoteflag ==
3211 LyXParagraph::NO_FOOTNOTE) {
3212 current_view->currentBuffer()->
3213 text->SetParagraph(0, 0,
3215 VSpace (0.3 * current_view->currentBuffer()->
3216 params.spacing.getValue(),
3218 VSpace (0.3 * current_view->currentBuffer()->
3219 params.spacing.getValue(),
3226 current_view->currentBuffer()->text->SetParagraph(0, 0,
3228 VSpace(VSpace::NONE),
3229 VSpace(VSpace::NONE),
3234 current_view->currentBuffer()->text->cursor.par->table = new LyXTable(xsize, ysize);
3236 for (i=0; i<xsize * ysize - 1; i++)
3237 current_view->currentBuffer()->text->cursor.par->InsertChar(0,LYX_META_NEWLINE);
3238 current_view->currentBuffer()->text->RedoParagraph();
3240 current_view->currentBuffer()->text->UnFreezeUndo();
3242 current_view->currentBuffer()->update(1);
3243 minibuffer->Set(_("Table inserted"));
3247 extern "C" void TableCancelCB(FL_OBJECT *, long)
3249 fl_hide_form(fd_form_table->form_table);
3253 extern "C" void TableOKCB(FL_OBJECT *ob, long data)
3255 TableApplyCB(ob,data);
3256 TableCancelCB(ob,data);
3260 /* callbacks for form form_print */
3262 extern "C" void PrintCancelCB(FL_OBJECT *, long)
3264 fl_hide_form(fd_form_print->form_print);
3267 static bool stringOnlyContains (string const & LStr, const char * cset)
3269 const char * cstr = LStr.c_str() ;
3271 return strspn(cstr,cset) == strlen(cstr) ;
3274 extern "C" void PrintApplyCB(FL_OBJECT *, long)
3276 if (!current_view->available())
3278 Buffer *buffer = current_view->currentBuffer();
3279 string path = OnlyPath(buffer->getFileName());
3282 if (fl_get_button(fd_form_print->radio_even_pages))
3283 pageflag = lyxrc->print_evenpage_flag + ' ';
3284 else if (fl_get_button(fd_form_print->radio_odd_pages))
3285 pageflag = lyxrc->print_oddpage_flag + ' ';
3287 // Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
3288 // User may give a page (range) list
3289 // User may print multiple (unsorted) copies
3290 string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
3291 pages = subst(pages, '+',',');
3292 pages = frontStrip(strip(pages)) ;
3293 while (!pages.empty()) { // a page range was given
3295 pages = split (pages, piece, ',') ;
3296 piece = strip(piece) ;
3297 piece = frontStrip(piece) ;
3298 if ( !stringOnlyContains (piece, "0123456789-") ) {
3299 WriteAlert(_("ERROR! Unable to print!"),
3300 _("Check 'range of pages'!"));
3303 if (piece.find('-') == string::npos) { // not found
3304 pageflag += lyxrc->print_pagerange_flag + piece + '-' + piece + ' ' ;
3305 } else if (suffixIs(piece, "-") ) { // missing last page
3306 pageflag += lyxrc->print_pagerange_flag + piece + "1000 ";
3307 } else if (prefixIs(piece, "-") ) { // missing first page
3308 pageflag += lyxrc->print_pagerange_flag + '1' + piece + ' ' ;
3310 pageflag += lyxrc->print_pagerange_flag + piece + ' ' ;
3314 string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
3315 if (!copies.empty()) { // a number of copies was given
3316 if ( !stringOnlyContains (copies, "0123456789") ) {
3317 WriteAlert(_("ERROR! Unable to print!"),
3318 _("Check 'number of copies'!"));
3321 if (fl_get_button(fd_form_print->do_unsorted))
3322 pageflag += lyxrc->print_copies_flag;
3324 pageflag += lyxrc->print_collcopies_flag;
3325 pageflag += " " + copies + ' ' ;
3329 if (fl_get_button(fd_form_print->radio_order_reverse))
3330 reverseflag = lyxrc->print_reverse_flag + ' ';
3332 string orientationflag;
3333 if (buffer->params.orientation == ORIENTATION_LANDSCAPE)
3334 orientationflag = lyxrc->print_landscape_flag + ' ';
3336 string ps_file = SpaceLess(fl_get_input(fd_form_print->input_file));
3337 string printer = strip(fl_get_input(fd_form_print->input_printer));
3340 if (lyxrc->print_adapt_output // printer name should be passed to dvips
3341 && ! printer.empty()) // a printer name has been given
3342 printerflag = lyxrc->print_to_printer + printer + ' ';
3345 if (!lyxrc->print_extra_options.empty())
3346 extraflags = lyxrc->print_extra_options + ' ';
3348 string command = lyxrc->print_command + ' '
3349 + printerflag + pageflag + reverseflag
3350 + orientationflag + extraflags;
3352 char real_papersize = buffer->params.papersize;
3353 if (real_papersize == PAPER_DEFAULT)
3354 real_papersize = lyxrc->default_papersize;
3358 switch (real_papersize) {
3359 case PAPER_USLETTER:
3374 case PAPER_EXECUTIVEPAPER:
3377 case PAPER_LEGALPAPER:
3380 default: /* If nothing else fits, keep an empty value... */
3384 if (buffer->params.use_geometry
3385 && buffer->params.papersize2 == VM_PAPER_CUSTOM
3386 && !lyxrc->print_paper_dimension_flag.empty()
3387 && !buffer->params.paperwidth.empty()
3388 && !buffer->params.paperheight.empty()) {
3389 // using a custom papersize
3391 command += lyxrc->print_paper_dimension_flag + ' ';
3392 command += buffer->params.paperwidth + ',';
3393 command += buffer->params.paperheight + ' ';
3394 } else if (!lyxrc->print_paper_flag.empty()
3396 && (real_papersize != PAPER_USLETTER ||
3397 buffer->params.orientation == ORIENTATION_PORTRAIT)) {
3398 command += " " + lyxrc->print_paper_flag + " " + paper + " ";
3400 if (fl_get_button(fd_form_print->radio_file))
3401 command += lyxrc->print_to_file + '\"'
3402 + MakeAbsPath(ps_file, path)
3404 else if (!lyxrc->print_spool_command.empty())
3405 command += lyxrc->print_to_file
3406 + '\"' + ps_file + '\"';
3408 // push directorypath, if necessary
3409 if (lyxrc->use_tempdir || (IsDirWriteable(path) < 1)){
3410 path = buffer->tmppath;
3415 if (!lyxrc->print_spool_command.empty() &&
3416 !fl_get_button(fd_form_print->radio_file)) {
3417 string command2 = lyxrc->print_spool_command + ' ';
3418 if (!printer.empty())
3419 command2 += lyxrc->print_spool_printerprefix
3421 // First run dvips and, if succesful, then spool command
3422 if ((result = RunScript(buffer, true, command))) {
3423 result = RunScript(buffer, false, command2, ps_file);
3426 result = RunScript(buffer, false, command);
3429 WriteAlert(_("Error:"),
3430 _("Unable to print"),
3431 _("Check that your parameters are correct"));
3435 extern "C" void PrintOKCB(FL_OBJECT *ob, long data)
3437 PrintCancelCB(ob, data);
3438 PrintApplyCB(ob,data);
3442 /* callbacks for form form_figure */
3444 extern "C" void FigureApplyCB(FL_OBJECT *, long)
3446 if (!current_view->available())
3449 Buffer * buffer = current_view->currentBuffer();
3450 if(buffer->isReadonly()) // paranoia
3453 minibuffer->Set(_("Inserting figure..."));
3454 if (fl_get_button(fd_form_figure->radio_inline)
3455 || buffer->text->cursor.par->table) {
3456 InsetFig * new_inset = new InsetFig(100, 20, buffer);
3457 buffer->insertInset(new_inset);
3458 minibuffer->Set(_("Figure inserted"));
3459 new_inset->Edit(0, 0);
3463 current_view->getScreen()->HideCursor();
3467 buffer->text->SetCursorParUndo();
3468 buffer->text->FreezeUndo();
3470 buffer->text->BreakParagraph();
3473 if (buffer->text->cursor.par->Last()) {
3474 buffer->text->CursorLeft();
3476 buffer->text->BreakParagraph();
3480 // The standard layout should always be numer 0;
3481 buffer->text->SetLayout(0);
3483 if (buffer->text->cursor.par->footnoteflag ==
3484 LyXParagraph::NO_FOOTNOTE) {
3485 buffer->text->SetParagraph(0, 0,
3487 VSpace (0.3 * buffer->params.spacing.getValue(),
3490 buffer->params.spacing.getValue(),
3492 LYX_ALIGN_CENTER, string(), 0);
3494 buffer->text->SetParagraph(0, 0,
3496 VSpace(VSpace::NONE),
3497 VSpace(VSpace::NONE),
3504 Inset *new_inset = 0;
3506 new_inset = new InsetFig(100, 100, buffer);
3507 buffer->insertInset(new_inset);
3508 new_inset->Edit(0, 0);
3510 minibuffer->Set(_("Figure inserted"));
3511 buffer->text->UnFreezeUndo();
3515 extern "C" void FigureCancelCB(FL_OBJECT *, long)
3517 fl_hide_form(fd_form_figure->form_figure);
3521 extern "C" void FigureOKCB(FL_OBJECT *ob, long data)
3523 FigureApplyCB(ob,data);
3524 FigureCancelCB(ob,data);
3527 extern "C" void ScreenApplyCB(FL_OBJECT *, long)
3529 lyxrc->roman_font_name = fl_get_input(fd_form_screen->input_roman);
3530 lyxrc->sans_font_name = fl_get_input(fd_form_screen->input_sans);
3531 lyxrc->typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
3532 lyxrc->font_norm = fl_get_input(fd_form_screen->input_font_norm);
3533 lyxrc->zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
3534 fontloader.update();
3536 // All buffers will need resize
3537 bufferlist.resize();
3539 minibuffer->Set(_("Screen options set"));
3543 extern "C" void ScreenCancelCB(FL_OBJECT *, long)
3545 fl_hide_form(fd_form_screen->form_screen);
3549 extern "C" void ScreenOKCB(FL_OBJECT *ob, long data)
3551 ScreenCancelCB(ob,data);
3552 ScreenApplyCB(ob,data);
3558 if (!current_view->available())
3561 fl_set_button(fd_latex_options->accents,
3562 (int)current_view->currentBuffer()->params.allowAccents);
3564 if (fd_latex_options->LaTeXOptions->visible) {
3565 fl_raise_form(fd_latex_options->LaTeXOptions);
3567 fl_show_form(fd_latex_options->LaTeXOptions,
3568 FL_PLACE_MOUSE, FL_FULLBORDER,
3569 _("LaTeX Options"));
3574 // This function runs "configure" and then rereads lyx.defaults to
3575 // reconfigure the automatic settings.
3578 minibuffer->Set(_("Running configure..."));
3580 // Run configure in user lyx directory
3581 Path p(user_lyxdir);
3582 Systemcalls one(Systemcalls::System,
3583 AddName(system_lyxdir,"configure"));
3585 minibuffer->Set(_("Reloading configuration..."));
3586 lyxrc->Read(LibFileSearch(string(), "lyxrc.defaults"));
3587 WriteAlert(_("The system has been reconfigured."),
3588 _("You need to restart LyX to make use of any"),
3589 _("updated document class specifications."));
3593 /* these functions are for the spellchecker */
3594 char* NextWord(float &value)
3596 if (!current_view->available()){
3601 char* string = current_view->currentBuffer()->text->SelectNextWord(value);
3607 void SelectLastWord()
3609 if (!current_view->available())
3612 current_view->getScreen()->HideCursor();
3614 current_view->currentBuffer()->text->SelectSelectedWord();
3615 current_view->getScreen()->ToggleSelection(false);
3616 current_view->currentBuffer()->update(0);
3620 void EndOfSpellCheck()
3622 if (!current_view->available())
3625 current_view->getScreen()->HideCursor();
3627 current_view->currentBuffer()->text->SelectSelectedWord();
3628 current_view->currentBuffer()->text->ClearSelection();
3629 current_view->currentBuffer()->update(0);
3633 void ReplaceWord(string const & replacestring)
3635 if (!current_view->getScreen())
3638 current_view->getScreen()->HideCursor();
3639 current_view->currentBuffer()->update(-2);
3641 /* clear the selection (if there is any) */
3642 current_view->getScreen()->ToggleSelection(false);
3643 current_view->currentBuffer()->text->
3644 ReplaceSelectionWithString(replacestring.c_str());
3646 current_view->currentBuffer()->text->SetSelectionOverString(replacestring.c_str());
3648 // Go back so that replacement string is also spellchecked
3649 for (string::size_type i = 0; i < replacestring.length() + 1; ++i) {
3650 current_view->currentBuffer()->text->CursorLeftIntern();
3652 current_view->currentBuffer()->update(1);
3654 // End of spellchecker stuff
3659 // Table of Contents
3669 static TocList* toclist = 0;
3672 extern "C" void TocSelectCB(FL_OBJECT *ob, long)
3674 if (!current_view->available())
3677 TocList* tmptoclist = toclist;
3678 int i = fl_get_browser(ob);
3681 for (a=1; a<i && tmptoclist->next; a++){
3682 tmptoclist = tmptoclist->next;
3689 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3690 while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
3691 par->GetFirstCounter(1) != tmptoclist->counter[1] ||
3692 par->GetFirstCounter(2) != tmptoclist->counter[2] ||
3693 par->GetFirstCounter(3) != tmptoclist->counter[3] ||
3694 par->GetFirstCounter(4) != tmptoclist->counter[4] ||
3695 par->GetFirstCounter(5) != tmptoclist->counter[5] ||
3696 par->appendix != tmptoclist->appendix)) {
3697 par = par->LastPhysicalPar()->Next();
3702 current_view->currentBuffer()->text->SetCursor(par, 0);
3703 current_view->currentBuffer()->text->sel_cursor =
3704 current_view->currentBuffer()->text->cursor;
3705 current_view->currentBuffer()->update(0);
3708 WriteAlert(_("Error"),
3709 _("Couldn't find this label"),
3710 _("in current document."));
3716 extern "C" void TocCancelCB(FL_OBJECT *, long)
3718 fl_hide_form(fd_form_toc->form_toc);
3722 extern "C" void TocUpdateCB(FL_OBJECT *, long)
3724 static LyXParagraph* stapar = 0;
3725 TocList *tmptoclist = 0;
3727 /* deleted the toclist */
3730 tmptoclist = toclist->next;
3732 toclist = tmptoclist;
3736 tmptoclist = toclist;
3739 fl_clear_browser(fd_form_toc->browser_toc);
3740 if (!current_view->available()) {
3741 fl_add_browser_line(fd_form_toc->browser_toc, _("*** No Document ***"));
3744 fl_hide_object(fd_form_toc->browser_toc);
3745 /* get the table of contents */
3746 LyXParagraph *par = current_view->currentBuffer()->paragraph;
3748 char* line = new char[200];
3755 topline = fl_get_browser_topline(fd_form_toc->browser_toc);
3759 labeltype = lyxstyle.Style(current_view->currentBuffer()->params.textclass,
3760 par->GetLayout())->labeltype;
3762 if (labeltype >= LABEL_COUNTER_CHAPTER
3763 && labeltype <= LABEL_COUNTER_CHAPTER +
3764 current_view->currentBuffer()->params.tocdepth) {
3765 /* insert this into the table of contents */
3766 /* first indent a little bit */
3770 lyxstyle.TextClass(current_view->currentBuffer()->
3771 params.textclass)->maxcounter) * 4 + 2;
3775 // Then the labestring
3777 if (!par->labelstring.empty()) {
3778 string::size_type i = 0;
3779 while (pos < 199 && i < par->labelstring.length()) {
3780 line[pos] = par->labelstring[i];
3789 /* now the contents */
3791 while (pos < 199 && i < par->last) {
3792 c = par->GetChar(i);
3793 if (isprint((unsigned char) c) || c >= 128) {
3800 fl_add_browser_line(fd_form_toc->browser_toc, line);
3802 /* make a toclist entry */
3804 tmptoclist = new TocList;
3805 toclist = tmptoclist;
3807 tmptoclist->next = new TocList;
3808 tmptoclist = tmptoclist->next;
3811 tmptoclist->next = 0;
3813 for (a=0; a<6; a++){
3814 tmptoclist->counter[a] = par->GetFirstCounter(a);
3816 tmptoclist->appendix = par->appendix;
3818 par = par->LastPhysicalPar()->Next();
3822 fl_set_browser_topline(fd_form_toc->browser_toc, topline);
3823 fl_show_object(fd_form_toc->browser_toc);
3827 /* callbacks for form form_ref */
3828 extern "C" void RefSelectCB(FL_OBJECT *, long data)
3830 if (!current_view->available())
3834 fl_get_browser_line(fd_form_ref->browser_ref,
3835 fl_get_browser(fd_form_ref->browser_ref));
3836 string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
3842 current_view->getOwner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
3852 if(current_view->currentBuffer()->isSGML())
3853 t += "[" + u + "]" + "{" + s + "}";
3858 new InsetRef(t, current_view->currentBuffer());
3859 current_view->currentBuffer()->insertInset(new_inset);
3863 extern "C" void RefUpdateCB(FL_OBJECT *, long)
3865 if (!current_view->available()) {
3866 fl_clear_browser(fd_form_ref->browser_ref);
3870 FL_OBJECT * brow = fd_form_ref->browser_ref;
3872 // Get the current line, in order to restore it later
3873 char const * const btmp=fl_get_browser_line(brow,
3874 fl_get_browser(brow));
3875 string currentstr=btmp ? btmp : "";
3876 //string currentstr = fl_get_browser_line(brow,
3877 // fl_get_browser(brow));
3879 fl_clear_browser(brow);
3881 string refs = current_view->currentBuffer()->getReferenceList('\n');
3884 #if FL_REVISION > 85
3885 fl_addto_browser_chars(brow,refs.c_str());
3886 int total_lines = fl_get_browser_maxline(brow);
3887 for (int i = 1; i <= total_lines ; i++) {
3888 if (fl_get_browser_line(brow, i) == currentstr) {
3893 fl_set_browser_topline(brow, topline);
3895 // Keep the old ugly code for xforms 0.81 compatibility
3900 curr_ref = refs.token('\n',ref_num);
3901 if (curr_ref.empty())
3903 fl_add_browser_line(brow,curr_ref.c_str());
3908 if (!fl_get_browser_maxline(brow)) {
3909 fl_add_browser_line(brow,
3910 _("*** No labels found in document ***"));
3911 fl_deactivate_object(brow);
3913 fl_select_browser_line(brow, topline);
3914 fl_activate_object(brow);
3916 if (current_view->currentBuffer()->isReadonly()) {
3917 // would be better to de/activate insert buttons
3918 // but that's more work... besides this works. ARRae
3919 fl_hide_form(fd_form_ref->form_ref);
3921 if (!current_view->currentBuffer()->isSGML()) {
3922 fl_deactivate_object(fd_form_ref->ref_name);
3923 fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
3926 fl_activate_object(fd_form_ref->ref_name);
3927 fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
3932 extern "C" void RefHideCB(FL_OBJECT *, long)
3934 fl_hide_form(fd_form_ref->form_ref);
3938 void UpdateInset(Inset* inset, bool mark_dirty)
3943 /* very first check for locking insets*/
3944 if (current_view->currentBuffer()->the_locking_inset == inset){
3945 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3946 current_view->update();
3948 if (current_view->currentBuffer()->isLyxClean())
3949 minibuffer->setTimer(4);
3950 current_view->currentBuffer()->markDirty();
3952 current_view->updateScrollbar();
3957 /* first check the current buffer */
3958 if (current_view->available()){
3959 current_view->getScreen()->HideCursor();
3960 current_view->currentBuffer()->update(-3);
3961 if (current_view->currentBuffer()->text->UpdateInset(inset)){
3963 current_view->currentBuffer()->update(1);
3965 current_view->currentBuffer()->update(3);
3970 // check all buffers
3971 bufferlist.updateInset(inset, mark_dirty);
3976 /* these functions return 1 if an error occured,
3978 int LockInset(UpdatableInset* inset)
3980 if (!current_view->currentBuffer()->the_locking_inset && inset){
3981 current_view->currentBuffer()->the_locking_inset = inset;
3988 void ShowLockedInsetCursor(long x, long y, int asc, int desc)
3990 if (current_view->currentBuffer()->the_locking_inset &&
3991 current_view->getScreen()){
3992 y += current_view->currentBuffer()->text->cursor.y;
3993 current_view->getScreen()->ShowManualCursor(x, y,
3999 void HideLockedInsetCursor(long x, long y, int asc, int desc)
4001 if (current_view->currentBuffer()->the_locking_inset &&
4002 current_view->getScreen()){
4003 y += current_view->currentBuffer()->text->cursor.y;
4004 current_view->getScreen()->HideManualCursor(x, y,
4010 void FitLockedInsetCursor(long x, long y, int asc, int desc)
4012 if (current_view->currentBuffer()->the_locking_inset &&
4013 current_view->getScreen()){
4014 y += current_view->currentBuffer()->text->cursor.y;
4015 if (current_view->getScreen()->FitManualCursor(x, y, asc, desc))
4016 current_view->updateScrollbar();
4021 int UnlockInset(UpdatableInset* inset)
4024 current_view->currentBuffer()->the_locking_inset == inset){
4025 inset->InsetUnlock();
4026 current_view->currentBuffer()->the_locking_inset = 0;
4027 current_view->currentBuffer()->text->FinishUndo();
4030 return bufferlist.unlockInset(inset);
4034 void LockedInsetStoreUndo(Undo::undo_kind kind)
4036 if (!current_view->currentBuffer()->the_locking_inset)
4037 return; // shouldn't happen
4038 if (kind == Undo::EDIT) // in this case insets would not be stored!
4039 kind = Undo::FINISH;
4040 current_view->currentBuffer()->text->SetUndo(kind,
4041 current_view->currentBuffer()->text->cursor.par->
4042 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->previous,
4043 current_view->currentBuffer()->text->cursor.par->
4044 ParFromPos(current_view->currentBuffer()->text->cursor.pos)->next);
4048 void PutInsetIntoInsetUpdateList(Inset* inset)
4051 InsetUpdateStruct* tmp = new InsetUpdateStruct();
4053 tmp->next = InsetUpdateList;
4054 InsetUpdateList = tmp;
4059 void UpdateInsetUpdateList()
4061 InsetUpdateStruct *tmp = InsetUpdateList;
4063 UpdateInset(tmp->inset, false); // "false" because no document change
4067 /* delete the update list */
4068 while (InsetUpdateList) {
4069 tmp = InsetUpdateList;
4070 InsetUpdateList = InsetUpdateList->next;
4073 InsetUpdateList = 0;
4076 #ifdef WITH_WARNINGS
4079 // I know we shouldn't put anything in here but this seems the fastest
4080 // way to do this (and the cleanest for now). This function just inserts
4081 // a newline in the string and the inserts 'depth'-spaces so that the
4082 // code is indented in the right way!!!
4083 void addNewlineAndDepth(string &file, int const depth)
4086 file.append(' ', depth);