Fix bug #7916: Undo warning message when inserting plaintext file

LFUN_INSERT_PLAINTEXT is handled in GuiView because it might need to ask for a filename. But if the filename is given as a paramater we can handle it in BufferView immediately. Also, when we've asked for the filename in GuiView we should dispatch the LFUN to BufferView in order to properly use the Undo mechanism.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40377 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Vincent van Ravesteijn 2011-12-05 13:12:57 +00:00
parent a0d8157891
commit a35e512e90
2 changed files with 59 additions and 50 deletions

View File

@ -1034,9 +1034,18 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
// buffer clean/dirty status by itself.
flag.setEnabled(!buffer_.isReadonly() && buffer_.undo().hasRedoStack());
break;
case LFUN_FILE_INSERT:
case LFUN_FILE_INSERT_PLAINTEXT_PARA:
case LFUN_FILE_INSERT_PLAINTEXT:
case LFUN_FILE_INSERT_PLAINTEXT: {
bool enabled = true;
docstring const fname = cmd.argument();
if (!FileName::isAbsolute(to_utf8(fname))) {
flag.message(_("Absolute filename expected."));
return false;
}
flag.setEnabled(enabled && cur.inTexted());
break;
}
case LFUN_FILE_INSERT:
case LFUN_BOOKMARK_SAVE:
// FIXME: Actually, these LFUNS should be moved to Text
flag.setEnabled(cur.inTexted());
@ -1937,6 +1946,16 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
cur.setCurrentFont();
dr.forceBufferUpdate();
}
}
case LFUN_FILE_INSERT_PLAINTEXT_PARA:
case LFUN_FILE_INSERT_PLAINTEXT: {
bool const as_paragraph = (act == LFUN_FILE_INSERT_PLAINTEXT_PARA);
string const fname = to_utf8(cmd.argument());
if (!FileName::isAbsolute(fname))
dr.setMessage(_("Absolute filename expected."));
else
insertPlaintextFile(FileName(fname), as_paragraph);
break;
}

View File

@ -1867,6 +1867,15 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
enable = !(lyxrc.forward_search_dvi.empty() && lyxrc.forward_search_pdf.empty());
break;
case LFUN_FILE_INSERT_PLAINTEXT:
case LFUN_FILE_INSERT_PLAINTEXT_PARA: {
if (BufferView const * bv = documentBufferView())
enable = bv->cursor().inTexted();
else
enable = false;
break;
}
default:
return false;
}
@ -2228,49 +2237,6 @@ void GuiView::insertLyXFile(docstring const & fname)
}
void GuiView::insertPlaintextFile(docstring const & fname,
bool asParagraph)
{
BufferView * bv = documentBufferView();
if (!bv)
return;
if (!fname.empty() && !FileName::isAbsolute(to_utf8(fname))) {
message(_("Absolute filename expected."));
return;
}
// FIXME UNICODE
FileName filename(to_utf8(fname));
if (!filename.empty()) {
bv->insertPlaintextFile(filename, asParagraph);
return;
}
FileDialog dlg(qt_("Select file to insert"), (asParagraph ?
LFUN_FILE_INSERT_PLAINTEXT_PARA : LFUN_FILE_INSERT_PLAINTEXT));
FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()),
QStringList(qt_("All Files (*)")));
if (result.first == FileDialog::Later)
return;
// FIXME UNICODE
filename.set(fromqstr(result.second));
// check selected filename
if (filename.empty()) {
// emit message signal.
message(_("Canceled."));
return;
}
bv->insertPlaintextFile(filename, asParagraph);
}
bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
{
FileName fname = b.fileName();
@ -3355,13 +3321,37 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
insertLyXFile(cmd.argument());
break;
case LFUN_FILE_INSERT_PLAINTEXT_PARA:
insertPlaintextFile(cmd.argument(), true);
break;
case LFUN_FILE_INSERT_PLAINTEXT:
insertPlaintextFile(cmd.argument(), false);
case LFUN_FILE_INSERT_PLAINTEXT_PARA: {
bool const as_paragraph = (cmd.action() == LFUN_FILE_INSERT_PLAINTEXT_PARA);
string const fname = to_utf8(cmd.argument());
if (!fname.empty() && !FileName::isAbsolute(fname)) {
dr.setMessage(_("Absolute filename expected."));
break;
}
FileName filename(fname);
if (fname.empty()) {
FileDialog dlg(qt_("Select file to insert"), (as_paragraph ?
LFUN_FILE_INSERT_PLAINTEXT_PARA : LFUN_FILE_INSERT_PLAINTEXT));
FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()),
QStringList(qt_("All Files (*)")));
if (result.first == FileDialog::Later || result.second.isEmpty()) {
dr.setMessage(_("Canceled."));
break;
}
filename.set(fromqstr(result.second));
}
if (bv) {
FuncRequest const new_cmd(cmd, filename.absoluteFilePath());
bv->dispatch(new_cmd, dr);
}
break;
}
case LFUN_BUFFER_RELOAD: {
LASSERT(doc_buffer, break);