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
This commit is contained in:
Jean-Marc Lasgouttes 2000-04-28 11:18:04 +00:00
parent c3ac97d951
commit 8d478c5e29
11 changed files with 218 additions and 253 deletions

View File

@ -1,3 +1,33 @@
2000-04-27 Claus Hentschel <claus.hentschel@mbau.fh-hannover.de>
* 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 <poenitz@mathematik.tu-chemnitz.de>
* 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 <format>'
2000-04-27 Lars Gullik Bjønnes <larsbj@lyx.org>
* src/lyx_gui.C (create_forms): small oneliner from Garst to have

2
NEWS
View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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;
}

View File

@ -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() {

View File

@ -630,3 +630,8 @@ void LyXGUI::regBuf(Buffer * b)
{
lyxViews->view()->buffer(b);
}
LyXView * LyXGUI::getLyXView() const
{
return lyxViews;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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()
{

View File

@ -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 &);