X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetERT.cpp;h=25665471038b733c7c063e838b72a380136902f4;hb=b9116e8b81f55ee795ea444ee02ff921bf82606a;hp=80b3af3890b0d0025f454424c7aff5cfdc1c210d;hpb=0b5fe5494b3d724d369abe7f5c6505c65dd01d0c;p=lyx.git diff --git a/src/insets/InsetERT.cpp b/src/insets/InsetERT.cpp index 80b3af3890..2566547103 100644 --- a/src/insets/InsetERT.cpp +++ b/src/insets/InsetERT.cpp @@ -17,30 +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 "LyXRC.h" #include "LyXAction.h" -#include "MetricsInfo.h" #include "OutputParams.h" #include "ParagraphParameters.h" #include "Paragraph.h" #include "TextClass.h" -#include "graphics/PreviewImage.h" - -#include "insets/RenderPreview.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 @@ -50,43 +45,36 @@ using namespace lyx::support; namespace lyx { InsetERT::InsetERT(Buffer * buf, CollapseStatus status) - : InsetCollapsable(buf), preview_(new RenderPreview(this)) + : InsetCollapsible(buf) { status_ = status; } -InsetERT::InsetERT(InsetERT const & other) : InsetCollapsable(other) -{ - operator=(other); -} +// 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 & other) + +InsetERT & InsetERT::operator=(InsetERT const & that) { - if (this == &other) + if (&that == this) return *this; - InsetCollapsable::operator=(other); - buffer_ = other.buffer_; - preview_.reset(new RenderPreview(*other.preview_, this)); - + tempfile_.reset(); return *this; } -InsetERT::~InsetERT() -{ - hideDialogs("ert", this); -} - - void InsetERT::write(ostream & os) const { os << "ERT" << "\n"; - InsetCollapsable::write(os); + InsetCollapsible::write(os); } -int InsetERT::plaintext(odocstream & os, OutputParams const & rp) const +int InsetERT::plaintext(odocstringstream & os, + OutputParams const & rp, size_t max_length) const { if (!rp.inIndexEntry) // do not output TeX code @@ -95,7 +83,7 @@ int InsetERT::plaintext(odocstream & os, OutputParams const & rp) const ParagraphList::const_iterator par = paragraphs().begin(); ParagraphList::const_iterator end = paragraphs().end(); - while (par != end) { + 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); @@ -140,32 +128,95 @@ int InsetERT::docbook(odocstream & os, OutputParams const &) const void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd) { - switch (cmd.action) { - case LFUN_INSET_MODIFY: { - setStatus(cur, string2params(to_utf8(cmd.argument()))); + 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_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: - 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_INSET_MODIFY: - status.setEnabled(true); + 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; + } + //fall through + default: - return InsetCollapsable::getStatus(cur, cmd, status); + return InsetCollapsible::getStatus(cur, cmd, status); } } +bool InsetERT::editable() const +{ + if (tempfile_) + return false; + return InsetCollapsible::editable(); +} + + +bool InsetERT::descendable(BufferView const & bv) const +{ + if (tempfile_) + return false; + return InsetCollapsible::descendable(bv); +} + + docstring const InsetERT::buttonLabel(BufferView const & bv) const { if (decoration() == InsetLayout::CLASSIC) @@ -175,15 +226,7 @@ docstring const InsetERT::buttonLabel(BufferView const & bv) const } -bool InsetERT::showInsetDialog(BufferView * bv) const -{ - bv->showDialog("ert", params2string(status(*bv)), - const_cast(this)); - return true; -} - - -InsetCollapsable::CollapseStatus InsetERT::string2params(string const & in) +InsetCollapsible::CollapseStatus InsetERT::string2params(string const & in) { if (in.empty()) return Collapsed; @@ -211,89 +254,4 @@ docstring InsetERT::xhtml(XHTMLStream &, OutputParams const &) const return docstring(); } - -bool InsetERT::previewState(BufferView * bv) const -{ - if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON) { - graphics::PreviewImage const * pimage = - preview_->getPreviewImage(bv->buffer()); - return pimage && pimage->image(); - } - return false; -} - - -void InsetERT::addPreview(DocIterator const & inset_pos, - graphics::PreviewLoader & ploader) const -{ - preparePreview(inset_pos); -} - - -void InsetERT::preparePreview(DocIterator const & pos) const -{ - odocstringstream str; - OutputParams runparams(&pos.buffer()->params().encoding()); - latex(str, runparams); - docstring const snippet = str.str(); - LYXERR(Debug::MACROS, "Preview snippet: " << snippet); - preview_->addPreview(snippet, *pos.buffer()); -} - - -void InsetERT::reloadPreview(DocIterator const & pos) const -{ - preparePreview(pos); - preview_->startLoading(*pos.buffer()); -} - - -bool InsetERT::notifyCursorLeaves(Cursor const & old, Cursor & cur) -{ - reloadPreview(old); - cur.updateFlags(Update::Force); - return InsetCollapsable::notifyCursorLeaves(old, cur); -} - - -void InsetERT::draw(PainterInfo & pi, int x, int y) const -{ - use_preview_ = previewState(pi.base.bv); - - if (use_preview_) { - // one pixel gap in front - preview_->draw(pi, x + 1, y); - setPosCache(pi, x, y); - return; - } - InsetCollapsable::draw(pi, x, y); -} - - -Inset * InsetERT::editXY(Cursor & cur, int x, int y) -{ - if (use_preview_) { - edit(cur, true); - return this; - } - return InsetCollapsable::editXY(cur, x, y); -} - - -void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const -{ - if (previewState(mi.base.bv)) { - preview_->metrics(mi, dim); - // insert a one pixel gap in front of the formula - dim.wid += 1; - // Cache the inset dimension. - setDimCache(mi, dim); - Dimension dim_dummy = dim; - MetricsInfo mi_dummy = mi; - InsetCollapsable::metrics(mi_dummy, dim_dummy); - return; - } - InsetCollapsable::metrics(mi, dim); -} - } // namespace lyx