X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetERT.cpp;h=25665471038b733c7c063e838b72a380136902f4;hb=b9116e8b81f55ee795ea444ee02ff921bf82606a;hp=d6544cd7cb39d98cff3b3715d011691aee3fa7a5;hpb=d6f1915684328c6e3fe61c6eef8846b5cabec334;p=lyx.git diff --git a/src/insets/InsetERT.cpp b/src/insets/InsetERT.cpp index d6544cd7cb..2566547103 100644 --- a/src/insets/InsetERT.cpp +++ b/src/insets/InsetERT.cpp @@ -3,8 +3,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna - * \author Lars Gullik Bjønnes + * \author Jürgen Vigna + * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ @@ -17,24 +17,25 @@ #include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" +#include "CutAndPaste.h" #include "DispatchResult.h" +#include "Format.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "Language.h" #include "Layout.h" #include "Lexer.h" #include "LyXAction.h" -#include "MetricsInfo.h" +#include "OutputParams.h" #include "ParagraphParameters.h" #include "Paragraph.h" #include "TextClass.h" -#include "frontends/alert.h" -#include "frontends/Application.h" - -#include "support/debug.h" +#include "support/docstream.h" +#include "support/FileName.h" #include "support/gettext.h" #include "support/lstrings.h" +#include "support/TempFile.h" #include @@ -43,41 +44,63 @@ using namespace lyx::support; namespace lyx { -InsetERT::InsetERT(Buffer const & buf, CollapseStatus status) - : InsetCollapsable(buf) +InsetERT::InsetERT(Buffer * buf, CollapseStatus status) + : InsetCollapsible(buf) { status_ = status; } -InsetERT::~InsetERT() +// Do not copy the temp file on purpose: If a copy of an inset which is +// currently being edited is made, then we simply copy the current contents. +InsetERT::InsetERT(InsetERT const & that) : InsetCollapsible(that) +{} + + +InsetERT & InsetERT::operator=(InsetERT const & that) { - hideDialogs("ert", this); + if (&that == this) + return *this; + tempfile_.reset(); + return *this; } void InsetERT::write(ostream & os) const { os << "ERT" << "\n"; - InsetCollapsable::write(os); + InsetCollapsible::write(os); } -docstring InsetERT::editMessage() const +int InsetERT::plaintext(odocstringstream & os, + OutputParams const & rp, size_t max_length) const { - return _("Opened ERT Inset"); -} - - -int InsetERT::latex(odocstream & os, OutputParams const & op) const -{ - return InsetCollapsable::latex(os, op); -} + if (!rp.inIndexEntry) + // do not output TeX code + return 0; + ParagraphList::const_iterator par = paragraphs().begin(); + ParagraphList::const_iterator end = paragraphs().end(); -int InsetERT::plaintext(odocstream &, OutputParams const &) const -{ - return 0; // do not output TeX code + while (par != end && os.str().size() <= max_length) { + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + char_type const c = par->getChar(i); + // output the active characters + switch (c) { + case '|': + case '!': + case '@': + os.put(c); + break; + default: + break; + } + } + ++par; + } + return 0; } @@ -105,87 +128,105 @@ int InsetERT::docbook(odocstream & os, OutputParams const &) const void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd) { - BufferParams const & bp = cur.buffer().params(); - Layout const layout = bp.documentClass().plainLayout(); - //lyxerr << "\nInsetERT::doDispatch (begin): cmd: " << cmd << endl; - switch (cmd.action) { - case LFUN_QUOTE_INSERT: { - // We need to bypass the fancy quotes in Text - FuncRequest f(LFUN_SELF_INSERT, "\""); - dispatch(cur, f); + switch (cmd.action()) { + case LFUN_INSET_EDIT: { + cur.push(*this); + text().selectAll(cur); + string const format = + cur.buffer()->params().documentClass().outputFormat(); + string const ext = theFormats().extension(format); + tempfile_.reset(new TempFile("ert_editXXXXXX." + ext)); + FileName const tempfilename = tempfile_->name(); + string const name = tempfilename.toFilesystemEncoding(); + ofdocstream os(name.c_str()); + os << cur.selectionAsString(false); + os.close(); + // Since we lock the inset while the external file is edited, + // we need to move the cursor outside and clear any selection inside + cur.clearSelection(); + cur.pop(); + cur.leaveInset(*this); + theFormats().edit(buffer(), tempfilename, format); break; } - case LFUN_INSET_MODIFY: { - setStatus(cur, string2params(to_utf8(cmd.argument()))); + case LFUN_INSET_END_EDIT: { + FileName const tempfilename = tempfile_->name(); + docstring const s = tempfilename.fileContents("UTF-8"); + cur.recordUndoInset(this); + cur.push(*this); + text().selectAll(cur); + cap::replaceSelection(cur); + cur.text()->insertStringAsLines(cur, s, cur.current_font); + // FIXME it crashes without this + cur.fixIfBroken(); + tempfile_.reset(); + cur.pop(); break; } + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "ert") { + cur.recordUndoInset(this); + setStatus(cur, string2params(to_utf8(cmd.argument()))); + break; + } + //fall-through default: - // Force any new text to latex_language - // FIXME: This should not be necessary but - // new paragraphs that are created by pressing enter at the - // start of an existing paragraph get the buffer language - // and not latex_language, so we take this brute force - // approach. - cur.current_font.fontInfo() = layout.font; - cur.real_current_font.fontInfo() = layout.font; - InsetCollapsable::doDispatch(cur, cmd); + InsetCollapsible::doDispatch(cur, cmd); break; } + } bool InsetERT::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { - switch (cmd.action) { - case LFUN_CLIPBOARD_PASTE: - case LFUN_INSET_MODIFY: - case LFUN_PASTE: - case LFUN_PRIMARY_SELECTION_PASTE: - case LFUN_QUOTE_INSERT: + switch (cmd.action()) { + case LFUN_INSET_EDIT: + status.setEnabled(tempfile_ == 0); + return true; + case LFUN_INSET_END_EDIT: + status.setEnabled(tempfile_ != 0); + return true; + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "ert") { status.setEnabled(true); return true; - - // this one is difficult to get right. As a half-baked - // solution, we consider only the first action of the sequence - case LFUN_COMMAND_SEQUENCE: { - // argument contains ';'-terminated commands - string const firstcmd = token(to_utf8(cmd.argument()), ';', 0); - FuncRequest func(lyxaction.lookupFunc(firstcmd)); - func.origin = cmd.origin; - return getStatus(cur, func, status); } + //fall through - default: - return InsetCollapsable::getStatus(cur, cmd, status); + default: + return InsetCollapsible::getStatus(cur, cmd, status); } } -void InsetERT::setButtonLabel() +bool InsetERT::editable() const { - if (decoration() == InsetLayout::CLASSIC) - setLabel(isOpen() ? _("ERT") : getNewLabel(_("ERT"))); - else - setLabel(getNewLabel(_("ERT"))); + if (tempfile_) + return false; + return InsetCollapsible::editable(); } -bool InsetERT::insetAllowed(InsetCode /* code */) const +bool InsetERT::descendable(BufferView const & bv) const { - return false; + if (tempfile_) + return false; + return InsetCollapsible::descendable(bv); } -bool InsetERT::showInsetDialog(BufferView * bv) const +docstring const InsetERT::buttonLabel(BufferView const & bv) const { - bv->showDialog("ert", params2string(status()), - const_cast(this)); - return true; + if (decoration() == InsetLayout::CLASSIC) + return isOpen(bv) ? _("ERT") : getNewLabel(_("ERT")); + else + return getNewLabel(_("ERT")); } -InsetCollapsable::CollapseStatus InsetERT::string2params(string const & in) +InsetCollapsible::CollapseStatus InsetERT::string2params(string const & in) { if (in.empty()) return Collapsed; @@ -208,4 +249,9 @@ string InsetERT::params2string(CollapseStatus status) } +docstring InsetERT::xhtml(XHTMLStream &, OutputParams const &) const +{ + return docstring(); +} + } // namespace lyx