From 8d478c5e290221f00ef30dab858686c00d9319c1 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 28 Apr 2000 11:18:04 +0000 Subject: [PATCH] Two patches from Claus; two patches from Andre' (with additional bugfixes) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@703 a592a061-630c-0410-9148-cb99ea01b6c8 --- ChangeLog | 30 ++++ NEWS | 2 +- intl/loadmsgcat.c | 4 + lib/lyxrc.example | 2 +- src/buffer.C | 14 +- src/buffer.h | 4 +- src/lyx_gui.C | 5 + src/lyx_gui.h | 6 +- src/lyx_main.C | 49 ++++++- src/lyxfunc.C | 345 ++++++++++++++++------------------------------ src/lyxfunc.h | 10 +- 11 files changed, 218 insertions(+), 253 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1d67c653c5..097c239464 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +2000-04-27 Claus Hentschel + + * intl/loadmsgcat.c (_nl_load_domain): pass O_BINARY as flag to + open under CYGWIN + + * lib/lyxrc.example: smallish typo in description of + \view_dvi_paper_option + +2000-04-26 André Pönitz + + * src/lyxfunc.h: + * src/lyxfunc.C: doImportHelper to factor out common code of the + various import methods. New functions doImportASCIIasLines, + doImportASCIIasParagraphs, doImportLaTeX, doImportNoWeb, + doImportLinuxDoc for the format specific parts. + + * buffer.h: + * buffer.C: Dispatch returns now a bool to indicate success + + * lyx_gui.h: + * lyx_gui.C: Add getLyXView() for member access + + * lyx_main.C: Change logic for batch commands: First try + Buffer::Dispatch (possibly without GUI), if that fails, use + LyXFunc::Dispatch + + * lyx_main.C: Add support for --import command line switch. + Now 'lyx --import ascii file.txt' opens the GUI with file.txt loaded. + Available Formats: Everything accepted by 'buffer-import ' + 2000-04-27 Lars Gullik Bjønnes * src/lyx_gui.C (create_forms): small oneliner from Garst to have diff --git a/NEWS b/NEWS index e708f0b3c1..7dbb8034d8 100644 --- a/NEWS +++ b/NEWS @@ -133,7 +133,7 @@ branch (which is now extinct). So while on the surface this version is very similar to version 1.0.4, many things happened under the hood. As a consequence of this: expect that some new bugs have crept in. -User visible changes in lyx 1.0.1: +User visible changes in lyx 1.1.1: - New export to HTML feature diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c index 515892dfb8..48e8073242 100644 --- a/intl/loadmsgcat.c +++ b/intl/loadmsgcat.c @@ -85,7 +85,11 @@ _nl_load_domain (domain_file) return; /* Try to open the addressed file. */ +#ifdef CYGWIN32 + fd = open (domain_file->filename, O_RDONLY | O_BINARY); +#else fd = open (domain_file->filename, O_RDONLY); +#endif if (fd == -1) return; diff --git a/lib/lyxrc.example b/lib/lyxrc.example index 7b38b65402..8541debdeb 100644 --- a/lib/lyxrc.example +++ b/lib/lyxrc.example @@ -100,7 +100,7 @@ # not append the -paper option to the dvi command at all. This case is # especially useful when viewing your documents on Windows with yap, # because yap does not allow a command line option for the paper size. -#\view_dvi_paper "" +#\view_dvi_paper_option "" # LyX assumes that the default papersize should be usletter. If this is not # true for your site, use the next line to specify usletter, legal, diff --git a/src/buffer.C b/src/buffer.C index ff679f23e0..1509fb19fb 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -3843,28 +3843,28 @@ void Buffer::markDepClean(string const & name) } -void Buffer::Dispatch(string const & command) +bool Buffer::Dispatch(string const & command) { // Split command string into command and argument string cmd, line = frontStrip(command); string arg = strip(frontStrip(split(line, cmd, ' '))); - Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str()); + return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str()); } -void Buffer::Dispatch(int action, string const & argument) +bool Buffer::Dispatch(int action, string const & argument) { + bool dispatched = true; switch (action) { case LFUN_EXPORT: MenuExport(this, argument); break; default: - lyxerr << "A truly unknown func!" << endl; - break; - - } // end of switch + dispatched = false; + } + return dispatched; } diff --git a/src/buffer.h b/src/buffer.h index 66acf79efb..32f669e59a 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -80,10 +80,10 @@ public: /** high-level interface to buffer functionality This function parses a command string and executes it */ - void Dispatch(string const & command); + bool Dispatch(string const & command); /// Maybe we know the function already by number... - void Dispatch(int ac, string const & argument); + bool Dispatch(int ac, string const & argument); /// should be changed to work for a list. void resize() { diff --git a/src/lyx_gui.C b/src/lyx_gui.C index fe3f6a9a70..4a67a760a8 100644 --- a/src/lyx_gui.C +++ b/src/lyx_gui.C @@ -630,3 +630,8 @@ void LyXGUI::regBuf(Buffer * b) { lyxViews->view()->buffer(b); } + +LyXView * LyXGUI::getLyXView() const +{ + return lyxViews; +} diff --git a/src/lyx_gui.h b/src/lyx_gui.h index 637cfdb2c3..55968e6342 100644 --- a/src/lyx_gui.h +++ b/src/lyx_gui.h @@ -52,8 +52,12 @@ public: */ void init(); - /// Register the buffer with the first fount LyXView in lyxViews + /// Register the buffer with the first found LyXView in lyxViews void regBuf(Buffer*); + + /// Access to (first?) LyXView + LyXView * getLyXView() const; + //@} private: /**@name Construcor */ diff --git a/src/lyx_main.C b/src/lyx_main.C index cc5e5d1a7c..500200cfd6 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -16,6 +16,8 @@ #include "version.h" #include "lyx_main.h" #include "lyx_gui.h" +#include "LyXView.h" +#include "lyxfunc.h" #include "lyx_gui_misc.h" #include "lyxrc.h" #include "support/path.h" @@ -121,13 +123,28 @@ LyX::LyX(int * argc, char * argv[]) } // Execute batch commands if available - if (!batch_command.empty() && last_loaded) { + if (!batch_command.empty()) { lyxerr << "About to handle -x '" << batch_command << "'" << endl; - //Buffer buffer("Script Buffer"); - //buffer.Dispatch(batch_command); - last_loaded->Dispatch(batch_command); - lyxerr << "We are done!" << endl; - return; // Maybe we could do something more clever than aborting.. + + // no buffer loaded, create one + if (!last_loaded) + last_loaded = bufferlist.newFile("tmpfile", string()); + + // try to dispatch to last loaded buffer first + bool dispatched = last_loaded->Dispatch(batch_command); + + // if this was successful, return. + // Maybe we could do something more clever than aborting... + if (dispatched) { + lyxerr << "We are done!" << endl; + return; + } + + // otherwise, let the GUI handle the batch command + lyxGUI->regBuf(last_loaded); + lyxGUI->getLyXView()->getLyXFunc()->Dispatch(batch_command); + + // fall through... } // Let the ball begin... @@ -573,7 +590,27 @@ bool LyX::easyParse(int * argc, char * argv[]) "ps...] after ") << arg << _(" switch!") << endl; } + + else if (arg == "--import") { + if (i + 1 < *argc) { + string type(argv[i+1]); + string file(argv[i+2]); + + (*argc) -= 3; + for (int j = i; j < (*argc); ++j) + argv[j] = argv[j + 3]; + --i; // After shift, check this number again. + + batch_command = "buffer-import " + type + " " + file; + cerr << "batch_command: " << batch_command << endl; + + } else + lyxerr << _("Missing type [eg latex, " + "ps...] after ") + << arg << _(" switch!") << endl; + } } + return gui; } diff --git a/src/lyxfunc.C b/src/lyxfunc.C index fd1b192535..228ad30895 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -744,7 +744,7 @@ string LyXFunc::Dispatch(int ac, MakeDisplayPath(owner->buffer()->fileName()), "..."); MenuWrite(owner->buffer()); - //owner->getMiniBuffer()-> + //owner->getMiniBuffer()-> { // Set(_("Document saved as"), // MakeDisplayPath(owner->buffer()->fileName())); //} else { @@ -797,30 +797,8 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_IMPORT: - { - //needs argument as string - string imtyp = argument; - - // latex - if (imtyp == "latex") { - doImportLaTeX(false); - } - // ascii - else if (imtyp == "ascii") { - doImportASCII(false); - } else if (imtyp == "asciiparagraph") { - doImportASCII(true); - // noweb - } else if (imtyp == "noweb") { - doImportLaTeX(true); - } else if (imtyp == "linuxdoc") { - doImportLinuxDoc(); - } else { - setErrorMessage(string(N_("Unknown import type: ")) - + imtyp); - } + doImport(argument); break; - } case LFUN_QUIT: QuitLyX(); @@ -2880,53 +2858,66 @@ void LyXFunc::MenuOpen() } } +// returns filename if file must be imported, +// empty string if either file not found or already loaded +// checks for running without gui are missing. -void LyXFunc::doImportASCII(bool linorpar) +void LyXFunc::doImportHelper( + string const & file, // filename (possibly empty) + string const & text, // info when asking for filename + string const & pattern, // filetype + bool func(BufferView *, string const &) // the real import function +) { - string initpath = lyxrc.document_path; - LyXFileDlg fileDlg; - - if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; - // If directory is writeable, use this as default. - if (IsDirWriteable(trypath) == 1) - initpath = trypath; + string filename = file; + + if (filename.empty()) { // need user interaction + string initpath = lyxrc.document_path; + LyXFileDlg fileDlg; + + if (owner->view()->available()) { + string trypath = owner->buffer()->filepath; + // If directory is writeable, use this as default. + if (IsDirWriteable(trypath) == 1) + initpath = trypath; + } + + // launches dialog + ProhibitInput(owner->view()); + fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); + fileDlg.SetButton(1, _("Examples"), + AddPath(system_lyxdir, "examples")); + filename = fileDlg.Select(text, initpath, pattern); + AllowInput(owner->view()); + + // check selected filename + if (filename.empty()) + owner->getMiniBuffer()->Set(_("Canceled.")); } - // launches dialog - ProhibitInput(owner->view()); - fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); - fileDlg.SetButton(1, _("Examples"), - AddPath(system_lyxdir, "examples")); - string filename = fileDlg.Select(_("Select ASCII file to Import"), - initpath, "*.txt"); - AllowInput(owner->view()); - - // check selected filename - if (filename.empty()) { - owner->getMiniBuffer()->Set(_("Canceled.")); + // still no filename? abort + if (filename.empty()) return; - } // get absolute path of file filename = MakeAbsPath(filename); - string s = ChangeExtension(filename, ".lyx", false); + string lyxfile = ChangeExtension(filename, ".lyx", false); // Check if the document already is open - if (bufferlist.exists(s)) { + if (bufferlist.exists(lyxfile)) { switch(AskConfirmation(_("Document is already open:"), - MakeDisplayPath(s, 50), + MakeDisplayPath(lyxfile, 50), _("Do you want to close that document now?\n" "('No' will just switch to the open version)"))) { case 1: // Yes: close the document - if (!bufferlist.close(bufferlist.getBuffer(s))) + if (!bufferlist.close(bufferlist.getBuffer(lyxfile))) // If close is canceled, we cancel here too. return; break; case 2: // No: switch to the open document - owner->view()->buffer(bufferlist.getBuffer(s)); + owner->view()->buffer(bufferlist.getBuffer(lyxfile)); return; case 3: // Cancel: Do nothing owner->getMiniBuffer()->Set(_("Canceled.")); @@ -2935,193 +2926,66 @@ void LyXFunc::doImportASCII(bool linorpar) } // Check if a LyX document by the same root exists in filesystem - FileInfo f(s, true); + FileInfo f(lyxfile, true); if (f.exist() && !AskQuestion(_("A document by the name"), - MakeDisplayPath(s), + MakeDisplayPath(lyxfile), _("already exists. Overwrite?"))) { owner->getMiniBuffer()->Set(_("Canceled.")); return; } + // filename should be valid now - owner->view()->buffer(bufferlist.newFile(s, string())); - owner->getMiniBuffer()->Set(_("Importing ASCII file"), - MakeDisplayPath(filename), "..."); - // Insert ASCII file - InsertAsciiFile(owner->view(), filename, linorpar); - owner->getMiniBuffer()->Set(_("ASCII file "), - MakeDisplayPath(filename), - _("imported.")); + // notify user of import ahead + string displaypath = MakeDisplayPath(filename); + owner->view()->buffer(bufferlist.newFile(lyxfile, string())); + owner->getMiniBuffer()->Set(_("Importing"), displaypath, "..."); + + // call real importer + bool result = func(owner->view(), filename); + + // we are done + if (result) + owner->getMiniBuffer()->Set(displaypath, _("imported.")); + else + owner->getMiniBuffer()->Set(displaypath, _(": import failed.")); } - -void LyXFunc::doImportLaTeX(bool isnoweb) +static +bool doImportASCIIasLines(BufferView * view, string const & filename) { - string initpath = lyxrc.document_path; - LyXFileDlg fileDlg; - - if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; - // If directory is writeable, use this as default. - if (IsDirWriteable(trypath) == 1) - initpath = trypath; - } - - // launches dialog - ProhibitInput(owner->view()); - fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); - fileDlg.SetButton(1, _("Examples"), - AddPath(system_lyxdir, "examples")); - string filename; - if (isnoweb) { - filename = fileDlg.Select(_("Select Noweb file to Import"), - initpath, "*.nw"); - } else { - filename = fileDlg.Select(_("Select LaTeX file to Import"), - initpath, "*.tex"); - } - - AllowInput(owner->view()); - - // check selected filename - if (filename.empty()) { - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } - - // get absolute path of file - filename = MakeAbsPath(filename); - - // Check if the document already is open - string LyXfilename = ChangeExtension(filename, ".lyx", false); - if (bufferlist.exists(LyXfilename)){ - switch(AskConfirmation(_("Document is already open:"), - MakeDisplayPath(LyXfilename, 50), - _("Do you want to close that document now?\n" - "('No' will just switch to the open version)"))) - { - case 1: // Yes: close the document - if (!bufferlist.close(bufferlist.getBuffer(LyXfilename))) - // If close is canceled, we cancel here too. - return; - break; - case 2: // No: switch to the open document - owner->view()->buffer( - bufferlist.getBuffer(LyXfilename)); - return; - case 3: // Cancel: Do nothing - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } - } - - // Check if a LyX document by the same root exists in filesystem - FileInfo f(LyXfilename, true); - if (f.exist() && !AskQuestion(_("A document by the name"), - MakeDisplayPath(LyXfilename), - _("already exists. Overwrite?"))) { - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } - - // loads document - Buffer * openbuf; - if (!isnoweb) { - owner->getMiniBuffer()->Set(_("Importing LaTeX file"), - MakeDisplayPath(filename), "..."); - ImportLaTeX myImport(filename); - openbuf = myImport.run(); - } else { - owner->getMiniBuffer()->Set(_("Importing Noweb file"), - MakeDisplayPath(filename), "..."); - ImportNoweb myImport(filename); - openbuf = myImport.run(); - } - if (openbuf) { - owner->view()->buffer(openbuf); - owner->getMiniBuffer()->Set(isnoweb ? - _("Noweb file ") : _("LateX file "), - MakeDisplayPath(filename), - _("imported.")); - } else { - owner->getMiniBuffer()->Set(isnoweb ? - _("Could not import Noweb file") : - _("Could not import LaTeX file"), - MakeDisplayPath(filename)); - } + InsertAsciiFile(view, filename, false); + return true; } - -void LyXFunc::doImportLinuxDoc() +static +bool doImportASCIIasParagraphs(BufferView * view, string const & filename) { - string initpath = lyxrc.document_path; - LyXFileDlg fileDlg; - - if (owner->view()->available()) { - string trypath = owner->buffer()->filepath; - // If directory is writeable, use this as default. - if (IsDirWriteable(trypath) == 1) - initpath = trypath; - } + InsertAsciiFile(view, filename, true); + return true; +} - // launches dialog - ProhibitInput(owner->view()); - fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); - fileDlg.SetButton(1, _("Examples"), - AddPath(system_lyxdir, "examples")); +static +bool doImportLaTeX(BufferView *, string const & filename) +{ + ImportLaTeX myImport(filename); + Buffer * openbuf = myImport.run(); + return openbuf != NULL; +} - string filename = fileDlg.Select(_("Select LinuxDoc file to Import"), - initpath, "*.sgml"); - - AllowInput(owner->view()); - - // check selected filename - if (filename.empty()) { - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } - - // get absolute path of file - filename = MakeAbsPath(filename); - - // Check if the document already is open - string LyXfilename = ChangeExtension(filename, ".lyx", false); - if (bufferlist.exists(LyXfilename)){ - switch(AskConfirmation(_("Document is already open:"), - MakeDisplayPath(LyXfilename, 50), - _("Do you want to close that document now?\n" - "('No' will just switch to the open version)"))) - { - case 1: // Yes: close the document - if (!bufferlist.close(bufferlist.getBuffer(LyXfilename))) - // If close is canceled, we cancel here too. - return; - break; - case 2: // No: switch to the open document - owner->view()->buffer( - bufferlist.getBuffer(LyXfilename)); - return; - case 3: // Cancel: Do nothing - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } - } - - // Check if a LyX document by the same root exists in filesystem - FileInfo f(LyXfilename, true); - if (f.exist() && !AskQuestion(_("A document by the name"), - MakeDisplayPath(LyXfilename), - _("already exists. Overwrite?"))) { - owner->getMiniBuffer()->Set(_("Canceled.")); - return; - } - - // loads document - owner->getMiniBuffer()->Set(_("Importing LinuxDoc file"), - MakeDisplayPath(filename), "..."); +static +bool doImportNoweb(BufferView *, string const & filename) +{ + ImportNoweb myImport(filename); + Buffer * openbuf = myImport.run(); + return openbuf != NULL; +} +static +bool doImportLinuxDoc(BufferView *, string const & filename) +{ // run sgml2lyx string tmp = lyxrc.linuxdoc_to_lyx_command + filename; - Systemcalls one; + Systemcalls one; Buffer * buf = 0; int result = one.startscript(Systemcalls::System, tmp); @@ -3129,14 +2993,9 @@ void LyXFunc::doImportLinuxDoc() string filename = ChangeExtension(filename, ".lyx", false); // File was generated without problems. Load it. buf = bufferlist.loadLyXFile(filename); - owner->view()->buffer(buf); - owner->getMiniBuffer()->Set(_("LinuxDoc file "), - MakeDisplayPath(filename), - _("imported.")); - } else { - owner->getMiniBuffer()->Set(_("Could not import LinuxDoc file"), - MakeDisplayPath(filename)); } + + return result == 0; } @@ -3192,6 +3051,36 @@ void LyXFunc::MenuInsertLyXFile(string const & filen) } } +void LyXFunc::doImport(string const & argument) +{ + string type; + string filename = split(argument, type, ' '); + lyxerr.debug() << "LyXFunc::doImport: " << type + << " file: " << filename << endl; + + if (type == "latex") + doImportHelper(filename, + _("Select LaTeX file to import"), "*.tex", + doImportLaTeX); + else if (type == "ascii") + doImportHelper(filename, + _("Select ASCII file to import"), "*.txt", + doImportASCIIasLines); + else if (type == "asciiparagraph") + doImportHelper(filename, + _("Select ASCII file to import"), "*.txt", + doImportASCIIasParagraphs); + else if (type == "noweb") + doImportHelper(filename, + _("Select NoWeb file to import"), "*.nw", + doImportNoweb); + else if (type == "linuxdoc") + doImportHelper(filename, + _("Select LinuxDoc file to import"), "*.doc", + doImportLinuxDoc); + else + setErrorMessage(string(N_("Unknown import type: ")) + type); +} void LyXFunc::reloadBuffer() { diff --git a/src/lyxfunc.h b/src/lyxfunc.h index fb88aa2976..24a0456f17 100644 --- a/src/lyxfunc.h +++ b/src/lyxfunc.h @@ -110,13 +110,9 @@ private: void MenuOpen(); /// - void doImportLaTeX(bool); - - /// - void doImportASCII(bool); - - /// - void doImportLinuxDoc(); + void doImport(string const &); + void doImportHelper(string const &, string const &, string const &, + bool func(BufferView *, string const &) ); /// void MenuInsertLyXFile(string const &);